VISUAL_C++MFC扩展编程实例(第一部分).pdf

上传人:asd****56 文档编号:70321536 上传时间:2023-01-19 格式:PDF 页数:69 大小:1.79MB
返回 下载 相关 举报
VISUAL_C++MFC扩展编程实例(第一部分).pdf_第1页
第1页 / 共69页
VISUAL_C++MFC扩展编程实例(第一部分).pdf_第2页
第2页 / 共69页
点击查看更多>>
资源描述

《VISUAL_C++MFC扩展编程实例(第一部分).pdf》由会员分享,可在线阅读,更多相关《VISUAL_C++MFC扩展编程实例(第一部分).pdf(69页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、目 录 第一部分 基础 第一部分 基础 第 1 章 概述 1 第 1 章 概述 1 1.1 Windows 基础 1 1.1.1 窗口类结构 2 1.1.2 消息 2 1.1.3 客户区和非客户区 2 1.1.4 重叠窗口、弹出窗口和子窗口 2 1.1.5 父窗口和宿主窗口 3 1.2 Windows 消息 3 1.2.1 发送或寄送消息 4 1.2.2 消息类型 4 1.2.3 接收消息 4 1.2.4 窗口处理函数的子类化 5 1.3 窗口绘图 5 1.3.1 设备环境 5 1.3.2 绘图工具 6 1.3.3 映射模式 6 1.3.4 窗口视和视口视 6 1.3.5 逻辑单位和设备单位

2、7 1.3.6 绘图函数 7 1.3.7 抖动和非抖动颜色 7 1.3.8 设备无关位图 8 1.3.9 元文件 8 1.3.10 何时绘图 8 1.4 MFC 基础 8 1.5 Developer Studio 基础 9 1.6 Windows 和 MFC 总结 10 1.7 基本类 10 1.8 应用类 11 1.8.1 文档视 11 1.8.2 CWinApp(OC)11 1.8.3 文档模板 12 1.8.4 线程 12 1.8.5 CFrameWnd(OCW)12 1.8.6 CDocument(OC)12 1.8.7 CView(OCW)13 1.8.8 对话框应用程序 13 1.

3、8.9 SDI 应用程序 13 1.8.10 MDI 应用程序 13 1.9 其余用户界面类 13 1.9.1 通用控件类 13 1.9.2 菜单类(O)14 1.9.3 对话框类 15 1.9.4 通用对话框 MFC 类 15 1.9.5 控件条类(OCW)15 1.9.6 属性类 15 1.10 绘图类 16 1.11 其他 MFC 类 16 1.11.1 文件类 16 1.11.2 CArchive 和序列化 16 1.11.3 数据库类 17 1.11.4 ODBC 类 17 1.11.5 DAO 类 17 1.11.6 数据集合类 17 1.11.7 通信类 18 1.12 类的消息

4、机制 18 1.12.1 MFC 如何接收一个寄送消息 18 1.12.2 MFC 如何处理接收的消息 18 1.12.3 UI 对象 20 1.13 小 结 20 第 2 章 控制条 21 第 2 章 控制条 21 2.1 通用控制条 21 2.2 用 API 创建控制条 22 2.3 用 MFC 创建控制条 24 2.3.1 CToolBarCtrl 和 CStatusBarCtrl 24 2.3.2 CToolBar 和 CStatusBar 24 2.3.3 CControlBar 26 2.4 停靠栏 27 2.4.1 设置停靠功能 28 2.4.2 自动改变大小和移动 30 2.4

5、.3 停靠栏小结 30 2.5 浮动条 31 2.6 MFC 的高级控制条类小结 32 2.7 视和控制条如何共享客户区 32 2.7.1 CFrameWnd:RecalcLayout()32 2.7.2 CWnd:RepositionBars()33 2.7.3 CControlBar:OnSizeParent()33 2.7.4 CalcDynamicLayout()和 CalcFixedLayout()34 2.7.5 CToolBar:CalcFixedLayout()和 CTool Bar:CalcDynamicLayout()35 2.7.6 工具栏布局 35 2.7.7 CSta

6、tusBar:CalcFixedLayout()36 2.7.8 CDockBar:CalcFixedLayout()36 2.7.9 共享客户区小结 36 2.8 对话条 37 2.9 伸缩条 38 2.9.1 CReBar 和 CReBarCtrl 39 2.9.2 CReBar:CalcFixedLayout()39 2.10 命令条 39 2.11 控制条窗口小部件风格 40 2.11.1 工具栏按钮风格 40 2.11.2 状态栏窗格风格 40 2.11.3 伸缩条段风格 40 2.12 设计自己的控制条 41 2.12.1 重载 CControlBar:CalcDynamic-La

7、yout()41 2.12.2 增加 WM_SIZEPARENT 消息处理器 41 2.12.3 重载 CMainFrame:RecalcLayout()41 2.12.4 从 CDockBar 派生 42 2.13 实例 42 2.14 总结 42 第 3 章 通信 43 第 3 章 通信 43 3.1 进程间通信 43 3.1.1 通信策略 43 3.1.2 同步和异步通信 44 3.2 窗口消息 44 3.2.1 打开和关闭 44 3.2.2 读与写 45 3.2.3 回顾 45 3.3 动态数据交换 46 3.3.1 客户/服务器 46 3.3.2 打开和关闭 46 3.3.3 读和写

8、 47 3.3.4 其他 DDE 函数 48 3.3.5 MFC 支持 48 3.3.6 回顾 49 3.4 消息管道 49 3.4.1 打开和关闭 49 3.4.2 读和写 50 3.4.3 回顾 51 3.5 Windows 套接字 51 3.5.1 打开和关闭 52 3.5.2 读和写 52 3.5.2 通过 Windows 套接字序列化 53 3.5.3 数据流和数据报 53 3.5.4 回顾 54 3.6 串行/并行通信 54 3.6.1 打开和关闭 54 3.6.2 读和写 54 3.6.3 配置端口 55 3.6.4 回顾 55 3.7 Internet 通信 56 3.7.1

9、打开和关闭文件 56 3.7.2 读文件 56 3.7.3 打开和关闭连接 56 3.7.4 其他 Internet 类 57 3.8 通信方式小结 57 3.9 共享数据 58 3.10 共享内存文件 58 3.10.1 创建和销毁 58 3.10.2 读和写 58 3.10.3 回顾 59 3.11 文件映射 59 3.11.1 打开和关闭 59 3.11.2 读和写 60 3.11.3 数据同步 60 3.11.4 回顾 60 3.12 客户/服务器 61 3.12.1 传递调用参数 61 3.12.2 远程过程调用 62 3.13 小结 62 第二部分 用户界面实例 第二部分 用户界面

10、实例 第 4 章 应用程序和环境 64 第 4 章 应用程序和环境 64 4.1 实例 1:在工具栏中添加静态标识符 64 4.2 实例 2:在工具栏中添加动态标识符 71 4.3 实例 3:只启动一个实例 75 4.4 实例 4:创建对话框MDI 混合式应用程序 77 4.5 实例 5:在系统托盘中添加图标 79 4.6 实例 6:主菜单状态栏中的标记 81 第 5 章 菜单、控件条和状态栏 85 第 5 章 菜单、控件条和状态栏 85 5.1 实例 7:在菜单中添加图标 85 5.2 实例 8:调整命令条外观 97 5.3 实例 9:可编程工具栏 102 5.4 实例 10:在对话框中添加

11、工具栏、菜单和状态栏 127 5.5 实例 11:在弹出菜单中增加位图标记 129 5.6 实例 12:工具栏上的下拉按钮 131 5.7 实例 13:在状态栏中添加图标 136 5.8 实例 14:使用伸缩条 141 第 6 章 视 143 第 6 章 视 143 6.1 实例 15:创建标签窗体视 143 6.2 实例 16:创建具有通用控件的视 150 6.3 实例 17:打印报表 156 6.4 实例 18:打印视 167 6.5 实例 19:绘制 MDI 客户视 174 6.6 实例 20:拖放文件到视 177 第 7 章 对话框和对话条 179 第 7 章 对话框和对话条 179

12、7.1 实例 21:动态改变对话框的尺寸 179 7.2 实例 22:自定义数据交换并验证 184 7.3 实例 23:重载通用文件对话框 187 7.4 实例 24:重载通用颜色对话框 190 7.5 实例 25:获得目录名 192 7.6 实例 26:子对话框 197 7.7 实例 27:子属性表 198 第 8 章 控件窗口 200 第 8 章 控件窗口 200 8.1 实例 28:自己绘制的控件 200 8.2 实例 29:在窗口标题中添加按钮 204 8.3 实例 30:添加热键控件 211 第 9 章 绘图 213 第 9 章 绘图 213 9.1 实例 31:使用非散射颜色 21

13、3 9.2 实例 32:伸展位图 227 9.3 实例 33:抓取屏幕 231 9.4 实例 34:输出 DIB 位图文件 236 第 10 章 帮助 243 第 10 章 帮助 243 10.1 实例 35:添加帮助菜单项 243 10.2 实例 36:添加上下文相关帮助 245 10.3 实例 37:添加气泡帮助 247 第 11 章 普通窗口 254 第 11 章 普通窗口 254 11.1 实例 38:创建普通窗口 254 11.2 实例 39:创建短调用形式窗口类 256 11.3 实例 40:创建长调用形式窗口类 258 第 12 章 特定的应用程序 261 第 12 章 特定的应

14、用程序 261 12.1 实例 41:创建简单的文本编辑器 261 12.2 实例 42:生成简单的 RTF 编辑器 262 12.3 实例 43:创建资源管理器界面 265 12.4 实例 44:创建简单的 ODBC 数据库编辑器 284 12.5 实例 45:创建简单的 DAO 数据库编辑器 287 12.6 实例 46:创建简单的向导 289 第三部分 内部处理实例 第三部分 内部处理实例 第 13 章 消息和通信 295 第 13 章 消息和通信 295 13.1 实例 47:等待消息 296 13.2 实例 48:清除消息 297 13.3 实例 49:向其他应用程序发送消息 298

15、 13.4 实例 50:与其他应用程序共享数据 300 13.5 实例 51:使用套接字与任意的应用程序通信 301 13.6 实例 52:使用串行或并行 I/O 321 第 14 章 多任务 331 第 14 章 多任务 331 14.1 实例 53:后台处理 331 14.2 实例 54:运行其他应用程序 332 14.3 实例 55:改变优先级 334 14.4 实例 56:应用程序内部的多任务工作者线程 336 14.5 实例 57:应用程序内部的多任务用户界面线程 339 14.6 实例 58:向用户界面线程发送消息 342 14.7 实例 59:线程间的数据共享 343 第 15

16、章 其他 347 第 15 章 其他 347 15.1 实例 60:创建定时器 347 15.2 实例 61:播放声音 349 15.3 实例 62:创建 VC+宏 350 15.4 实例 63:使用函数地址 351 15.5 实例 64:二进制字符串 352 15.6 实例 65:重新启动计算机 356 15.7 实例 66:获得可用磁盘空间 357 15.8 实例 67:闪烁窗口和文本 358 第四部分 附录 第四部分 附录 附录 A 消息和重载顺序 361 附录 B 绘图结构 385 附录 A 消息和重载顺序 361 附录 B 绘图结构 385 下载无论读者是否已经读过本系列的书籍,或者

17、已经具备了多年的编程经验,我们仍将在这一部分回顾一下所需要的基本知识,其目的就在于能够使读者更好地理解本书的实例。编写程序常常是一种需要尝试不同方法以达到最终目的的工作。通常情况下,了解用 M F C来做什么涉及到对4个基本概念的理解:Windows API怎样创建窗口;M F C如何封装并改进Wi n d o w sA P I;M F C如何与窗口通信以及 M F C是怎样控制绘图任务的。除了这些概念以外,本部分还将讨论一下工具栏和状态栏。最后我们将讨论一下 M F C如何同非Wi n d o w s构件进行通信,如串行口和I n t e r n e t站点。本部分包括的章节介绍如下。第1章

18、概述本章概述M F C如何封装并改进Windows API。如果读者已经阅读过本系列书籍的前一本,将会发现该章是对那些版本基础部分的一些回顾。本书包含这一章是为了保持本书对高层次读者的独立性。第2章控件条本章将讨论M F C支持的控件条。标准的控件条包括工具栏、状态栏和伸缩条(R e b a r)等。M F C增加了对话条和停靠栏。该章还要探讨 M F C如何避免控件条之间以及它们和视之间互相覆盖的技术内幕。第3章通信本章讨论应用程序与外部世界的不同通信方式。其中最基础的窗口消息将在第一章中讨论。本章还涉及其他一些通信途径,包括局域网、I n t e r n e t通信、串行和并行端口、D D

19、 E、Wi n d o w s挂钩和管道等。第 1 章 概述本章将回顾Wi n d o w s应用程序的基本知识,包括应用程序如何创建窗口、窗口之间如何进行对话以及如何在窗口内绘图。然后将讨论微软基础类库(M F C)以及Developer Studio怎样使创建窗口应用程序的工作变得容易起来。1.1 Windows基础当Wi n d o w s操作系统启动应用程序时,它首先创建一个程序线程,该线程一般只是一个第一部分基础可执行内存的管理模块,而这些内存则与系统中其他应用程序分享执行时间。如果这个应用程序要通过显示屏幕与用户交互,那么这个程序线程便需要负责创建显示在屏幕上的窗口。程序线程通过调

20、用操作系统的应用程序编程接口(A P I)来创建这些窗口。实际调用的函数是:C r e a t e Wi n d o w E x(),这个函数需要下列参数:屏幕位置、窗口大小以及即将创建的窗口的风格。1.1.1 窗口类结构线程创建的多数窗口具有类似的风格(例如按钮),这些类似的风格已经被集成为一个名为窗口类(Windows Class)的结构。注意这是一个结构,而不是一个 C+类。在创建窗口时必须设定窗口类。也可以使用其他的窗口风格,并且分别设定各自的窗口类结构。1.1.2 消息如果用户单击了一个窗口,操作系统就会向这个窗口发送一个消息来把这一事件通知给它。每个窗口用自己的窗口处理过程来处理窗

21、口消息,举个例子,一个按钮的窗口处理过程可能向它的主窗口发送一个消息告诉它需要做什么事情。每个窗口的处理过程还负责在屏幕上绘制属于自己的窗口。操作系统在绘制窗口时会向目标窗口发送W M _ PA I N T消息。所有类似的窗口具备同样的窗口处理过程,例如,所有的按钮控件使用同样的窗口处理过程,因此所有的按钮看起来外表都很类似,其行为也类似。这种情况下的窗口处理过程位于操作系统内。它的地址在窗口的窗口类结构内指定。所有的按钮控件都由同样的窗口类创建,这个窗口类结构的名字叫做B U T TO N。1.1.3 客户区和非客户区窗口处理过程在屏幕上绘制一个窗口时实际上绘制了两个部分:客户区和非客户区。

22、为了绘制非客户区(nonclient area),窗口处理过程总是调用所有窗口过程都需要调用的相同的操作系统处理过程。该过程接下来还需要绘制框架、菜单条以及标题栏等等多数窗口共同具有的内容。过程所绘制的东西取决于窗口的风格。例如,由于按钮的风格被指定为不用绘制其非客户区,所以按钮窗口上就不会看见框架和菜单。窗口的客户区(client area)总是由窗口自己的窗口处理过程绘制,也可能由操作系统来完成这件事,例如所有的按钮都由同样的处理过程来绘制,或者由创建者自己来绘制图像或列表。1.1.4 重叠窗口、弹出窗口和子窗口除了窗口类以外,还有成百上千种窗口风格供用户指定窗口的绘制及其行为。其中有 3

23、种最重要的风格创建了对应3种最基本的窗口类型:重叠窗口、弹出窗口和子窗口。重叠窗口(overlapped window),具有应用程序主窗口的全部特点。它的非客户区包括一个可伸缩的框架、菜单条、标题栏和最小化、最大化按钮。弹出窗口(popup window),具有消息框或者对话框的全部特点。它的非客户区包括一个固定大小的框架和一个标题栏。2第第第一部分第基础下载子窗口(child window),具有类似按钮控件的全部特点。它没有非客户区,窗口的处理过程负责绘制窗口的每个部分。这些窗口在其行为上表现不同,这将在以后讨论。1.1.5 父窗口和宿主窗口由于用户界面可能会由好多个窗口组成,所以由程序

24、线程控制它们将是很困难的,例如,如果用户将一个应用程序最小化,那么程序线程应该对那些组成用户界面的所有最小化窗口负责吗?实际上并没有采取直接控制的方式,应用程序创建的每个窗口都通过调用:C r e a t e Wi n d o w E x()分配了一个控制窗口。如果这个控制窗口被最小化,那么所有被其控制的窗口都会由操作系统自动地最小化。如果控制窗口被销毁,那么每个被控制窗口也随之被销毁。每个被控窗口也可以作为其他窗口的控制窗口,结果最小化或者销毁某些窗口都只影响用户界面的一部分。无论是什么窗口或者位于何处,程序员都可以在它内部创建另外的窗口。子窗口的控制窗口叫做父窗口(parent windo

25、w)。父窗口剪切其子窗口,也就是子窗口不能在其父窗口以外绘制。当用户与类似按钮的子窗口交互的时候,这些子窗口将自动地生成消息并发送到其父窗口。这就使得控件可以在父窗口的窗口处理过程中被集中处理。图1-1 构成一个Windows应用程序界面的窗口弹出窗口和重叠窗口的控制窗口叫做宿主窗口(owner window)。与父窗口不同,宿主窗口并不限制属于它的窗口。然而,当最小化宿主窗口的时候,它的所属窗口也将被最小化。但是,当宿主窗口隐藏的时候,它的所属窗口却仍然显示。请参见图 1-1以了解组成Wi n d o w s应用程序的各种窗口。1.2 Windows消息上面提到,每个窗口由其自己的窗口处理过

26、程响应来自操作系统或者其他窗口的消息。例如,用户用鼠标单击了某个窗口,那么操作系统可能就会向这个窗口发送一个消息。如果这是一个标识为Load File的按钮窗口,那么它的窗口处理过程就可能向应用的主窗口发送一个消息通知加载文件。主窗口处理过程将加载文件并在其客户区显示文件内容来作为响应。接下来讨论消息是如何传送的。第 1 章第概第第述第第3下载一个重叠窗口。宿主窗口是桌面,也叫主窗口子窗口。文窗口是主窗口弹出窗口。宿主窗口是主窗口子窗口。文窗口是它所在的弹出窗口1.2.1 发送或寄送消息传送消息到窗口有两种方式:发送(s e n d)或者寄送(p o s t)。这两种方式之间的主要差别在于被寄

27、送的消息不必立即处理。被寄送的消息放置于一个先入先出的队列里等待应用程序空闲的时候处理,而被发送的消息需要立即处理。实际上,发送消息到窗口处理过程和直接调用窗口处理过程两者之间几乎没有任何不同。只是,你可以要求操作系统截获所有为达到某个目的而在应用程序中被发送的消息,但不能截获对窗口处理过程的直接调用。与用户输入相对应的消息(如鼠标单击和按下一个按键)通常都是以寄送的方式传送,以便于这些用户输入可以由运行较缓慢的系统进行缓冲处理。而其余的所有消息都是被发送的。在以上的例子中,系统寄送了鼠标单击消息,而按钮窗口则向其主窗口发送了 Load File消息。1.2.2 消息类型有3种类型的消息:窗口

28、消息、命令消息和控件通知消息:窗口消息(Window message)是由操作系统和控制其他窗口的窗口所使用的消息。这一类的消息有C r e a t e、D e s t r o y和M o v e等等。上例中的鼠标单击消息也是一种窗口消息。命令消息(Command message)是一种特殊的窗口消息,它从一个窗口发送到另一个窗口以处理来自用户的请求。在以上例子中,从按钮窗口发送到主窗口的消息就是命令消息。控件通知消息(control notification)是最后一种消息类型。它类似命令消息,当用户与控件窗口交互时,这一类消息就从控件窗口发送到其主窗口。但是,这种消息的目的并不在于处理用户

29、命令,而是为了让主窗口能够改变控件,如加载并显示更多的数据。以上所述的例子中并没有控件通知消息,但是,假如按钮发送了鼠标单击消息给它的主窗口,那么这个消息也可以看作是一个控件通知消息。一个普通的鼠标单击消息可以由主窗口直接处理,然后由控件窗口处理。1.2.3 接收消息窗口处理过程看起来与其他函数和方法没有任何不同。消息到来后,按照消息类型排序进行处理。其中的参数则由调用函数提供以进一步区分消息。命令消息由 w P a r a m中的命令I D分类。D e f Wi n d o w P r o c()函数则发送任何程序员都不会去处理的消息给操作系统。所有传送到窗口的消息都将通过这个函数,甚至包括

30、绘制窗口非客户区的消息尽管最终它们都将绕过D e f Wi n d o w P r o c()函数。一个主窗口的处理过程实例如下:MainWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)switch(message)case WM_CREAT E:b r e a k;case WM_PA I N T:b r e a k;case WM_COMMAND:4第第第一部分第基础下载switch(id)case IDC_LOAD_FILE:b r e a k;b r e a k;d e f a u l t:return(DefWin

31、dowProc(hWnd,message,wParam,lParam);return(NULL);1.2.4 窗口处理函数的子类化上面提到过,在窗口类中定义了窗口处理过程的地址。由窗口类所创建的窗口将把它们的消息传递给窗口处理过程。如果程序员使用的是一个由系统提供的窗口类,并要增加自己对窗口的特殊处理,就需要使用子类化(s w b o l a s s i n g)。将窗口指向自己的窗口处理过程,便对窗口进行了子类化,这样所有的消息都可以由程序员自己处理了。如果只想处理一个或者两个消息,只需简单地将剩余消息传递给初始的窗口处理过程即可。我们注意到,采用子类化并没有修改原先的窗口类,而是直接对窗口

32、对象进行了修改,这个对象保存了一份窗口处理过程地址的拷贝。与此相反,超类化(s u p e r c l a s s-i n g)则修改了原始的窗口类,然后将其应用于创建窗口,但由于可以更方便、安全地使用 M F C来获得由超类化带来的好处,所以这种方法就很少采用了。请参见图1-2了解子类化概念。1.3 窗口绘图Windows API为窗口绘图提供了好几种调用函数。它们是点、弧、图形和圆绘图函数以及图形填充和位图绘制等函数。正是因为采用了绘图 A P I,所以程序员必须负责传递坐标数值、颜色、宽度和绘图位置,而 A P I函数则负责剩余的工作。为了简化对 Windows API的图像函数调用,一

33、些参数被固化到了一个名为设备环境的可重用对象中。1.3.1 设备环境图像设备环境(Device Context)是一个简单的对象,它包含了对绘图而言比较共同的属性,第 1 章第概第第述第第5下载窗口对象指向创建它的窗口类的窗口过程通过设置自己的窗口过程地址来子类化该窗口任何不希望自行处理的消息可以交由初始窗口过程负责处理窗口对象初始窗口过程新窗口过程图1-2 窗口处理函数的子类化例如绘图位置、线宽、填充模式的颜色等等。这个对象可以一次设置然后多次重复使用。实际上并不需要自己创建设备环境,只要调用几个可能的 A P I函数,系统就可以返回已经被预先准备好的设备环境值。例如,系统为屏幕创建的设备环

34、境包含屏幕上将用于绘图的颜色以及绘图工具的当前位置,程序员则可以在该位置进行绘图并设置颜色。1.3.2 绘图工具设备环境并没有包括绘图所需的全部特征。有几个特征存在于设备环境可以引用的附加图像对象中。这些对象都各自代表了某一特定绘图工具的特征(如:画笔的色彩和宽度、画刷采用的模式等)。这些工具包括绘制直线的画笔;用某种模式填充封闭区域的画刷;确定文本绘制效果的字体以及确定使用何种颜色的调色板等等。另外的两种绘图工具:位图和区域则显得更抽象一些。位图工具看起来像画刷,除了它只能用位图模式填充一个区域。而区域工具则类似于画笔工具,但它起的是剪切作用,例如可以使用区域工具从一个位图中将“S TO P

35、”单词分割出来。1.3.3 映射模式设备环境保持跟踪程序员采用的映射模式。设置映射模式可以指定调用参数中以英寸或者厘米作为度量单位的坐标 x和y,每个绘图函数则可以自动确定绘制多少像素。可用的映射模式如下表所示。表1-1 可用的映射模式模式使 用 说 明M M _ T E X T这是缺省的映射模式,坐标值x和y精确地等于一个屏幕像素或者一个打印机的打印点,y的正方向沿屏幕或者打印页向下M M _ H I E N G L I S Hx和y值为屏幕或者打印页上一英寸的 1/1 0 0 0。窗口决定当前屏幕设备应该有多少个像素等于1/1 0 0 0英寸。Y的方向则为沿屏幕或者打印页向上M M _ L

36、 O E N G L I S Hx和y值为设备上一英寸的1/1 0 0 0,y向上为正M M _ H I M E T R I Cx和y值为设备上一毫米的1/1 0 0,y向上为正M M _ L O M E T R I Cx和y值为设备上一毫米的1/1 0,y向上为正M M _ T W I P Sx和y值为设备上一英寸的1/1 4 4 0,y向上为正。这个模式通常应用于绘制文本,一 t w i p等于一个字体点的1/2 0M M _ A N I S O T R O P I C程序员通过设置接下来将讨论的窗口和视口以决定 x和y代表多少像素M M _ I S O T R O P I C同上,但x和

37、y代表的像素数必须相等1.3.4 窗口视和视口视M M _ A N I S O T R O P I C和M M _ I S O T R O P I C映射模式允许程序员自定义将坐标 x和y换算为像素数的转换比率。这个工作由定义两种叫做视的矩形来完成。首先应该定义一个代表将要绘制的整个区域(例如:0,0,1 0 0 0,1 0 0 0)的矩形,然后定义一个代表那些最终出现绘图结果的屏幕或打印机上的对等坐标(例如:0,0,5 0 0,5 0 0)的矩形。第一个矩形叫做窗口视6第第第一部分第基础下载(Window Vi e w),第二个矩形叫做视口视(Viewport Vi e w)。如果在设备环境

38、中定义了这两个矩形,并使用上述两种映射模式之一,那么使用窗口视坐标的图形将自动地被转换为使用视口视的坐标。除了视口视的坐标之外,程序员可以缩小、放大以及颠倒自己的图形,而不需要改变其他任何东西。1.3.5 逻辑单位和设备单位使用除M M _ T E X T以外的绘图模式绘图的时候,传递给绘图函数的坐标采用逻辑单位(Logical Unit)。逻辑单位可以是英寸、厘米或者像素。绘图函数本身则用设备单位绘图。举一个例子,直线绘图函数可能使用 2 5 4个像素代表一个1英寸的逻辑单位,这里的数字 1就是逻辑单位数值,而数字2 5 4则是设备单位(Device Unit)数值。这并不会成为一个问题,除

39、非打算让用户能够使用鼠标绘图。鼠标传回给应用程序的任何坐标都是以设备单位计量的数值,因此必须使用一些Windows API将这些坐标值转换为逻辑单位数值。1.3.6 绘图函数Windows API具有多个绘图函数,举例如下:画点函数:如S e t P i x e l()。画线函数:如L i n e To()、A r c()、P o l y l i n e()。画图形函数:如R e c t a n g l e()、P o l y g o n()、E l l i p s e()。填充和图形反转函数:如F i l l R e c t()、I n v e r t R e c t()、F i l l R

40、 g n()。滚屏函数:S c r o l l D C()。文本绘制函数:如Te x t O u t()、D r a w Te x t()。位图和图标绘制函数:如D r a w I c o n()、B i t B l t()。1.3.7 抖动和非抖动颜色所有可用的绘图函数,包括从画线到画图形和文本,都需要使用颜色。但是,除非系统具备足够的显示内存,否则颜色将必须利用抖动(D i t h e r e d)方式。所谓抖动颜色实际上是一些主要颜色的集合,在显示的时候通过几个颜色相互混合以获得某种理想的色彩。对大多数情况,抖动颜色已经足够了。然而,由于抖动颜色显得比较模糊,对图像应用程序而言通常不足以

41、达到要求。图像应用程序不希望线条与其包围的图形颜色相互渗透混合。对图像应用程序可以有以下几种选择方案:增加更多的显示内存。需要颜色抖动的理由在于,虽然屏幕上的每个像素都具有自己的R G B颜色。但一般的系统都没有足够的显示内存来为每个像素存储其R G B值。例如,设每个像素为 3 2位,那么一个 8 0 06 0 0像素的屏幕就需要 2 M字节的显示内存以容纳所有的颜色值。只用标准颜色绘图。Wi n d o w s使用的显示卡保证了至少能定义 2 0种标准颜色,因为它需要使用这些颜色来创建抖动效果。配置自己的颜色。除了标准颜色以外,显示卡还有一些空间可定义 2 0 0多种颜色,可以在设备环境调

42、色板内定义这些颜色并只用这些颜色绘图。多数图像应用都采用了这种方法,此方法将在实例3 1中得到详细描述。第 1 章第概第第述第第7下载1.3.8 设备无关位图每个像素都有自己的R G B颜色,每种颜色的数值范围可以为 02 5 4。一排同样颜色(例如黑色)的像素在屏幕上显示一条直线,一个具有不同颜色像素的矩形就可以创建任何图像。将这些像素的色彩数值存到一个文件中就得到了一个位图文件。这个文件的头不仅要指示文件包含了多少颜色值,而且还要指出多少颜色值组成一排。如果位图文件中的每个颜色值都包含完整的 R G B数值,那么,由于这个颜色值完全在位图中得到定义,这个文件就是一个设备无关位图。如果每个颜

43、色值实际上都是对某个颜色表的字节索引,那么,在它同时包含了这个颜色表的情况下,这个文件仍然是设备无关的。像这样的颜色索引常用于压缩位图的大小。一个 8位索引只占用3 2位R G B值空间的四分之一。设备无关位图(Device Independent Bitmaps)由对颜色表的索引组成,这个颜色表在系统的显卡中被定义。这就是在上节的第 3步为显示非抖动颜色而配置的颜色表,如果某个位图指向它的话,那么这个颜色表将不能独立于设备之外而存在。1.3.9 元文件除了在屏幕或者打印机上绘图,还可以在文件中绘图,这样的文件就是元文件(M e t a f i l e)。元文件的优点在于:无论绘制的内容是什么

44、,它们都将完整地重现。由于元文件可以伸展得到更好的效果,而位图进行伸展时会扭曲变形,所以元文件优于用位图的形式存储图像。1.3.10 何时绘图看起来这个话题可能有点傻,但对一个多任务操作系统而言,应用程序之间不得不争夺屏幕上有限的显示空间。哪怕只是在自己的窗口中绘图,也不可能想做什么就做什么。通常只是在窗口接收到 W M _ PA I N T消息或者W M _ D R AW I T E M消息(针对所属的控件窗口)的时候才绘图。系统仅在窗口被部分遮盖以及由于关闭其他窗口而显现出来的时候才发送这些消息。或者说,如果需要重画以显示新的信息,系统在这种情况之下将发送这些消息。1.4 MFC基础到目前

45、为止,我们只讨论了应用程序可以从 Windows API中所获得的功能。但A P I并不是面向对象的。例如,使用A P I不可能在创建一个窗口实例之后再调用其成员函数作用于该窗口。并且,不能从窗口类派生出一个可以加入自己所需功能的类,比方说,不可以增加自己的窗口处理过程。微软基础类库所要做的就是向应用程序提供可以访问 Windows API的一种模拟面向对象的访问方式。在功能上,每个 M F C类都紧密结合一种Wi n d o w s资源对象(如窗口),而A P I函数则控制该资源。举个例子,M F C的C W n d类创建并控制窗口。而操作系统一创建窗口就会开辟一块叫做Wi n d o w对

46、象的管理内存,然后返回该对象的指针,也就是窗口句柄。MFC CWnd类则以成员变量的形式存储这个句柄,并且由 C W n d的成员函数调用该变量来控制该窗口。例如,C W n d的M o v e Wi n d o w()成员函数调用Windows API:MoveWi n d o w()来移动属于该窗口句柄的窗口。因为M F C是用C+写成的,所以,程序员可以从C W n d类派生自己的类并在其中增加所需功能。8第第第一部分第基础下载但是,因为这只是面向对象设计的一个模拟,所以 M F C类对操作系统内部工作的控制能力并不会比任何其他A P I调用更多。例如,如果对窗口打开方式的修改是 A P

47、 I的内部功能,那么即使使用M F C类来试图改变这一方式也是不可能的。创建和销毁M F C类创建M F C类是一个棘手的问题。对封装了类似窗口系统资源的 M F C类来说,程序员不仅要创建自己的M F C类的实例,还要调用该类的成员函数来创建该系统资源。因此 M F C类的创建几乎总是分成两步走:1)创建一个类的示例;2)创建系统资源。注意为什么M F C类不仅仅只是简单地在它们自己的构造函数内创建系统资源呢?这是因为,创建系统资源是否成功是不可能预先知道的,而类的构造函数又难于访问(它甚至不返回错误状态),利用成员函数来完成这一工作则要容易得多。销毁M F C类也同样棘手。如果类的实例首先

