今天终于明白,学编程,觉得不理解就编程测试,终于明白中这其中的道理,为了验证Invalidate和UpdateWindow,编写MFC程序来验证下:
1、创建基于对话窗MFC,在对话框中添加一个picture control 和两个按钮,一个用来填充控件,另一个使其重绘:
2、在OnPaint中添加代码:
1 CDC* dc=GetDlgItem(IDC_PICSHOW)->GetDC(); 2 CBrush brush; 3 brush.CreateSolidBrush(RGB(0,0,255)); 4 /*dc->SelectObject(brush);*/ 5 CRect rect; 6 GetDlgItem(IDC_PICSHOW)->GetClientRect(rect); 7 dc->FillRect(rect,&brush);
3、在填充控件按钮中添加代码:
1 void Ctest1Dlg::OnBnClickedButton1() 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 CDC* dc=GetDlgItem(IDC_PICSHOW)->GetDC(); 5 CBrush brush; 6 brush.CreateSolidBrush(RGB(255,0,0)); 7 /*dc->SelectObject(brush);*/ 8 CRect rect; 9 GetDlgItem(IDC_PICSHOW)->GetClientRect(rect); 10 dc->FillRect(rect,&brush); 11 }
4、在重绘按钮中添加代码:Invalidate(false), Invalidate(true), GetDlgItem(IDC_PICSHOW)->UpdateWindow();依次进行试验
1)Invalidate(false):打开窗口进入OnPaint中,控件填充为蓝色,然后点击“填充控件按钮”,控件填充为红色,再点击“重绘”按钮,产生一个WM_PAINT的消息,进入OnPaint的窗口函数过程中,由于是false所以控件背景不会擦除,故显示为蓝色;
2)Invalidate(true):打开窗口进入OnPaint中,控件填充为蓝色,然后点击“填充控件按钮”,控件填充为红色,再点击“重绘”按钮,产生一个WM_PAINT的消息,进入OnPaint的窗口函数过程中,由于是true所以控件背景将会擦除,而系统默认的背景是白色,所以最终显示为白色;
3) GetDlgItem(IDC_PICSHOW)->UpdateWindow():打开窗口进入OnPaint中,控件填充为蓝色,然后点击“填充控件按钮”,控件填充为红色,再点击“重绘”按钮,但是这里控件显示的区域都是有效的,所以不会产生WM_PAINT消息,所以维持红色背景不变,只有当显示区域遮挡部分重新开始显示,或者拖动对话框向外拉伸的时候,就会产生WM_PAINT的消息。(相当于Invalidate(false))另外这里注意发送消息直接到指定的窗口,不会经过消息队列。
如果显示区域的任一部分无效,则UpdateWindow将导致Windows用WM_PAINT消息呼叫窗口消息处理程序(如果整个显示区域有效,则不呼叫窗口消息处理程序)。这一WM_PAINT消息不进入消息队列,直接由Windows呼叫窗口消息处理程序。窗口消息处理程序完成更新后立即退出,Windows将控制传回给程序中UpdateWindow呼叫之后的叙述。