Win32学习笔记 第四章 输出文本_1

Win32学习笔记

作者: 姜学哲(netsail0@163.net)

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

环境: windows2000 Pro + Internet Explorer 6.0 + DirectX8.1 + Visual C++ 6.0

图们江计算机程序编制小组(http://chulsoft.xiloo.com)版权所有,转载请说明出处
--------------------------------------------------------------------
【第四章 输出文本-1】

我们的网站有论坛了。60块一年的那种。很便宜吧?很爽啊!问题是人气太差。不过没关系。一切都会变好的。今天我受到很大的打击。可能我们网站的访问量有水分。实际访问量可能不到原来的十分之一。原来是23000多我倒~~~

学习笔记是我学习的方式。我是给自己解释。如果我能解释得很明白,就说明这一章我通过了。所以我写的学习笔记很长很长很长。简直比书上写的还长。

第四章有些错误让我给发现了,我是不是很牛啊?如下:

★注一★第76页的 图4-3 是错误的。不过第121页还有一个相同的图,那个图才是正确的。
★注二★第92页:下数第九行开始,书中把SB_THUMBPOSITION,SB_THUMBTRACK说成是消息,说什么 SB_THUMBTRACK消息,SB_THUMBPOSITION消息等,以SB为前缀的不是消息,而是通知码,这是概念问题。

第四章的内容很多,也很重要。所以写第四章的学习笔记对我来讲有很大的难度。我需要很长时间才能完成。文章可能很长,所以我分成两段了。跟前三章一样,在第四章您又会碰到很多看不懂的术语。这是没有办法的事情。多看几遍吧。

在前一章我们看到了一个简单的Windows程序HelloWin。它在客户区中央显示一行文本。客户区是整个应用程序中末被标题栏,窗口边框以及菜单栏,工具栏,状态栏和滚动条占据的部分。也就是说客户区是窗口中可以由程序任意书写和传递信息的部分。HelloWin的客户区是那一片白色的部分。

MS-DOS环境下的程序是单线程的。也就是说一次只能运行一个程序。而到了Windows时代情况变得复杂了。我们的程序必须与其它的程序共享一个屏幕。而且用户可以控制程序的显示方式,最大化,最小化等。而且大多数程序窗口都可以随意改变窗口尺寸。这对于最终用户来讲是很方便的,而对于程序员来说却是令人头痛的事情。这些看起来简单的功能实现起来很复杂。

当用户改变了窗口尺寸,当一个窗口被另一个窗口遮挡,当窗口中的内容需要更新,这一切都需要我们程序员来解决。我们并不知道用户的显示器有多大,是十四寸还是十九寸。也不知道用户的显示器是哪种分辨率,是800*600还是1024*768。我们的程序应该灵活地处理这些情况。

当然,如果您觉得这些太麻烦,我还有一个办法。那就是………您的程序可以设计成固定尺寸的窗口。就像计算器程序一样,使用户无法改变程序窗口的尺寸。这样以来就什么都解决了。不过身为二十一世纪的有志青年,我们怎么能用这么低能的办法呢?

这一章讲述的是程序在客户区显示信息的方式。但是比上一章说明的显示方式更加复杂。

Windows为显示图形提供了强大的图形设备接口(GDI)函数。不过现在才第四章,所以在这一章中只介绍简单文本行的显示。本章涉及和解决的问题适用于所有Windows程序设计。

本章讨论的是与设备无关的程序设计基础。Windows环境下的程序使用系统提供的功能来获取关于程序运行环境的信息。

Windows中可以同时打开很多窗口,有的时候一个窗口的一部分会被另一个窗口覆盖。其实在DOS下也有类似奈侍狻R訢OS下的WPS为例,当用户选中了一个下拉菜单后,菜单可能会覆盖一部分客户区。这个时候程序会保存被菜单覆盖的那部分内容。下拉菜单消失后再把保存的那部分搬回来。Windows的处理方法不是这样的。Windows不会保存被覆盖的部分。当被覆盖的部分重新露出来的时候Windows会要求程序刷新被覆盖过的部分,也就是重新绘制。因为Windows保留了重新绘制窗口所需的全部信息。

DOS下的WPS虽然也是图形界面,但是WPS的界面一但遭到破坏,就无法恢复了。如果程序不另外保存被覆盖的部分,那么等到下拉菜单消失以后原先被覆盖的那个地方什么都不会留下。等于彻底擦掉了。

而在Windows下就不一样了。Windows事先已经保留了有关窗口的所有信息。所以就算屏幕上的窗口全部被别的窗口覆盖,也照样能恢复。

Windows是一个消息驱动系统。它通过消息把各种事件通知给程序。当窗口过程从Windows收到一个WM_PAINT消息的时候窗口的部分客户区需要重新绘制。

大多数Windows程序在进入消息循环之前的初始化期间都要调用函数UpdateWindow()。Windows利用这个机会给窗口过程发送第一个WM_PAINT消息。这个消息通知窗口过程必须绘制客户区。此后窗口过程应该在任何时候都准备好处理其它WM_PAINT消息。如果有必要,甚至重新绘制整个客户区。

在发生下面几种事件之一时窗口过程会接收到一个WM_PAINT消息。

◆用户移动窗口或显示窗口时,先前被隐藏的部分重新可见
◆用户改变窗口尺寸--如果窗口类风格具有CS_HREDRAW CS_VREDRAW位设置
◆使用ScrollWindow()或ScrollDC()滚动客户区的一部分
◆使用InvalidateRect()或InvalidateRgn()显式产生一个WM_PAINT消息。

下面的情况下Windows可能发送WM_PAINT消息。

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

在某些情况下Windows总是保存它所覆盖的显示区域,然后恢复它。这些情况是:

◆鼠标光标穿越客户区
◆图标拖过客户区

窗口过程接收到WM_PAINT消息之后就准备更新整个客户区。有的时候窗口过程只需要更新一个较小的区域。最常见的是客户区中的矩形区域。当对话框覆盖了部分客户区时情况即是如此。擦除对话框之后需要重画的只是先前被对话框遮住的矩形区域。

这个区域被称为“无效区域”或“更新区域”。客户区内出现无效区域后Windows就会发送一个WM_PAINT消息。只有在客户区的某一部分变得无效时窗口才会收到WM_PAINT消息。

Windows内部为每个窗口保存一个“绘图信息结构”,这个结构包含了包围无效区域的最小矩形的坐标以及其它信息。这个矩形就叫做“无效矩形”,有时也称为“无效区域”。如果在窗口过程处理WM_PAINT消息之前客户区中的另一个区域也变为无效,Windows计算出包围两个区域的新的无效区域,并将这种变化后的信息放在绘图信息结构中。Windows不会将多个WM_PAINT消息都放在消息队列中。

InvalidateRect()的功能是使得客户区内的部分矩形变为无效。我们可以利用这个函数强制性地使某部分客户区变为无效。在接收到WM_PAINT消息时窗口过程可以获取无效矩形的坐标。通过调用GetUpdateRect()可以在任何时候获取这些坐标。

在处理WM_PAINT消息期间窗口过程在调用了BeginPaint()之后整个客户区即变得有效。程序也可以调用ValidateRect()使客户区内的任意矩形区域变为有效。如是调用该函数使得整个客户区全部变为有效,则当前消息队列中的所有WM_PAINT消息都会被删除。

想要在窗口客户区绘图,可以使用Windows的图形设备接口(GDI)函数。Windows提供了几个GDI函数用于将文本串输出到窗口客户区内。上一章的HelloWin程序用的是DrawText()。但是目前最普遍的文本输出函数是TextOut()。该函数的格式如下:

TextOut(hdc, x, y, psText, iLength);

TextOut()向

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值