首先我是一个MFC入门选手,在学到createwindow 和 showwindow 以及 updatewindow时候,出现如下状况:
 (回调函数部分代码:)
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc;
hdc = BeginPaint(hwnd,&ps);
TextOut(hdc,0,0,"text",strlen("text"));
EndPaint(hwnd,&ps);
break;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
 (主程序部分代码:)
          HWND hwnd =   CreateWindow("zdc","text",WS_OVERLAPPEDWINDOW,0,0,400,300,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);问题如下:注释掉updatewindow后也能显示text;
我的分析:在调用creatwindow时,返回WM_CREAT,而DefWindowProc对这个WM_CREAT的默认处理中不仅创建窗口而且还会调用会产生WM_PAINT的函数(也就是在处理WM_CREAT的对应程序块中包含类似updatewindow这样会发出wm_paint的函数),这就解释为什么注释掉updatewindow后也能显示text,但是如果这个分析是正确的话为什么还要多此一举在show下面update,并且我分析认为在这个updatewindow函数体中,应是先调用回调函数并传去WM_PAINT,再接着调用showwindow?不知哪位大神帮我解一下惑,并指出我分析的错误之处!

解决方案 »

  1.   

     The function sends a WM_PAINT message directly to the window procedure of the specified window, bypassing the application queue.
      

  2.   

    这个我知道,我是问为什么要加updatewindow,是否多此一举呢
      

  3.   

    我还是不懂你意思!我运行的是孙鑫书上的第一个例子程序,注释掉update仍然与没注释一样
      

  4.   

    ShowWindow(hWnd,SW_SHOW);
    UpdateWindow(hWnd);
    Sleep(5000);
    MSG nMsg;
    while(GetMessage(&nMsg,hWnd,0,0)){
    TranslateMessage(&nMsg);
    DispatchMessage(&nMsg);
    }
    注释掉UpdateWindow和不注释就有区别了
      

  5.   

    updatewindow的作用是立即刷新窗,而windows程序在空闲时,没有其它消息时,会不断处理WM_PAINT,因此你的程序中updatewindowe有和没有是一样的,
    如果你的程序运算量大,这时候没及时处理WM_PAINT,就会造成界面不刷新的状况,这时候需要updatewindow一下.
      

  6.   

    windows程序在空闲时,没有其它消息时,会不断处理WM_PAINT其中原因是当应用程序消息队列中没有其它消息时,windows系统会向程序发送这个消息,
      

  7.   

    我自己查MSDN知道答案了,GetMessage returns the WM_PAINT message when there are no other messages in the application's message queue, and DispatchMessage sends the message to the appropriate window procedure: 当消息队列中没有消息时,getmessage自动返回WM_paint,这样所有的都解释通了,谢谢楼上各位的回答,作为菜鸟路还很长啊