2015-11-21 57 views
4

我注意到,當我減少窗口大小,WM_ERASEBKGND消息正在發送,任何人都可以解釋爲什麼這個消息正在發送在這種情況下,我的意思是我明白,當我增加一個窗口大小,我應該抹去背景新顯示的區域,但爲什麼當我減小窗口大小時需要擦除背景?爲什麼在減小窗口大小時發送WM_ERASEBKGND消息?

這是示出了該行爲的屏幕截圖(I設置間諜++僅顯示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樣式。這些標誌指示系統分別在水平或垂直調整大小時重新繪製窗口。

至於爲什麼這種行爲可能是可取的,一些控件在調整大小時保持文本居中,如果它們沒有擦除舊大小的背景人工製品可能會留下。

相關問題