窗口的无效区域 演示程序 (转)

本文介绍了一个用于演示窗口无效区域的程序。通过该程序可以获取窗口客户区变为无效时的坐标,便于理解无效区域概念及使用BeginPaint函数获取坐标的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

窗口的无效区域 演示程序 (转)[@more@]

窗口的无效区域

作者: 姜学哲(Mailto.NETsail0@163.net">netsail0@163.net)

教材: windows程序设计(第五版)北京大学出版社
 [美]Charles Petzold 著
 北京博彦科技发展有限公司 译  ¥:160

环境: Windows2000 Pro sp4 + Internet Explorer 6.0 sp1 + Visual C++ 6.0

图们江计算机程序编制小组(http://chulsoft.xiloo.com)版权所有,转载请说明出处
----------------------------------------------------------------
当窗口客户区的一部分或者全部变为“无效”,以致于必须刷新时,系统将给窗口过程发送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函数获取就可以了。我对微软的这种隐藏细节的做法很不满。也仅限于不满。人在屋檐下,不得不低头。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-998122/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-998122/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值