簡體   English   中英

win32:WM_PAINT調用但不應該這樣!

[英]win32: WM_PAINT calls but not supposed to be!

我對WM_PAINT有問題。 基本上,我希望在用戶WM_COMMAND之后調用WM_PAINT,但是由於某種原因,它總是在main函數中被調用。

 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,而不是在...之前有什么辦法解決此問題? 是什么原因造成的? (我想我找不到>。<的文檔有一些缺點。)

每當需要重繪窗口時,都會調用WM_PAINT。 那就是它的目的。 顯示窗口,調整窗口大小,將窗口從最小化狀態還原,在被另一個窗口覆蓋后將窗口置於最前面,最小化另一個覆蓋窗口的應用程序……這些只是其中的一些事情將發送一個WM_PAINT。

我認為您正在嘗試將WM_PAINT用於不適合的用途。

是什么原因造成的?

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

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

根據MSDN,WM_PAINT僅在UpdateWindow()或ReDrawWindow()之后或在您將SendMessage與消息一起發送時才自動調用。

比這更復雜。 WM_PAINT幾乎可以在任何時間生成; 例如,另請參見同步和異步繪圖

我認為您無法阻止WM_PAINT。 您可以:

  • 強制立即執行WM_PAINT(例如,通過調用Update
  • 嘗試將幾種繪畫組合/延遲成一幅(例如,通過多次調用InvalidateRect

而不是阻止WM_PAINT,您應該集中精力避免/修復在處理WM_PAINT時說的“副作用”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM