void CMyDialog::OnPaint()
{
CWnd* pWnd = GetDlgItem(IDC_STATIC1);
CDC* pControlDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pControlDC->SelectStockObject(BLACK_BRUSH);
pControlDC->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pControlDC);
}
其中的pWnd->Invalidate();执行后,是不是马上发送消息?
为什么不把pControlDC->SelectStockObject(BLACK_BRUSH);
pControlDC->Rectangle(0,0,10,10);放在pWnd->Invalidate();的前面?

解决方案 »

  1.   

    Invalidate将整个客户区设为无效,当下一个WM_PAINT消息到达时将重绘该客户区。
      

  2.   

    Invalidates the entire client area of CWnd. The client area is ed for painting when the next WM_PAINT message occurs. 
      The region can also be validated before a WM_PAINT message occurs by the ValidateRect or ValidateRgn member function.
      

  3.   

    "当下一个WM_PAINT消息到达时将重绘该客户区。"具体是什么时候?在上面的例子中,有没有执行
    pControlDC->SelectStockObject(BLACK_BRUSH);
    pControlDC->Rectangle(0,0,10,10);
    操作?
      

  4.   

    //"当下一个WM_PAINT消息到达时将重绘该客户区。"具体是什么时候?
    正常的WM_PAINT是什么时候就是什么时候,Static被覆盖又被重现的时候,或者程序初始化的时候。Static的WM_PAINT在程序初始化时应该紧随在Dialog的WM_PAINT之后发生。程序启动后,Dialog界面正常地显示出来,此时WM_PAINT不再发生。而楼主的代码改变了WM_PAINT发生的顺序。
    当Dialog再度被拖到屏蔽以外并拉回来或者被其它窗口覆盖并重新显示的时候,Dialog的WM_PAINT发生,但由于代码中有pWnd->UpdateWindow()这句,所以同时也必然导致Static的WM_PAINT发生。/*
    在上面的例子中,有没有执行
    pControlDC->SelectStockObject(BLACK_BRUSH);
    pControlDC->Rectangle(0,0,10,10);
    操作?
    */
    当然执行了,而且每次Dialog的WM_PAINT发生时,都会执行一遍(其实不应该这样)。总结:
    楼主的代码有点乱,事实上,不应该在Dialog的OnPaint中去Paint Static。如果想实现代码中现在的效果,应该处理Static的WM_PAINT,也就是重写Static的OnPaint,而不是在Dialog的OnPaint中做。对于楼主的代码,有一个事实,在Dialog的每一次WM_PAINT中,无论Static是否需要paint,都向Static发出了WM_PAINT。这是不正常的。说的有点乱,但楼主仔细想想应该能想明白。主要的问题是弄清Dialog的WM_PAINT和Static的WM_PAINT在什么时候发生。如果去掉pWnd->UpdateWindow(),在启动时之所以画不出小方块,是因为在Dialog的WM_PAINT发生后,Static的WM_PAINT会覆盖Dialog的paint的结果。