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对控件进行重复绘制,我不明白是什么意思,不知道那位大虾详细的讲一下
{
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对控件进行重复绘制,我不明白是什么意思,不知道那位大虾详细的讲一下
要让IDC_STATIC1 控件显示图形,必须调用用pWnd ->Invalidate() ;产生第二个WM_PAINT消息;调用pWnd ->UpdateWindow() ;是为了防止重复绘制,它是绕够过消息队列直接给控件的窗口进程发送消息,控件处理完这个直接发送的WM_PAINT消息后,控件区域变为有效,从而把前两个还在消息队列排队的WM_PAINT消息删除,从而防止了重复绘制;个人理解。
其实,书上也说了,如果“对话框中的任何部分变为无效的话,对话框的OnPaint函数都会被自动调用”。
当在OnPaint函数内调用pWnd ->Invalidate() 时,控件客户区变为无效,对话框再次产生WM_PAINT消息,即调用OnPaint函数,而OnPaint函数又调用pWnd ->Invalidate() ,如此往复,就产生了重复绘制。
解决办法是调用pWnd ->UpdateWindow(),它能让控件客户区马上变为有效,而不再使对话框产生WM_PAINT消息。我想应该是这样的