VC中OnPaint()的工作原理
来源:互联网 发布:网络云端 编辑:程序博客网 时间:2024/06/06 17:22
VC程序是基于消息机制的,你所做的任何操作,比如点击鼠标,拖动窗口,首先进入系统的消息队列。这里的系统消息队列包括多个程序的消息,系统再将消息发送给相应的程序。既然是队列,这就有一个先进先出的问题,屏幕上的无效区更新消息出现的频率就会特别高。比如当左上角更新的消息还没有处理,右下角更新的消息已经过来了。为了避免多次处理WM_PAINT消息,系统就将这些窗口更新消息合并到一条,只是将无效区范围变成包括这两次更新无效区范围在内的矩形区域。这样就减少了WM_PAINT消息的处理次数,提高了效率。
那么,在OnPaint消息处理函数中,又是怎样实现更新无效区的呢?首先,要明白MFC中所有绘图操作都是基于设备描述表(Device Context,简称DC)的,具体信息可参看任何一本VC教材。DC中包含了绘图设备的各种信息,对于屏幕绘图,其实就是有一块内存(显存),专门用来存放要显示到屏幕上的信息,显示器以85HZ的频率(我以前的显示器)将其内容刷新的屏幕上。这里就到了关键点,显示器的刷新是将显存中的内容完全更新到显示器上,不存在无效区处理的问题,那么,无效区的处理一定发生在DC的绘图处理上。事实确实如此,当程序调用OnPaint消息时,首先将无效区范围传递给DC,DC在进行绘图操作时,就只更新无效区范围内的信息,其他地方的不管,这就提高了效率。
现在你明白OnPaint的处理是怎么一回事了吧?这里还想说一下Invalidate和UpdateWindow的区别。Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。而UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多只有一条)的无效区。效果很明显,调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列。如果你调用Invalidate之后想马上更新屏幕,那就加上UpdateWindow()这条语句。
- VC中OnPaint()的工作原理
- VC中OnPaint()的工作原理
- VC中OnPaint()的工作原理[转载]
- VC中OnPaint()的工作原理
- VC中OnPaint()的工作原理 OnPaint()与OnDraw的区别
- VC中OnPaint()的工作原理 OnPaint()与OnDraw的区别
- MFC中OnPaint的工作原理【转】
- OnPaint()的工作原理
- MFC的OnPaint工作原理
- OnPaint工作原理
- VC中OnPaint()
- VC++中OnPaint()、OnDraw()、OnPrint()的区别和联系
- VC++ Onpaint OnDraw的区别
- OnPaint()函数的作用原理
- OnPaint()函数的作用原理
- OnPaint()函数的作用原理
- OnPaint()函数的作用原理
- OnPaint()函数的作用原理
- table -- colgroup -----XHTML 1.0 Tags 参考之 table
- C++学习要点
- 硅谷新生代 可怕的美国
- 注册框验证的问题(JSP)
- CLR基础
- VC中OnPaint()的工作原理
- UML TOOLS COMPARE
- C++堆、栈、自由存储区、全局/静态存储区和常量存储区
- 《Eclipse从入门到精通》中软件的下载地址
- 跟权威专家学ASP.NET AJAX
- 从攻击看设计
- 命运
- char[] 与 char* 的区别
- 学习.Net的经典网站