《Windows程序设计》读书笔记------------->>输出文字----绘制和更新<<

      实践和理论等候是非常重要的,仅仅会输出一行至但是不知道理论,出问题了也不知道问题出在什么地方。虽然书上实现讲理论后去实践的,不过还是动动手比较有成就感,回过头来看看了。

      事实上我们现在写的程序也只会在程序中间那个白框框里面绘图,其他地方还没学呢。

      

嗯,就是框框里面了。这些东西都是通过WM_PAINT消息处理画出来的。流程是这样的:

(程序开始)------>[WM_PAINT画画]------>有改变------->[WM_PAINT画画]

 

一、什么叫有改变呢?

在以下这些情况下,一定会产生WM_PAINT消息要求重画:

  • 在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。
     
  • 使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位旗标的设定)。
     
  • 程序使用ScrollWindow或ScrollDC函数滚动显示区域的一部分。
     
  • 程序使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息。

这些情况下程序不是在重画而是将原来的图像保存,之后直接将它恢复:

  • 鼠标光标穿越显示区域。
     
  • 图标拖过显示区域。

而有一些是介于两者之间的,就是有可能保存,不行就重画:

  • Windows擦除覆盖了部分窗口的对话框或消息框。
     
  • 菜单下拉出来,然后被释放。
     
  • 显示工具提示消息。

嗯,上面说的重画的意思就是得到了一个WM_PAINT消息,引发了WM_PAINT之中的绘制代码。这就告诉我们,当绘制的东西需要改变的时候,什么时候它可以自动重新绘制,什么时候要调用InvalidateRect。

 

二、画画说专业一点就是绘制了。而这个画画也是有不同的:

1、全部重画:比如说当窗口从最小化还原的时候,所有的东西都不复存在了,所以窗口的所有内容都需要重画。除此以外,使用者改变窗口的大小,程序使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息。也是要全部重画的。如果机子足够卡,或者用断点的方式可以看到这种方式下,绘制之前所有东西都消失了。

2、部分重画:比如说窗口的一部分被另外的窗口遮挡,然后又显露出来,这个时候就重画显露出来的那个部分。

而程序是通过设定“无效区域”,也就是“更新区域”的方式告诉WM_PAINT消息什么部分要重画什么部分可以不花用原来的以加快运行程序。在下下节就可以在滚动条那里看到它的应用,而且发现它就是储存在ps里面的。当全部重画的时候,无效区域当然就是整个窗口了。部分重画的时候就是显露出来的部分。

 我自己通过MessageBox的方式测试就可以看到这种不同,因为MessageBox似乎有断点的性质,阻止下面的内容继续画下去,这样就方便了我们看到哪些东西变白了。

 那个绿色框框里面出现一般有一半没有就是因为,一开始我把一个盖了一半的窗口拖开之后,它只要求绘制那一部分,但是被MessageBox拦截了,没有画成。后面那一半似乎是我换截图程序的时候搞的。。。。。。。这个程序在后面有打包的整个工程,可以自己玩一下。而且到后面你会发现有些对话框会点了之后又弹一个出来,再点又不弹了,这个就是“有可能保存,不行就重画”的表现吧(一开始我也不懂的,后来为了写这篇东东再看了一遍就发现问题了:)

文件在这里了:http://dl2.csdn.net/down4/20070706/06104222215.rar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值