除了代码里的Invalidate,InvalidateRect,RedrawWindow.程序自动触发的情况有哪些?除了OnInitUpdate初始化时,改变大小Onsize的时候,窗口切换时候(被激活)。当窗体受到遮挡,重新显示算不算?我认为domodal出来的对话框,在客户区移动或关闭这个对话框,应该会触发WM_PAINT.但是我做了一个测试,第一次移动总是不发送WM_PAINT,以后就每次都发送了。 很奇怪的问题。使用工具:VC ++6.0, SPY++用VC创建一个SDI程序,什么都没加。用SPY++对客户区的WM_PAINT进行监控。发现
About对话框弹出后,直接关闭或第一次移动都没有发送WM_PAINT消息。为什么?

解决方案 »

  1.   

    光是移动窗口应该不会有WM_PAINT消息吧。除非你把窗口的一部分被遮住,你又把它移出来了。
      

  2.   

    有意思。
    猜测:domodal时,系统记住了被挡住的部分,所以第一次不用重画。毕竟对话框经常是被直接关掉而不是移动的,以后系统没有保存,就需要重画了。
      

  3.   

    同意 webber84(***闭关修炼中***)
      

  4.   

    我觉得 ndy_w(carpe diem)说的有点道理,我也是这么猜测的。不过有没有官方一点的说法?有兴趣的朋友可以自己测试一下。to webber84(***闭关修炼中***) :一个单文档程序,About对话框弹出来是在中央,应该有遮住view的。移动的话,应该每次都应该重画。我想问的是,在客户区移动(有遮住),为什么domodal出来的第一次移动或关闭不会发送WM_PAINT.
      

  5.   

    WM_PAINT是低级别消息,只有其显示时(部分或全部),才能收到此消息。如果想要其重画手动调用
    InvalidateRect(NULL);
      

  6.   

    我这里怎么无论怎么拖动对话框都没有WM_PAINT呢?
      

  7.   

    不会吧?在单文档窗口上拖动About对话框,单文档窗口的view会有WM_PAINT的。