2010-12-22 62 views
0

我有WM_PAINT問題。基本上我希望WM_PAINT在用戶WM_COMMAND之後被調用,但由於某種原因它在主函數中被調用。win32:WM_PAINT調用但不應該是!

case WM_PAINT: 
    { 
    createFont(); 
    PAINTSTRUCT ps; 
    HBRUSH hbruzh = CreateSolidBrush(RGB(0,0,0)); 
    HDC hdz = BeginPaint(hWnd,&ps); 
    string s = "Memory Address"; 

    SelectBrush(hdz,hbruzh); 
    SelectFont(hdz,hf); 
    TextOut(hdz,0,0,s.c_str(),s.length()); 
    EndPaint(hWnd,&ps); 

    DeleteObject(hbruzh); 
    DeleteObject(hdz); 

    break; 
    } 




int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, int nCmdShow) 
{ 
    HWND hWnd; 
    WNDCLASSEX wc; 
    ZeroMemory(&wc, sizeof(WNDCLASSEX)); 
hThisInstance = hInstance; 
LoadLibrary("Riched20.dll"); 

wc.cbSize = sizeof(WNDCLASSEX); 
wc.style = CS_HREDRAW | CS_VREDRAW; 
wc.lpfnWndProc = WindowProc; 
wc.hInstance = hInstance; 
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MYMENU); 
if(!(wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_MYICON)))) { 
    HRESULT res = GetLastError(); 

} 
wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
wc.hbrBackground = (HBRUSH)COLOR_WINDOW; 
wc.lpszClassName = TEXT("Testcpp"); 
RegisterClassEx(&wc); 

hWnd = CreateWindowEx(NULL, 
     wc.lpszClassName, 
     TEXT("uTest"), 
     WS_OVERLAPPEDWINDOW, 
     300, 
     200, 
     450, 
     300, 
     NULL, 
     NULL, 
     hInstance, 
     NULL); 
ShowWindow(hWnd,nCmdShow); 

MSG msg; 
while (GetMessage(&msg, NULL,0,0)) { 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 

} 


return msg.wParam; 
} 

根據MSDN,WM_PAINT僅自動之後調用任一UpdateWindow()或ReDrawWindow()時,或者當與SendMessage消息作爲消息你。然而,我沒有做任何事。我基本上只想在用戶交互後調用WM_PAINT,而不是之前...有什麼方法可以解決這個問題嗎?這是什麼造成的? (我想它的一些bizare副作用,我找不到文檔> <)

+0

如果你想讓窗口不被繪畫,直到你得到一個特定的命令,使窗口不可見,並將其改變爲在命令處理程序中可見。 – 2010-12-22 21:22:03

回答

6

WM_PAINT被稱爲任何時候你的窗口需要重繪。這就是它的目的。顯示窗口,調整窗口大小,從最小化狀態恢復窗口,在窗口被另一個窗口覆蓋後將窗口置於前端,最小化另一個覆蓋窗口的應用程序......這些只是一些會發送一個WM_PAINT。

我認爲你正在嘗試將WM_PAINT用於它不適用的東西。

+0

你忘了創建窗口。 – 2010-12-22 21:22:35

+0

@Mark,我不認爲窗口在實際顯示之前得到了一個WM_PAINT。只是創建它不會發送油漆消息,是嗎? – 2010-12-22 21:27:34

2

根據MSDN,WM_PAINT僅自動之後調用任一UpdateWindow()或ReDrawWindow()時,或者當與SendMessage消息作爲消息你。

它比這更復雜。 WM_PAINT幾乎可以在任何時候生成;例如另請參閱Synchronous and Asynchronous Drawing

我不認爲你可以阻止WM_PAINT。您可以:

  • 強制立即WM_PAINT(例如,通過調用Update
  • 嘗試/延遲幾個油漆合併成一個(例如,通過使用多次打電話給InvalidateRect

而是防止WM_PAINT的,你應該集中精力避免/修復你在處理WM_PAINT時得到的任何「副作用」。

3

這是什麼原因造成的?

我的猜測是,當用戶從菜單中選擇菜單項時,顯示菜單的行爲已經覆蓋了部分客戶端窗口。

因此,當最終刪除菜單時,會生成* WM_PAINT *消息以重新創建客戶端窗口的缺失部分。

相關問題