我对WM_PAINT有问题。基本上,我希望WM_PAINT在用户WM_COMMAND之后被调用,但由于某种原因,它在主函数中被称为。

 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()或将其发送为消息后自动调用。但是,我没有。我基本上只想在用户交互后打电话给WM_PAINT,而不是在...是否有任何方法可以解决此问题?是什么原因造成的? (我猜这是一些Bizare副作用,我找不到>。<)的文档

有帮助吗?

解决方案

wm_paint随时都需要重新绘制窗口。就是这样。显示窗口,调整窗口的大小,从最小化状态恢复窗口,将窗口覆盖在另一个窗口后,将窗口覆盖,将另一个遮盖窗口的应用程序最小化...这些只是一些东西将发送WM_PAINT。

我认为您正在尝试使用WM_PAINT来实现它的目的。

其他提示

是什么原因造成的?

我的猜测是,当用户从菜单中选择菜单项时,显示菜单的行为已涵盖了客户端窗口的一部分。

因此,当菜单最终删除时,会生成 * WM_PAINT *消息以重新创建客户端窗口中缺少部分的部分。

根据MSDN的说法,WM_PAINT仅在UpdateWindow()或Redrawwindow()或将其发送为消息后自动调用。

它比这更复杂。 WM_PAINT几乎可以随时生成;例如,另请参见 同步和异步图.

我认为您无法防止WM_PAINT。你可以:

  • 迫使立即wm_paint(例如致电 Update)
  • 尝试将几种油漆组合成一个(例如,使用多个调用 InvalidateRect)

您应该专注于避免/固定您所说的“副作用”,而不是防止WM_PAINT,您应该在处理WM_PAINT时获得的任何“副作用”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top