winapi — BitBlt не обновляет WM_PAINT в Windows C ++ API

У меня есть следующая функция для рисования загруженного растрового изображения в окне.

void OnPaint(HWND hwnd) {
PAINTSTRUCT     ps;
HDC             hdc;
BITMAP          bitmap;
HDC             hdcMem;
HGDIOBJ         oldBitmap;

hdc = BeginPaint(hwnd, &ps);

hdcMem = CreateCompatibleDC(hdc);
HBITMAP bmp = mainBitmap;
oldBitmap = SelectObject(hdcMem, mainBitmap);

GetObject(bmp, sizeof(bitmap), &bitmap);

x += 64;
RECT rect;
rect.left = x;
rect.top = 0;
rect.right = x+64;
rect.bottom = 64;

HBITMAP hBmp = CreateCompatibleBitmap(
hdc,                    // Handle to a device context
rect.right - rect.left, // Bitmap width
rect.bottom - rect.top  // Bitmap height
);

BitBlt(
hdc,                    // Destination rectangle context handle
0,                      // Destination rectangle x-coordinate
0,                      // Destination rectangle y-coordinate
rect.right - rect.left, // Destination rectangle width
rect.bottom - rect.top, // Destination rectangle height
hdcMem,                 // A handle to the source device context
rect.left,              // Source rectangle x-coordinate
rect.top,               // Source rectangle y-coordinate
SRCCOPY                 // Raster-operation code
);

SelectObject(hdcMem, oldBitmap);
DeleteDC(hdcMem);

EndPaint(hwnd, &ps);
}

И у меня есть следующее изображение, загруженное в HBITMAP mainBitmap:

эльф

Изображение рисуется, когда окно открывается успешно, и я вижу первый значок в растровом изображении спрайта (желтый захват), но моя проблема в том, когда я нажимаю 'C' чтобы перекрасить окно, изображение не меняется на следующий значок в изображении спрайта.

Вещи, которые я знаю

  • При инициализации, x = 64;

  • Каждый раз, когда я нажимаю 'C'Краска называется. (Подтверждено в визуальном
    Studio Debugger)

  • х увеличивается на 64 каждый раз OnPaint называется.

Почему графика не меняется?


Вот мой WindowsProc функция для обработки WM_PAINT сообщение:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
HANDLE_MSG(hwnd, WM_PAINT, OnPaint);
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

1

Решение

Попробуй позвонить функция InvalidateRect () обновить регион.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]