win32:WM_PAINT调用,但不应该是!

Kai*_*aan 0 c++ winapi wm-paint

我有WM_PAINT的问题.基本上我想在用户WM_COMMAND之后调用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;
}
Run Code Online (Sandbox Code Playgroud)

根据MSDN,WM_PAINT仅在UpdateWindow()或ReDrawWindow()之后自动调用,或者当SendMessage与它一起作为消息时调用.但是,我没有.我基本上只想在用户交互后调用WM_PAINT,而不是之前...有什么方法可以解决这个问题吗?是什么造成的?(我想它的一些奇怪的副作用我找不到>.<)的文档.

Joe*_*ite 6

只要您的窗口需要重绘,就会调用WM_PAINT.这就是它的用途.显示窗口,调整窗口大小,从最小化状态恢复窗口,在窗口被另一个窗口覆盖后将窗口移到前面,最小化另一个覆盖窗口的应用程序......这些只是一些事情将发送WM_PAINT.

我认为你正试图将WM_PAINT用于它不适合的东西.