48、被销毁,那么它将简单地在其析构函数内销毁资源。然而,如果开始就没有资源,那么 Windows API也就没有办法知道有一个 MFC 类实例必须被销毁。令人惊奇的是,这只是存在于 C W n d类和窗口资源之间的问题,其他类型的资源并不由用户销毁。但是用户可能通过单击窗口的关闭按钮来关闭窗口,在这种情况下,不知何故,C W n d对象必须知道足够的信息来销毁自己以防止出现内存泄漏。幸运的是,当窗口资源被销毁时,它会发送一个消息,而C W n d对象可以捕获这个消息以用于销毁自身。因为M F C类对象和系统资源是两种不同实体,所以可以通过编程的方法将两者分开或者重新组合在一起。例如,通过调用 A

49、t t a c h()函数可以将一个C W n d类对象附着于一个已经存在的窗口对象上。所有控制系统资源的 M F C类都具有A t t a c h()函数和D e t a c h()函数。1.5 Developer Studio基础为了将 M F C类恰当地运用于应用程序,Developer Studio(开发平台)提供了几种向导(Wi z a r d)工具和编辑器工具:A p p Wizard 用于生成应用程序所需要的基本类文件。所产生的类都派生于 M F C类,它们在编译后与M F C库链接以创建应用程序。C l a s s Wizard 用于创建应用程序额外的文件或者为已有的类增加新的

50、成员函数。这些被创建的类可以由M F C派生。Dialog Editor 用于创建对话框模板,方法是将控件窗口图标拖到一个空白的框架窗口内。被创建的模板作为应用程序的资源存储,然后用于在运行时候创建对话框。C l a s s Wi z a r d可以直接从Dialog Editor调用以创建一个对话框类,该类则负责创建对话框。Toolbar Editor 用于创建工具栏和位图资源,而这些资源则又用于创建应用程序的工具栏。C u r s o r、I c o n和Bitmap Editor 是简单的图像编辑器,用于创建应用所使用的光标、图标和位图资源。Menu Editor用于创建应用中的菜单条和

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com