Invalidate与UpdateWindow测试

今天终于明白,学编程,觉得不理解就编程测试,终于明白中这其中的道理,为了验证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呼叫之后的叙述。

posted @ 2014-12-19 21:44  龙泽一狼  阅读(765)  评论(0编辑  收藏  举报