窗口的无效区域 演示程序

原创 2003年09月28日 00:29:00

窗口的无效区域

作者: 姜学哲(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函数获取就可以了。我对微软的这种隐藏细节的做法很不满。也仅限于不满。人在屋檐下,不得不低头。

MFC MDI和SDI非客户区框架界面美化之----标题栏以及边框美化

1、美化方式:贴图、重绘       优点:简单,易理解!适合       缺点:美化限制较大,实际使用意义不大。 2、基本思路是重载CMainFrame类的DefWindowProc()函数,并判断...
  • wzy198852
  • wzy198852
  • 2014年02月12日 09:29
  • 5702

MFC对话框-重绘非客户端区域(标题栏)

某些情况下需要在对话框标题栏上添加按钮,在此mark下: 环境:win7 + vs2008 + sp1 项目:MFC对话框 步骤:     1.  重写方法:DefWindowProc      ...
  • s123x456j789
  • s123x456j789
  • 2015年04月29日 16:04
  • 1791

mfc如何快速实现无边框窗口阴影效果

mfc如何快速实现无边框窗口阴影效果 mfc窗口当有边框的时候才会有阴影效果,怎么快速实现无边框窗口的阴影效果呢? 大部分的方法都是推荐使用分层联动的两个窗口来实现,但是这种处理方式稍显复杂,...
  • u010300403
  • u010300403
  • 2015年09月16日 15:39
  • 3018

vs2010 设置MFC程序窗口大小无效的问题

转载自:http://blog.sina.com.cn/s/blog_62f521600100ml2l.html vs2010 设置MFC程序窗口大小 问:BOOL CMainFrame:...
  • my_acm
  • my_acm
  • 2014年10月07日 13:19
  • 1561

VC++选择屏幕固定的区域或窗口或应用程序

  • 2015年10月31日 15:05
  • 2.46MB
  • 下载

指纹图像增强及无效区域提取

  • 2010年04月20日 10:49
  • 193KB
  • 下载

删除Win7通知区域的无效图标

  • 2014年02月19日 09:04
  • 10KB
  • 下载

隐藏Console窗口无效(续1)代码

  • 2014年10月20日 23:16
  • 9.62MB
  • 下载

Java多区域部署时能自动升级的一个小演示程序

公司的一个系统,需要在客户的多个不同的区域公司部署,于是每次有点升级的东西时,就要去20几个部署点去替换文件,效率太低,还极易出错。为此,利用JavaAgent功能,实现了一个能自动升级的小模块。...
  • 93336091
  • 93336091
  • 2015年06月09日 13:54
  • 170

删除Win7通知区域内无效图标的方法

核心提示:在使用win7系统时,一些程序在运行时会自动在任务栏通知区域里显示图标,但是,烦恼也紧跟着来了,每一个在电脑上运行过的程序,不管你是否删除了它,图标永远都留在那里面了。本教程就为大家介绍一下...
  • zhangmeijia5
  • zhangmeijia5
  • 2013年08月17日 19:41
  • 410
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:窗口的无效区域 演示程序
举报原因:
原因补充:

(最多只允许输入30个字)