1,该函数可以使窗口的指定矩形区域无效,从而引发WM_PAINT消息,如果想加速其处理速度可以随之调用UpdateWindow(),其实现原理如下:

InvalidateRect和WM_PAINT(转自:http://hi.baidu.com/cikar/blog/item/00f31e1e7b18b8c4a68669f9.html)
InvalidateRect(&rect,TRUE)将调用Windows API的InvalidateRect(m_hWnd, lpRect, bErase),会向Windows添加一个无效区域,并发送一个WM_PAINT消息要求系统重绘这个无效区域rect,在OnPaint中,系统响应WM_PAINT消息,OnPaint将调用CPaintDC dc(this)以得到绘图设备上下文,CPaintDC::CPaintDC(CWnd* pWnd)是CPaint的构造函数,从其中可以看到系统将调用CDC* ::BeginPaint(m_hWnd = pWnd->m_hWnd, &m_ps),其中m_ps是一个LPPAINTSTRUCT结构,它包含有一个rcPaint成员,它代表当前的剪取区域,也就是当前的无效区域,这里它等于InvalidateRect(&rect,TRUE)传入的rect矩形区域,此时我们便可以且只能在这个矩形区域内绘图,也就是说如果我们此时绘制的图形超过了这个矩形区域,程序将自动截断超出部分,只在该区域内绘图,可以在InvalidateRect后,或在OnPaint中使用CRect brect;GetUpdateRect(&brect)得到这个裁剪区域。也可以通过在OnPaint中得到dc后使用CRect mrect=dc.m_ps.rcPaint得到这个裁剪区域。如果没有显式的声明CPaintDC dc(this),系统将自己生成一个绘图设备上下文,此时也可以使用GetUpdateRect得到裁剪区域,但此时系统没有将我们需要的rect传递给rcPaint,所以此时得到的区域将是整个客户区,所以当在OnPaint中没有CPaintDC dc(this)时,程序将强制重画整个客户区,当有了CPaintDC dc(this)时,由于显式调用了带参数的构造函数,rect将传递给dc,此时强制绘图的区域将是rect。至于InvalidateRect(&rect,TRUE)的第二个参数代表是否用背景重画,就是是否用背景颜色画刷填充剪取的无效区域rect,true代表用背景重画,flase代表不用背景重画。所以只要在OnPaint中显式地构造了一个CPaintDC设备上下文,程序就将得知当前的裁剪区域是rect,而如没有显示构造,系统将按默认的绘图方式绘制,此时裁剪区域是整个区域。
2,由此可见,如果想让InvalidateRect发生效果,应该在OnPaint函数中利用CPaintDC dc(this)声明的dc绘图,因为只有这个dc含有无效区域的信息。如果在OnPaint中另外声明的了一个dc(someDCelse),这个dc不是本窗口dc,理论上不会发生作用。但是如果由于InvalidateRect的调用引起本窗口重绘,也会引发OnPaint函数,这时用关联其他设备的dc绘图,会原封执行,从而给人一种被执行了的错觉。
3,
按钮单击相应函数
void CInvalidateRect_ConfutionDlg::OnBtn()
{
 // TODO: Add your control notification handler code here
 m_bCircle = !m_bCircle;
InvalidateRect(CRect(100,100,130,130)); //此处如果被注释,点击该按钮后不会发生任何事情,反之就会使下面一句代码发生效果
 m_pic.InvalidateRect(m_ivlRect);            //但是并不是预期结果,因为背景没有擦除,这说明这里的InvalidateRect并没有起作用
}
自定义的绘图函数,在OnPaint中被调用
void CInvalidateRect_ConfutionDlg::Draw(CDC *pDC)
{
 pDC->Rectangle(m_ivlRect.right,m_ivlRect.bottom,
  m_ivlRect.right+30,m_ivlRect.bottom+30);
 if(m_bCircle)
  pDC->Ellipse(m_ivlRect);
 else
  pDC->Rectangle(m_ivlRect);
}
OnPaint函数
void CInvalidateRect_ConfutionDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  //CDialog::OnPaint();
 }
/* CPaintDC dc(this);
 dc.Rectangle(0,0,100,100);
 if(m_bCircle)
  dc.Ellipse(100,100,130,130);
 else
  dc.Rectangle(100,100,130,130);*/
CClientDC ddc(&m_pic);
 Draw(&ddc);
 CDialog::OnPaint(); //如果将此注释,由于未用CPaintDC,会导致WM_PAINT消息处理不尽,发生图形闪烁,因为一直在响应消息
                                //还有如果将这段代码放到绘图代码之前,绘图将失败,这个没想明白为什么。
}

