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

无效区域与有效区域

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

无效区域与有效区域

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

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

Java基于Socket文件传输示例

最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解。在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度。废话少说,先来看服务器端的程序。1.服务器端package sterning;impo…

Java Dom解析XML

˂1、XML文件persons.xml内容如下:<?xml version="1.0" encoding="UTF-8"?><persons>  <person><name>jak</name&g…

5 Ways to Make HTTP Requests in Node.js

 HTTP – the Standard LibraryFirst on our hit parade is the default HTTP module in the standard library. With th…

数据挖掘算法(Analysis Services – 数据挖掘)

“数据挖掘算法”是创建数据挖掘模型的机制。…

Android Jni代码示例讲解

熟悉Android操作系统的朋友都知道,开发Android应用程序基本上使用的都是Java语言。那么要想灵活的应用这一系统,就应当熟悉其中的Android Java包的各种功能。一般的JAVA应用中,如果需用引用基础类库,通常需要使用如下的方式:import javax.swing.*;&…

Unity中Shader LOD控制

 文章来自https://zhuanlan.zhihu.com/p/21316674 ...…

发表评论

访客

看不清,换一张

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