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

无效区域与有效区域

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

无效区域与有效区域

下面这段话摘自〈〈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
分享给朋友:

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

VC2005使用SQLite,适用于WIN32以及WINCE

VC2005使用SQLite,适用于WIN32以及WINCE …

Java正则表达式入门

众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。 大 家都知道,正则表达式是一种可以用于模式匹配和替换的规范...…

MFC CFile

class CFile : public CObject { DECLARE_DYNAMIC(CFile) public: // Flag values enum OpenFlags { modeRead = (int) 0x00000, modeWrite =…

Mac电脑安装OpenClaw教程

 自2026年1月起,一款名为OpenClaw(网友俗称“小龙虾”)的开源AI智能体在国内外社交媒体爆火,并衍生出收费安装服务。北京、上海、深圳等地的不少企业放出了“OpenClaw开发工程师”等岗位,其要求不限于“熟悉OpenC…

xcode objective-c categroy 与extersion

1,分类categroy 增加类方法一种手断,不能有成员变量。这个跟c++与java抽象类与接口还是有些不一样。类函数分类。 2.扩展extersion 匿名的categroy,实现可以有成员变量。 下面是实现的例子: [CODE] // // Category.h // objc /…

ARM寄存器简介

ARM寄存器介绍 ARM处理器共有37个寄存器。其中包括:31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。以及6个32位状态寄存器。但目前只使用了其中12位。ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。任意时刻(也就是任意的处理器模式下)…

发表评论

访客

看不清,换一张

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