Я заметил, что когда я уменьшаю размер окна, отправляется сообщение WM_ERASEBKGND
, может кто-нибудь объяснить, почему это сообщение отправляется в этом случае, я имею в виду, я понимаю, что когда я увеличиваю размер окна, я должен стереть фон в новой области, но почему мне нужно стереть фон, когда я уменьшаю размер окна ?!Почему сообщение WM_ERASEBKGND отправляется, когда я уменьшаю размер окна?
Это скриншот, который иллюстрирует это поведение (я установил Spy ++, чтобы показывать только WM_ERASEBKGND
сообщения):
Это код, который я использовал для создания окна:
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "WinClass";
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wc);
HWND hWnd = CreateWindowEx(0, "WinClass", "My Window", WS_OVERLAPPEDWINDOW, 400, 400, 400, 400, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
Редактировать:
Я забыл упомянуть важную деталь: когда я уменьшаю размер окна, отправляется только WM_ERASEBKGND
сообщение без WM_PAINT
сообщение.
Это не так, что вы должны стереть фон, больше того, что вам нужно, чтобы перекрасить все содержимое. –
Обычно вы используете CS_VREDRAW | Стили класса CS_HREDRAW и получение сообщения не были бы неожиданностью. Но вы этого не сделаете, тогда картина становится немного отличающейся. Напишите свой собственный обработчик сообщений для WM_ERASEBKGND и вызовите GetClipBox(). Вы увидите разницу. –