forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Помогите разобрать функцию построчно (http://forum.boolean.name/showthread.php?t=15194)

Mark Castle 30.07.2011 00:43

Помогите разобрать функцию построчно
 
Господа! Я решил сделать небольшую програмку, которая будет создавать скриншоты.
---Цель---
На примере этой програмки расчехлится в АПИлках, и создать утилиту
для удобного сохранения скринов.
---Актуальность---
Вот, сижу я и играю во "вьетконг". тут бац - читер. надо заскринить.
заместо того, чтобы нажимать "принт скрин", а потом открывать
"пэинт" и сохранять, я нажму какую-то клавишу, и скрин сохранится
в какую-то директорию.
---Сабж---
так, как я новичек, и не очень еще во всем этом разобрался, прошу объяснить мне найденную мной функцию, которая делает скрин и сохраняет его, если можно, построчно. Буду крайне благодарен!!!
Заранее спасибо.
Код:

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);
}


IGR 30.07.2011 05:43

Ответ: Помогите разобрать функцию построчно
 
пример апилок выбрал неудачный немного !! ;)
Есть функа, компиль, юзай !!
Что неработает ??

Mark Castle 30.07.2011 16:19

Ответ: Помогите разобрать функцию построчно
 
да в том-то и дело, что все работает, просто, будучи новичков в этом деле, и совсем не зная, ни функций, ничего, я не очень понял КАК оно работает.

falcon 30.07.2011 23:29

Ответ: Помогите разобрать функцию построчно
 
если тебе не понятно что тут происходит, настоятельно советую почитать книжки по С\С++, ибо кроме заполнения структур да вызова ф-ций тут ничего магического нету)
если же происходящее тебе понятно, но не понятны вызываемые ф-ции, то опять же лучше обратись к официальной документации. Люди специально для таких целей её создавали, и описывали "построчно" что и зачем сделано.

Mark Castle 31.07.2011 00:47

Ответ: Помогите разобрать функцию построчно
 
Хорошо, у меня еще есть один вопрос: я вызываю окно выбора директории ф-ей 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;
}

Помогите разобраться, в чем проблема.
Заранее спасибо.

Mark Castle 31.07.2011 04:07

Ответ: Помогите разобрать функцию построчно
 
РАЗОБРАЛСЯ.


Часовой пояс GMT +4, время: 08:36.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot