2015-11-21 4 views
4

Я заметил, что когда я уменьшаю размер окна, отправляется сообщение WM_ERASEBKGND, может кто-нибудь объяснить, почему это сообщение отправляется в этом случае, я имею в виду, я понимаю, что когда я увеличиваю размер окна, я должен стереть фон в новой области, но почему мне нужно стереть фон, когда я уменьшаю размер окна ?!Почему сообщение WM_ERASEBKGND отправляется, когда я уменьшаю размер окна?

Это скриншот, который иллюстрирует это поведение (я установил Spy ++, чтобы показывать только WM_ERASEBKGND сообщения):

enter image description here

Это код, который я использовал для создания окна:

#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 сообщение.

+0

Это не так, что вы должны стереть фон, больше того, что вам нужно, чтобы перекрасить все содержимое. –

+2

Обычно вы используете CS_VREDRAW | Стили класса CS_HREDRAW и получение сообщения не были бы неожиданностью. Но вы этого не сделаете, тогда картина становится немного отличающейся. Напишите свой собственный обработчик сообщений для WM_ERASEBKGND и вызовите GetClipBox(). Вы увидите разницу. –

ответ

1

Если вы не хотите, чтобы автоматическое удаление, отправленное при изменении размера, удалите стили CS_HREDRAW и/или CS_VREDRAW из регистрации класса окна. Эти флаги сообщают системе перерисовать окно по горизонтальному или вертикальному размеру соответственно.

Что касается того, почему такое поведение может быть желательно, некоторые элементы управления сохраняют текст по центру при изменении размера, если они не удалили фоновые артефакты из старого размера.

Смежные вопросы