|
30.07.2011, 00:43
|
#1
|
Знающий
Регистрация: 04.10.2008
Адрес: Киев
Сообщений: 230
Написано 3 полезных сообщений (для 3 пользователей)
|
Помогите разобрать функцию построчно
Господа! Я решил сделать небольшую програмку, которая будет создавать скриншоты.
---Цель---
На примере этой програмки расчехлится в АПИлках, и создать утилиту
для удобного сохранения скринов.
---Актуальность---
Вот, сижу я и играю во "вьетконг". тут бац - читер. надо заскринить.
заместо того, чтобы нажимать "принт скрин", а потом открывать
"пэинт" и сохранять, я нажму какую-то клавишу, и скрин сохранится
в какую-то директорию.
---Сабж---
так, как я новичек, и не очень еще во всем этом разобрался, прошу объяснить мне найденную мной функцию, которая делает скрин и сохраняет его, если можно, построчно. Буду крайне благодарен!!!
Заранее спасибо.
void CaptureScreen(HWND window)
{
//Получаем прямоугольную область экрана
RECT windowRect;
GetWindowRect(window, &windowRect);
//Размеры битмэпа
int bitmap_dx = windowRect.right-windowRect.left;
int bitmap_dy = windowRect.bottom-windowRect.top;
BITMAPINFOHEADER bmpInfoHeader;
BITMAPFILEHEADER bmpFileHeader;
BITMAP* pBitmap;
bmpFileHeader.bfType = 0x4d42;
bmpFileHeader.bfSize = 0;
bmpFileHeader.bfReserved1 = 0;
bmpFileHeader.bfReserved2 = 0;
bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmpInfoHeader.biSize = sizeof(bmpInfoHeader);
bmpInfoHeader.biWidth = bitmap_dx;
bmpInfoHeader.biHeight = bitmap_dy;
bmpInfoHeader.biPlanes = 1;
bmpInfoHeader.biBitCount = 24;
bmpInfoHeader.biCompression = BI_RGB;
bmpInfoHeader.biSizeImage = bitmap_dx*bitmap_dy*(24/8);
bmpInfoHeader.biXPelsPerMeter = 0;
bmpInfoHeader.biYPelsPerMeter = 0;
bmpInfoHeader.biClrUsed = 0;
bmpInfoHeader.biClrImportant = 0;
BITMAPINFO info;
info.bmiHeader = bmpInfoHeader;
BYTE* memory;
HDC winDC = GetWindowDC(window);
HDC bmpDC = CreateCompatibleDC(winDC);
//Создаем битмэп
HBITMAP bitmap = CreateDIBSection(winDC, &info, DIB_RGB_COLORS, (void**)&memory, NULL, 0);
SelectObject(bmpDC, bitmap);//Выбираем в контекст битмэп
BitBlt(bmpDC, 0, 0, bitmap_dx, bitmap_dy, winDC, 0, 0, SRCCOPY);
ReleaseDC(window, winDC);
OPENFILENAME ofn;//Указатель на структуру с данными инициализации диалогового окна
char strFilter[] = "Файлы данных *.bmp\0";
char strFileName[MAX_PATH] = "";
memset(&ofn, 0, sizeof(OPENFILENAME));//Обнуление ofn
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = window;
ofn.lpstrFilter = strFilter;
ofn.lpstrFile = strFileName;//Буфер для имени файла
ofn.nMaxFile = MAX_PATH;//Размер файла
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT;
strcpy(strFileName, ofn.lpstrFile);
GetSaveFileName(&ofn); //MessageBox(hwnd,"Невозможно сохранить файл","О программе...",MB_ICONINFORMATION);
HANDLE hFile = CreateFile(
ofn.lpstrFile,
GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
return;
DWORD dwWritten = 0;
WriteFile(hFile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
WriteFile(hFile, &bmpInfoHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
WriteFile(hFile, memory, bmpInfoHeader.biSizeImage, &dwWritten, NULL);
CloseHandle(hFile);
}
__________________
...мама я больше не буду!
|
(Offline)
|
|
30.07.2011, 05:43
|
#2
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Ответ: Помогите разобрать функцию построчно
пример апилок выбрал неудачный немного !!
Есть функа, компиль, юзай !!
Что неработает ??
|
(Offline)
|
|
30.07.2011, 16:19
|
#3
|
Знающий
Регистрация: 04.10.2008
Адрес: Киев
Сообщений: 230
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: Помогите разобрать функцию построчно
да в том-то и дело, что все работает, просто, будучи новичков в этом деле, и совсем не зная, ни функций, ничего, я не очень понял КАК оно работает.
__________________
...мама я больше не буду!
|
(Offline)
|
|
30.07.2011, 23:29
|
#4
|
Разработчик
Регистрация: 12.07.2008
Сообщений: 523
Написано 196 полезных сообщений (для 470 пользователей)
|
Ответ: Помогите разобрать функцию построчно
если тебе не понятно что тут происходит, настоятельно советую почитать книжки по С\С++, ибо кроме заполнения структур да вызова ф-ций тут ничего магического нету)
если же происходящее тебе понятно, но не понятны вызываемые ф-ции, то опять же лучше обратись к официальной документации. Люди специально для таких целей её создавали, и описывали "построчно" что и зачем сделано.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
31.07.2011, 00:47
|
#5
|
Знающий
Регистрация: 04.10.2008
Адрес: Киев
Сообщений: 230
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: Помогите разобрать функцию построчно
Хорошо, у меня еще есть один вопрос: я вызываю окно выбора директории ф-ей SHBrowseForFolder(&bI);
Затем ф-ей SHGetPathFromIDList(lists, path); пытаюсь выкурить папку, на что во время выполнения программы получаю:
Unhandled exception at 0x7ca34d07 in ScreenMaster.exe: 0xC0000005: Access violation writing location 0xcccccccc.
Привожу всю функцию разбора сообщений:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND desktop;
PAINTSTRUCT _ps;
BROWSEINFO bI;
bI.hwndOwner=hWnd;
bI.iImage=NULL;
bI.lParam=NULL;
bI.lpszTitle=TEXT("abcd");
bI.lpfn=NULL;
bI.pidlRoot=NULL;
bI.pszDisplayName=NULL;
bI.ulFlags=BIF_RETURNONLYFSDIRS;
int pos;
switch (message)
{
case WM_COMMAND:
LPCITEMIDLIST lists;
LPTSTR path;
path=TEXT("C:\\");
if (wParam==ID_BUTTONSRC)
{
lists = SHBrowseForFolder(&bI);
if (lists!=0)
{
SHGetPathFromIDList(lists, path);
}
}
break;
case WM_VSCROLL:
if (wParam==SB_ENDSCROLL)
{
dc=BeginPaint(hWnd,&_ps);
pos=SendMessage(hwndTrack,TBM_GETPOS,TRUE,0);
}
break;
case WM_PAINT:
dc=BeginPaint(hWnd,&_ps);
Rectangle(dc,0,0,500,350);
TextOut(dc,355,10,TEXT("Quality"),7);
TextOut(dc,270,35,TEXT("Format"),6);
break;
case WM_LBUTTONDOWN:
desktop=GetDesktopWindow();
CaptureScreen(desktop);
break;
case WM_DESTROY:
PostQuitMessage(0); // выходим их программы
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Помогите разобраться, в чем проблема.
Заранее спасибо.
__________________
...мама я больше не буду!
|
(Offline)
|
|
31.07.2011, 04:07
|
#6
|
Знающий
Регистрация: 04.10.2008
Адрес: Киев
Сообщений: 230
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: Помогите разобрать функцию построчно
РАЗОБРАЛСЯ.
__________________
...мама я больше не буду!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:29.
|