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() ;  pWnd ->UpdateWindow() ;它说是防止 windows对控件进行重复绘制,我不明白是什么意思,不知道那位大虾详细的讲一下

解决方案 »

  1.   

    感觉不是防止重复绘制,而是保证IDC_STATIC1这个控件得到绘制消息,因而恢复自身绘制的形态。
      

  2.   

    可是vc6.0技术内幕上说是为了防止windows对控件进行重复绘制
      

  3.   

    我的理解是对话框失效时,它的失效区域包括在它上面的控件,因而也会对控件重绘,产生第一个WM_PAINT消息;
    要让IDC_STATIC1 控件显示图形,必须调用用pWnd ->Invalidate() ;产生第二个WM_PAINT消息;调用pWnd ->UpdateWindow() ;是为了防止重复绘制,它是绕够过消息队列直接给控件的窗口进程发送消息,控件处理完这个直接发送的WM_PAINT消息后,控件区域变为有效,从而把前两个还在消息队列排队的WM_PAINT消息删除,从而防止了重复绘制;个人理解。
      

  4.   

    对不起,以上的理解有点错误,现在更正:
     
    其实,书上也说了,如果“对话框中的任何部分变为无效的话,对话框的OnPaint函数都会被自动调用”。
    当在OnPaint函数内调用pWnd ->Invalidate() 时,控件客户区变为无效,对话框再次产生WM_PAINT消息,即调用OnPaint函数,而OnPaint函数又调用pWnd ->Invalidate() ,如此往复,就产生了重复绘制。
    解决办法是调用pWnd ->UpdateWindow(),它能让控件客户区马上变为有效,而不再使对话框产生WM_PAINT消息。我想应该是这样的