当前位置:首页 > 编程开发

无效区域与有效区域

webgou17年前 (2009-11-02)编程开发245

无效区域与有效区域

下面这段话摘自〈〈windows程序设计〉〉对无效区域与有效区域描述的部分: 尽管窗口消息处理程序一旦接收到WM_PAINT消息之后,就准备更新整个显示区域,但它经常只需要更新一个较小的区域(最常见的是显示区域中的矩形区域)。显然,当对话框覆盖了部分显示区域时,情况即是如此。在擦除对话框之后,需要重画的只是先前被对话框遮住的矩形区域。 这个区域称为「无效区域」或「更新区域」。正是显示区域内无效区域的存在,才会让Windows将一个WM_PAINT消息放在应用程序的消息队列中。只有在显示区域的某一部分失效时,窗口才会接受WM_PAINT消息。 Windows内部为每个窗口保存一个「绘图信息结构」,这个结构包含了包围无效区域的最小矩形的坐标以及其它信息,这个矩形就叫做「无效矩形」,有时也称为「无效区域」。如果在窗口消息处理程序处理WM_PAINT消息之前显示区域中的另一个区域变为无效,则Windows计算出一个包围两个区域的新的无效区域(以及一个新的无效矩形),并将这种变化后的信息放在绘制信息结构中。Windows不会将多个WM_PAINT消息都放在消息队列中。 窗口消息处理程序可以通过呼叫InvalidateRect使显示区域内的矩形无效。如果消息队列中已经包含一个WM_PAINT消息,Windows将计算出新的无效矩形。否则,它将一个新的WM_PAINT消息放入消息队列中。在接收到WM_PAINT消息时,窗口消息处理程序可以取得无效矩形的坐标(我们马上就会看到这一点)。通过呼叫GetUpdateRect,可以在任何时候取得这些坐标。 在处理WM_PAINT消息处理期间,窗口消息处理程序在呼叫了BeginPaint之后,整个显示区域即变为有效。程序也可以通过呼叫ValidateRect函数使显示区域内的任意矩形区域变为有效。如果这呼叫具有令整个无效区域变为有效的效果,则目前队列中的任何WM_PAINT消息都将被删除。 无效区域: 1.被其它显示区域挡住的区域 2.调用InvalidateRect的区域 下面还有一个例子: 当窗口客户区的一部分或者全部变为“无效”,以致于必须刷新时,系统将给窗口过程发送WM_PAINT消息。 收到WM_PAINT消息后必须绘制客户区。在很多时候我们只需要更新很小的一个区域就可以了。当对话框覆盖了部分客户区的时候情况就是如此。关闭对话框后,需要重画的只是先前被对话框遮住的矩形区域。这个区域就是“无效区域”或“更新区域”。 为了让你更好地理解什么是无效区域,我写了一个程序。该程序的功能是获取最新的无效区域的坐标。运行该程序后你可以用另一个较小的窗口遮住该窗口的全部或一小部分。然后再移走。又或者改变窗口的尺寸。客户区出现的四个数就是最新的无效区域坐标。以下是WndProc部分的代码: =========================================================== LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int cxChar, cxCaps, cyChar ; HDC hdc ; static int t[4] ; int i ; PAINTSTRUCT ps ; TCHAR szBuffer [10] ; switch (message) { case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; t[0] = ps.rcPaint.left ; t[1] = ps.rcPaint.top ; t[2] = ps.rcPaint.bottom ; t[3] = ps.rcPaint.right ; for (i = 0 ; i < 4 ; i++) { TextOut (hdc, t[0], t[1] + i * 20, szBuffer, wsprintf (szBuffer, TEXT ("%5d"), t[i])) ; } EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } =========================================================== BeginPaint函数除了获取设备描述表句柄之外,还从系统中获取相关信息填充她的第二个参数,也就是PAINTSTRUCT结构。该结构包含了一个rcPaint结构。而rcPaint结构就是最新无效区域的坐标。 上面例子来自:图们江计算机程序编制小组(http://chulsoft.xiloo.com)

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=78

标签: winows
分享给朋友:

“无效区域与有效区域” 的相关文章

在 CentOS 7 下安装配置 shadowsocks

CentOS 7 开始默认使用Systemd作为开启启动脚本的管理工具,Shadowsocks则是当前比较受欢迎的科学上网工具,本文将介绍如何在 CentOS 下安装和配置 Shadowsocks 服务。...…

关于wince OS开发面试问题的总结系列之OAL

关于wince OS开发面试问题的总结系列之OAL…

整数转换为字符串方法

方法1: #include //函数名: itoa //功 能: 把一整数转换为字符串 //用 法: char *itoa(int value, char *string, int radix); int main(void) { int number = 12345678;…

UE4游戏汉化通用教程|第一篇:Pak解包和打包以及简单导出并汉化文本文件

 Pak解包和打包Pak文件就是UE4游戏生成的数据包文件,PC游戏一般放在游戏路径下的Content\Paks,安卓则在obb解包后游戏路径下的Content\Paks中,一般汉化所需的文本都放在pakchunk0-WindowsNoEditor.pak(PC端)或者pakchunk0-…

模态对话框和非模态对话框的区别

模态对话框就是指那种:显示出来就不可以点选位于其下面的对话框的对话框;反之的就是非模态对话框。 两者的区别:一. 非模态对话框的模板必须具有Visible风格(Visible=True),否则对话框将不可见,而模态对话框则无需设置该项风格。在实际编程中更加保险的办法是调用CWnd::ShowWind…

使用ServerSocketChannel实现的file

http://blog.csdn.net/java2000_net/archive/2008/06/10/2529015.aspxhttp://www.java2000.net/viewthread.jsp?tid=6079...…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。