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呼叫之后的叙述。

转载于:https://www.cnblogs.com/gzy-zju-edu/articles/4174756.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值