窗口的无效区域 演示程序
窗口的无效区域
作者: 姜学哲()
教材: Windows程序设计(第五版)北京大学出版社
[美]Charles Petzold 著
北京博彦科技发展有限公司 译 ¥:160
环境: windows2000 Pro sp4 + Internet Explorer 6.0 sp1 + Visual C++ 6.0
图们江计算机程序编制小组()版权所有,转载请说明出处
----------------------------------------------------------------
当窗口客户区的一部分或者全部变为“无效”,以致于必须刷新时,系统将给窗口过程发送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结构就是最新无效区域的坐标。
确定无效区域的时候不需要程序员干预,是由系统自动完成的。是暗箱操作。我们只需要用BeginPaint函数获取就可以了。我对微软的这种隐藏细节的做法很不满。也仅限于不满。人在屋檐下,不得不低头。
- · Delphi数据库应用程序常见错误
- · 数据结构学习(C++)续——排序【4】选择排序
- · 一个类数据类型的STL例子
- · Windows内存机制解析(二)源代码
- · 平台+插件软件设计思想源代码说明
- · Winamp输入模块编写详解
- · 对错一点间
- · 资源释放
- · boost::any源代码分析
- · STL 简介,标准模板库[1]
- · STL 简介,标准模板库[2]
- · C++性能测试用例
- · 大学书信选1(关于编译器)
- · Loading HTML content from a Stream
- · 类设计系列 --- 析构函数篇
- · SDTimes故事: C++ Builder X: 复仇出击 (English)
- · C++初学解惑(4)——构造函数(上)
- · 外包项目中的Leader
- · Toolbar制作菜单条过程详解
- · 非官方消息:TeamB成员对于CBX的释疑解惑
- · 为什么C++编译器不能支持对模板的分离式编译
- · 浏览器集成教学--脚本化浏览器
- · 在VC中所见即所得打印的简易实现
- · 社会进行曲——浅谈计算机语言的发展
- · Windows SDK编程之一 窗口示例程序
- · vc6.0调用excel xp,word 2k
- · 我的使用createremotethread控制excel右键的源程序
- · 证书的数字签名和认证
- · 针对QQ1230及2003版的木马程序源代码,兼容win98,2000,不显示进程。
- · 数据结构学习(C++)续——排序【5】归并排序
- · VC常见入门问题总结(一)
- · 表达式求值(上)
- · 表达式求值(中)
- · 表达式求值(下)
- · 利用SNIFFER PRO学习TCP/IP(一)
- · 利用SNIFFER PRO学习TCP/IP(二)
- · 用VC++进行MapX二次开发::之一------地理信息系统概述
- · 用VC++进行MapX二次开发::之二------使用MapX的基石