InvalidateRect的困惑相关推荐

  1. 【干货】NLP中对困惑度感到困惑?

    视学算法推荐 作者:时晴 来自:炼丹笔记 困惑度(Perplexity)在NLP中是个最流行的评估指标,它用于评估语言模型学的到底有多好.但是很多炼丹师可能至今对"困惑度"依然感到 ...

  2. 《Python数据分析与挖掘实战》一第1章 数据挖掘基础1.1 某知名连锁餐饮企业的困惑...

    本节书摘来自华章出版社<Python数据分析与挖掘实战>一书中的第1章,第1.1节,作者 张良均 王路 谭立云 苏剑林,更多章节内容可以访问云栖社区"华章计算机"公众号 ...

  3. 一位39岁程序员的困惑:知道得越多编程越慢怎么办?

    Zilk1988 年 14 岁时就开始编程,此后尝试过几种职业,最终还是在 1997 年决定成为职业程序员(又称码农),现在已经 39 岁,对此选择依然无怨无悔. 但是后来他发现一个问题,自己的经验越 ...

  4. 困惑度 (perplexity)

    困惑度 (perplexity) 在自然语言处理中,对于一个语言模型,一般用困惑度来衡量它的好坏,困惑度越低,说明语言模型面对一句话感到困惑的程度越低,语言模型就越好. 对于LDA模型,最常用的两个评 ...

  5. 类的包访问权限:《Java编程思想》中一段话的困惑

    类的包访问权限:<Java编程思想>中一段话的困惑 在<java编程思想第三版>(陈昊鹏 饶若楠等译)的第五章隐藏具体实现中,5.4节的最后一段话是: "正如前面所提 ...

  6. TranslateMessage()的困惑

    对字符信息的困惑,当某键按下产生WM_KEYUP消息,经过TranslateMessage(&Msg)后:DispatchMessage()是如何动作的呢?而完整的信息是在WM_KEYDOWN ...

  7. C#进阶系列——WebApi 接口参数不再困惑:传参详解

    看这边文章时的疑惑是:WebApi中的参数加了[FromBody],不知所以然,就百度了下,看到了以下文章,和大家分享下: 原文链接:http://www.cnblogs.com/landeanfen ...

  8. 【星辰傀儡线·命运环·卷二 尘埃】 5 困惑

    五 困惑 修仑手中的匕首铛的一声掉在翡翠琴上. 她还是太心急了.在这诡谲的阿卡城中,提前暴露实力是一件非常愚蠢的事情.她以为破了龙破斩,凭完美体就能够压制住躁动的各方? 这只会促使各方联合起来对付她. ...

  9. 捅破窗户纸:如何从过程到对象—For金色的海洋以及所有为面向对象而困惑的Tx...

    本来不想写这篇很挨打的Post,不过在最近几天的最热的几篇Post里面看到无数的Tx为了面向对象的争论,感触颇多,遂作此篇. 鄙视OO的也进来鄙视我吧.望OO达人多多指正. 前头有一篇关于对象持久化的 ...

  10. 学以致用三十五-----像素的困惑

    在设计前端页面的过程中.经常会为width,height设置多少像素而感到困惑. 今天就来捋一捋这里的像素. 我的笔记本的分辨率是1920x1080像素 测试了浏览器满屏的像素大概是 1920x960 ...

最新文章

  1. explain性能分析
  2. python3.7界面设计_基于selenium+Python3.7+yaml+Robot Framework的UI自动化测试框架
  3. Insufficient free space for journal files
  4. Laravel项目上传github后,clone到本地运行时报错500的解决方法
  5. PIC单片机入门_PICC头文件介绍
  6. cannot find #include caffe/proto/caffe.pb.h
  7. Leetcode--27. 移除元素
  8. 【软件质量】对this或字符串加锁的弊病
  9. mt4 python神经网络_迈达克软件公司承认Python运算对量化交易的重要性----将Python与Metatrader 5集成一体...
  10. ubuntu无法登陆mysql_ubuntu11.04mysql报错、无法正常工作、无法登陆mysql
  11. mysql效率索引_mysql下普通索引和唯一索引的效率对比
  12. 爬取豆瓣电影储存到数据库MONGDB中以及反反爬虫
  13. python3 用递归方法列出所有目录与文件
  14. 微信开发者工具的最详细步骤如下:
  15. AndroidStudio:设计一个能在图片上涂鸦的程序
  16. Objective-C 程序设计(第4版)
  17. 常用单片机模块(一)
  18. springboot支付宝APP支付与退款
  19. 搭建个人网盘-owncloud
  20. 【医学图像处理】CT成像技术之CT设备

热门文章

  1. 最牛B的编码套路 - 呦呦鹿鸣 - 博客频道 - CSDN.NET
  2. ACDSee技巧 - 1
  3. VC++动态链接库(DLL)编程深入浅出:QA(原创)
  4. 随机取 数据库中的 记录
  5. 网管学习日记-ACL
  6. idea中配置mysql插件,使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置
  7. IS-IS详解(五)——IS-IS 三次握手与两次握手
  8. 2021年软考网络工程师备考资料
  9. vb.net它SqlHelper制备及应用
  10. Angular.js-开发前笔记