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

无效区域与有效区域

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

无效区域与有效区域

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

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

在ios上使用Google analytics

在ios上使用Google analytics,今天简单地测试了一下,总结: Google analytics使用分为普通web(移动web),及app(包括移动app).ios app访问记录,需要几个库: (libGoogleAnalytics.a,CFNetwork,libsqlite3.…

DPI与像素的关系

DPI就是DOT PER INCH 每英寸象素数 1英寸=2.54厘米 不是说600万象素用多少DPI打,一般照片的DPI都是固定的,比如大多数机器都设定为72,那么600万象素的照片长是3400象素,每英寸72象 素,那么打印出来就是长47英寸,合119厘米,大约1.2米,明白了哦?很大的一副画呢…

Android 使用极光/友盟推送,APP进程在杀死后收不到推送的处理方法(转)

 为什么会存在这样的 问题,刚开始的时候我也搞不清楚,之前用极光的时候杀死程序后也会收到推送,但最近重新再去集成时就完全不好使了,这我就纳闷了,虽然Google在高版本上的Android上面不建议线程守护,所以将进程有关的Service都杀掉了,但旧版本还是有这个功能的啊 !真尼玛,后来猜…

Android判断网络状态方法详解

Android 判断网络状态这一应用技巧在实际应中是比较重要的。那么,在Android操作系统中,如何能够正确的判断我们所连接的网络是否断开恩?今天我们就针对这一应用技巧进行一个详细的分析。public class ConnectionChangeReceiver ex…

关于 ATF : Adobe Texture Format

 dds2atf  是一个将dds转换成atf文件的工具,...…

打印出:2,3,5,9,17,33,65

打印出:2,3,5,9,17,33,65…

发表评论

访客

看不清,换一张

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