Пытался понять, как работает контекст WinApi - PullRequest
0 голосов
/ 06 августа 2020

Я пишу код и как он работает, но не знаю почему. Может кто-нибудь объяснить мне, пожалуйста.

Я пытался отображать изображения камня go при каждом щелчке мышью. Главный вопрос: почему CreateCompatibleDC не стирает hdcMemSurface. Извините за плохой Engli sh. Я новичок в stackoverflow.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static POINT pt{};
    static bool DrawBlackRock = false, DrawWhiteRock = false;
    switch (message)
    {
    case WM_CREATE:
    {
        const HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
        images[0] = loadImage(TEXT("gameboard.bmp"), hInstance);
        images[1] = loadImage(TEXT("black.bmp"), hInstance);
        images[2] = loadImage(TEXT("white.bmp"), hInstance);
        SetWindowPos(hWnd, HWND_TOP, NULL, NULL, images[0].width + 15, images[0].height + 57, SWP_NOMOVE);

    }
    case WM_COMMAND:
    {
        int wmId = LOWORD(wParam);
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
    }
    break;
    case WM_LBUTTONDOWN:
    {
        DrawBlackRock = !(DrawBlackRock);
        pt.x = LOWORD(lParam);
        pt.y = HIWORD(lParam);
        InvalidateRect(hWnd, NULL, TRUE);
        RedrawWindow(hWnd, NULL, 0, RDW_INVALIDATE);
        break;
    }
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
        static HDC hdcMemSurface = CreateCompatibleDC(hdc);
        static HDC hdcRock = CreateCompatibleDC(hdc);
        SelectObject(hdcMemSurface, images[0].hBitmap);
        BitBlt(hdc, 0, 0, images[0].width, images[0].height, hdcMemSurface, 0, 0, SRCCOPY);
        if (DrawBlackRock && (!DrawWhiteRock))
        {
            SelectObject(hdcRock, images[1].hBitmap);
            BitBlt(hdc, pt.x, pt.y, images[1].width, images[1].height, hdcRock, 0, 0, SRCCOPY);//создать контекст с boardstate
        }
        //SelectObject(hdcMemSurface, hdc);
        BitBlt(hdcMemSurface, 0, 0, images[0].width, images[0].height, hdc, 0, 0, SRCCOPY);
        //ValidateRect(hWnd, NULL);
        EndPaint(hWnd, &ps);
        break;
    }
    break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

РЕДАКТИРОВАТЬ: добавить несколько изображений и добавить некоторые детали Я недооцениваю все, кроме:

    static HDC hdcMemSurface = CreateCompatibleDC(hdc);
    static HDC hdcRock = CreateCompatibleDC(hdc);

Если я позвоню CreateCompabilityDC, как только он перестанет работать правильно и несмотря на stati c erase hdcMemSurface и hdcRock, мне нужно вызывать его каждый раз в WM_PAINT, это должно привести к стиранию hdcMemSurface и hdcRock, но не ведут. Меня это расстраивает.

введите описание изображения здесь

введите описание изображения здесь

1 Ответ

0 голосов
/ 06 августа 2020

Главный вопрос, почему CreateCompatibleD C не стирает hdcMemSurface.

Когда вам больше не нужна память D C, вызовите функцию DeleteD C . Мы рекомендуем вам позвонить в DeleteD C, чтобы удалить D C. Однако вы также можете вызвать DeleteObject с HD C, чтобы удалить D C.

Обратитесь: CreateCompatibleD C

Другая причина заключается в том, что объявленный объект bmp имеет значение c, и каждый раз, когда вы используете BitBlt, на игровое поле будет добавляться новый BlackRock / WhiteRock.

Некоторый код:

case WM_LBUTTONDOWN:
    {
        DrawBlackRock = !(DrawBlackRock);
        if (DrawBlackRock)
        {
            DrawWhiteRock = TRUE;
        }      
        pt.x = LOWORD(lParam);
        pt.y = HIWORD(lParam);
        InvalidateRect(hWnd, NULL, TRUE);
        RedrawWindow(hWnd, NULL, 0, RDW_INVALIDATE);
        break;
    }
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
        HDC hdcMemSurface = CreateCompatibleDC(hdc);
        HDC hdcRock = CreateCompatibleDC(hdc);

        SelectObject(hdcMemSurface, images[0].hBitmap);
        BitBlt(hdc, 0, 0, images[0].width, images[0].height, hdcMemSurface, 0, 0, SRCCOPY);
        if (DrawBlackRock && DrawWhiteRock)
        {
            SelectObject(hdcRock, images[1].hBitmap);
            BitBlt(hdc, pt.x, pt.y, images[1].width, images[1].height, hdcRock, 0, 0, SRCCOPY);
        }
        else if(DrawWhiteRock && !DrawBlackRock)
        {
            DrawWhiteRock = FALSE;
            SelectObject(hdcRock, images[2].hBitmap);
            BitBlt(hdc, pt.x, pt.y, images[2].width, images[2].height, hdcRock, 0, 0, SRCCOPY);
        }          
        BitBlt(hdcMemSurface, 0, 0, images[0].width, images[0].height, hdc, 0, 0, SRCCOPY);

        DeleteObject(hdcMemSurface);
        DeleteObject(hdcRock);
        ReleaseDC(NULL, hdc);
        //ValidateRect(hWnd, NULL);
        EndPaint(hWnd, &ps);
    }
    break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...