VC MFC 编程实例1.pdf
《VC MFC 编程实例1.pdf》由会员分享,可在线阅读,更多相关《VC MFC 编程实例1.pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 本文由s d h e x u 贡献 p d f 1。下载 第一部分 基 础 知 识 用 V i s u a l C+和 M F C 创 建 的 应 用 程 序 大 多 会 自 动 生 成 窗 口,并 且 可 以 处 理 消 息,进行绘图.M i c r o s o f t 在 这 方 面 做 了 大 量 的 工 作,隐 藏 了 内 部 工 作,使 我 们 能 够 更 轻 松 地创建一个一般的应用程序.然而,当用户不能实现他们想要实现的功能时,适当地 了解内部工作机制,对于消除编程上的困惑会有好处.更重要的是,知道怎样执行任 务(诸如把窗口放置到什么地方,从什么地方获得一个消息和在任意地方绘图
2、),有助 于分清用户的应用程序和由 Vi s u a l C+和 M F C 自 动 提 供 的 限 于 窗 口,消 息 和 绘 图 的 应 用程序.Vi s u a l C+应用程序有四项主要基本知识:创建一个窗口,了解其他的 M F C类,把消息 发送到一个窗口和在一个窗口内绘图.当然还有其他一些基本知识,我们也将在涉及时适当 地进行讨论.不过本部分将讨论以下四项基本知识.窗口 在第1章中,我们首先讨论在使用和不使用 MFC的情况下创建一个窗口,以便清楚地了解 M F C是如何工作的.M F C窗口既可以由属于 M F C的C+类创建,也可以由一个早于并存在于 M F C之外的非 C+窗口
3、类创建.我们将进一步观看窗口类并讨论那些由 Wi n d o w s 操作系统提 供的窗口类.最后,再看看 MFC应用程序中都有什么.类 在第2章中,我们将全面地讨论 M F C提供的强大的功能.大多数 M F C类是从三个 M F C基 类(C O b j e c t,C W n d 和C C m d Ta r g e t )派生来的.并讨论构成一个应用程序的 M F C类,支持窗口 界面的 M F C 类,用来绘图的类,访问文件的类,维护数据和数据库的类和访问因特网(In t e r n e t)的MFC类.消息处理 在第3章中,我们将讨论一个 MFC应用程序是怎样通过消息与外界及应用程序
4、进行通信的.还将讨论四种消息类型,并跟踪一个消息通过接收消息的类.最后将探讨该路径上的重定向 消息.绘图 在第4章中,我们将讨论在窗口中绘图的方法,包括绘图工具,绘图用的颜色,在屏幕或 打印机上绘图,绘制位图和图标,绘制矩形和圆,绘制动画.下载 第1章 窗 口 在本章中,我们将讨论 M F C用户界面的基本要素:窗口.在此基础上比较 A P I 窗口和 M F C窗口的异同,描述如何创建一个窗口,销毁一个窗口和控制 Wi n d o w s 操作系统与窗口的 通信问题.1.1 窗口和API环境 窗口是屏幕上的一个矩形区域,应用程序在该区域中显示数据并等待鼠标点击.Wi n d o w s 应用
5、系统的用户界面可以包含许多窗口,每个窗口都有不同的特点,但都是互相联 系的,如图 1-1所示.窗口 应用程序的主窗口 窗口 窗口 窗口 图1-1 Wi n d o w s 应用程序用户界面包括的窗口 1.1.1 三种类型窗口 在这么多窗口中,基本类型只有三种:重叠(Ov e r l a p p e d)窗口,弹出(Po p u p)窗口和子窗口(C h i l d ).在它们之间并没有太多内在的差异,但是使用不同的窗口风格,它们的外观是不同 的(见图1-2).重叠窗口 窗口.弹出窗口 通常以对话框和消息框的形式与用户对话.子窗口 通常用在视图(Vi e w)中,如在文本编辑器中的文本显示,也用
6、在控件中,如在对 话框中的OK按钮.而对那些看起来像按钮或控件的子窗口,也称为控件窗口.重叠窗口和弹出窗口的主要区别是弹出窗口出现p a g e 1时可以没有标题(也称为标题栏).子窗口 与重叠窗口或弹出窗口的主要区别是子窗口只能出现在另一个窗口中,并且子窗口的任何多 余部分都被该窗口移去或剪切掉.另外,子窗口是唯一不能有菜单条的窗口.参见图1-3中的Wi n d o w s 应用程序,其中包括重叠窗口,弹出窗口和子窗口.通常用于建立应用程序主窗口.事实上,有时也叫做主窗口或者框架 下载 重叠窗口 最基本的 窗体 第1章 窗 口 3 弹出窗口 注意:在它的最基 本的窗体中,系统 不进行任何绘制
7、.窗口都是客户区 子窗口 注意:在它的最基 本的窗体中,系统 不进行任何绘制.窗口都是客户区 典型的外观 注意:这都是客户区.子 窗口通常自己进行绘制 共同的设置 注意:子窗口不能有子菜单 图1-2 窗口风格可以用来区分三种不同类型的窗口 不是一个窗口 显示在子窗口中,并由子窗口绘制 属于桌面的重叠窗 口,也称为主窗口 属于主窗口的弹 出窗口 属于主窗口的子窗口 属于弹出窗口的子 窗口,它位于弹出 窗口之中 图1-3 由重叠窗口,弹出窗口和子窗口组成的窗口应用程序 1.1.2 客户区和非客户区 每个窗口都有由系统绘制的非客户区和由应用程序绘制的客户区.系统可以绘制 图1-4显示的其中一个或者全
8、部特征,当然也可以把所有的特征留给你去绘制.任务栏 应用程序图标 最小化按钮 最大化按钮 菜单条 关闭按钮 垂直滚动条 水平滚动条 系统菜单(单击应用程 序图标时,显示虚线框)客户区 图1-4 窗口的非客户区可以由系统选择绘制 每个窗口代表内存中的一个窗口对象,并由该窗口对象告诉 Wi n d o w s 操作系统将窗口绘 制在何处,以及在对鼠标单击,键盘按下(假设该窗口拥有输入焦点)和时钟终止等事件作出响 4 图1-5).第一部分 基 础 知 识 下载 应时应调用什么应用程序.窗口对象自身是窗口类的一个实例,它不是 Vi s u a l C+的类,而是 存在于Vi s u a l C+之外,
9、并早于Vi s u a l C+的Mi c r o s o f t Wi n d o w s 所属的类.然而,就像 C+的 类一样,窗口类为每个基于它创建的窗口定义了若干特征,如背景色和往何处发送消息等(见 窗口对象 窗口类 窗口 使用 Re g i s t e r Cl a s s()函数创建窗口类 窗口对象由 Cr e a t e Wi n d o w()窗口管理器保持一个窗口对 函数创建,作为它的变量传 象列表,并告诉每个对象在 输窗口类 屏幕上绘制自己 图1-5 Mi c r o s o f t Wi n d o w s 所属的窗口类创建的窗口对象 Wi n d o w s 操作系统提
10、供了一个扩展的应用程序接口(A P I),可以用来创建和维护这些窗口 对象.调用 C r e a t e Wi n d o w()函数可以创建一个窗口对象;调用 S e t Wi n d o w Lo n g()函数可以改 变由窗口类定义的特征;调用 Mo v e Wi n d o w()函p a g e 2数可以移动窗口;调用 De s t r o y Wi n d o w()可以 退出窗口.如此说来,MFC又能做些什么呢?1.2 窗口和MFC环境 M F C窗口是 C+和Wi n d o w s API 调用的综合.事实上,M F C窗口提供了许多(但不是全 部)Wi n d o w s
11、API的C+封装,从而减轻了编写 Wi n d o w s 应用程序时一些乏味的工作,并提供 了一些新的服务.M F C窗口不对窗口对象进行直接控制,而在 A P I环境中却是可以的.如果不能在 A P I环境 中实现某项功能,那么肯定也不能在 M F C环境中实现.举例来说,M F C库的C W n d 可以创建 一个窗口,但它只是过去在 API环境中使用的API调用的封装.微软已经把在 M F C库中创建和维护一个窗口的逻辑作为真正的 C+封装和控制.然而,这种方法虽使得 MFC库万能,但却是不方便的,并导致了严重的冗余和更多的错误.创建M F C窗口是复杂的,首先,创建类 C W n d
12、 的一个实例,然后调用类 C W n d 的一个成员 函数,该成员函数调用 API中的Cr e a tWi n d o w()函数.返回的窗口句柄(这只是指向窗口对象的 非直接指针)保存在类CWnd 的成员变量 m _h Wn d 中.注意 因为窗口在内存中创建,而内存经常发生变化,窗口地址可能是经常变化的.因 此,窗口句柄并非直接指向窗口对象,而是指向跟踪窗口对象地址的另一个指针.销毁窗口同样也是复杂的,必须确保销毁了该窗口对象,以及封装该窗口对象的 CWn d 实 例.虽然CWn d 对象知道窗口对象,但是窗口对象并不知道 CWn d 对象(见图1-6).下载 窗口对象 窗口类 CWn d
13、 类对象 第1章 窗 口 5 窗口 首先,用 Af x Re g i s t e r Cl a s s()函数创建一个窗口类 然后,在堆栈上 或堆中创建一个 CWn d 类对象 调用 CWn d 的成员函数 Cr e a t e(),该函数自身 调用图 1-4中看到的:Cr e at e Wi n d o w()函数 :Cr e a t e Wi n d o w 窗口管理器告知 再次创建窗口;每个窗口对象在 窗口句柄保存到 屏幕上绘制自己 CWn d 中 图1-6 应用两个对象创建MFC窗口 尽管窗口应用程序的用户界面可以由几十个,甚至几百个窗口构成,但是大多数窗口还 是由不到十个的窗口类创建
14、的.即使在应用程序中有一千个窗口,每个窗口也只能是三种基 本类型之一:重叠窗口,弹出窗口或子窗口.1.3 怎样应用MFC创建一个窗口 可以用MFC的CWn d 类创建一个窗口:CWn d w n d;BOOL b=w n d.Cr e a t e Ex (Ex St y l e,Cl a s s Na m e,Wi n d o w Na m e,St y l e,x,y,Wi d t h,He i g h t,Pa r e n t,Me n u,Pa r a m);第一行代码创建了一个CWn d 类的对象,第二行通过调用Wi n d o w s API函数Cr e a t e Wi n d o
15、 w Ex()创建了真正的窗口.HWND h w n d=:Cr e a t e Wi n d o w Ex (Ex St y l e,Cl a s s Na m e,Wi n d o w Na m e,St y l e,x,y,Wi d t h,He i g h t,Pa r e n t,Me n u,In s t a n c e,Pa r a m);因为C W n d 类只是封装了用于创建窗口的 Wi n d o w s API函数(C r e a t e Win d o w Ex(),因此,从本质上讲,创建窗口所必须的参数在 API环境和MFC环境中是相同的:参数St y l e 和Ex
16、 St y l e 决定窗口的外观和类型(重叠,弹出,子窗口).参数Cl as s Na m e 决定在创建窗口时使用的窗口类.参数Wi n d o w Na m e 决定窗口标题内容(如果窗口标题有内容).参数x,y,Wi d t h 和He i g h t 决定窗口的位置和大小.参数Pa r e n t 指向拥有该窗口的窗口指针(如果有这样的窗口).参数M e n u 指向内存中的一个对象,作为它的菜单使用 除非创建一个子窗口,如果 是这样的话,那么该参数是帮助父窗口识别子窗口的 IDn u m b e r.参数In s t a n c e 识别该窗口属于哪个应用程序,以便发送到p a g
17、 e 3该窗口的消息能被发送到正确 的应用程序的消息队列中.CWn d 类填入In s t a n c e 参数.参数Pa r a m 是在创建窗口时由窗口类使用的指针,该指针是指向附加信息的非强制性结 构的指针.返回的h w n d 参数是指向创建的窗口对象的指针,但在未创建任何窗口时,该参数返回值为 NULL.窗口句柄自动地保存在 CWn d 类的m _h Wn d 成员变量中,这在前面的图 1-6中可以看到.6 规则.规则 第一部分 基 础 知 识 下载 现在既然已了解了有关创建窗口的基本知识,那么让我们进一步来看看填写这些参数的 1.窗口名称参数 该参数是一个零结尾的文本串,用该串指明
18、在窗口标题栏中显示的内容.如果窗口没有 标题栏,该参数可以为零(0).然而,某些通用控件也使用该参数.例如,按钮控件把该参数的内容放在按钮的表面.在创建窗口标题栏后,可以用类 CWn d 的成员函数 Se t Wi n d o w Te x t()来改变窗口标题栏的名称.2.风格和扩展风格参数 这两个是 3 2位的参数,用来指定创建什么类型的窗口.可以选择多种类型,如下面的例 子所示:,WS_CHILD|WS_VISIBLE,窗口风格参数的作用包括:用于创建三种基本窗口类型的风格,用 W M _ C H I L D创建一个子窗口;用 W M _ P O P U P 创建一个弹出窗口.W M _
19、 O V E R L A P P E D创建一个重叠窗口.如果不为窗口指定任何一种风格,那么窗口 风格默认为 WM_OVERLAPPED.用以增添窗口的非客户区特色的风格.例如,可以用 W S _ V S C R O L L为窗口添加一个 垂直滚动条,如图 1-7所示其他非客户区窗口风格.若在Cr e a t e Wi n d o w()中定义 了菜单条,则菜单条出现,它不是一个子窗口(使窗口可视)(禁止窗口输入)如果选取了最小化或最大化按 钮则关闭按钮出现 图1-7 非客户窗口风格用来增添窗口的特色 由每个通用控件定义的风格.例如,B S _ F L AT按钮风格告诉按钮控件绘制一个二维按
20、钮.用来使窗口可视,可操作和/或初始最大化的风格.用来标识控件组起始控件的风格,或者当用户敲击 Ta b 键控制焦点在窗口中变化时,用 来指示哪个控件有资格获得输入焦点的风格.想了解更多的有关窗口风格的例子,请参阅附录 A.在创建窗口以后,可以用 C W n d 的成员函数Mo d i f y St y l e()和Mo d i f y St y l e Ex()改变窗口风 格.某些风格可能要求重画窗口,这时,可以给 Mo d i f y St y l e()函数添加第三个参数,自动激 发类CWn d 的成员函数 Se t Wi n d o w Po s()做重画窗口工作.下载 CWn d w
21、 n d;w n d.Mo d i f y St y l e (0,WS_BORDER,SWP_NOZORDER);第1章 窗 口 7 事实上,给 M o d i f y S t y l e ()或M o d i f y S t y l e E x ()添加任何第三个参数,都需要添加下面的 S e t Wi n d o w Po s()选项:S W P _ N O Z O R D E R,S W P _ N O M O V E,S W P _ N O A C T I VAT E和 SWP_SHOW.注意 有时p a g e 4候,甚至一个重画的窗口可能与新风格不相容,尤其对通用控件窗口来说更
22、是这样.因为单个窗口决定重画窗口时使用什么风格.在这种情况下,唯一的办法是:在事先存储已有窗口的风格和其他参数后,销毁和重建该窗口.3.X 和Y位置参数 这是两个 3 2位的参数,用于以像素为单位指定窗口的位置.创建重叠窗口和弹出窗口时,X和Y是相对于桌面窗口左上角的位置.而创建子窗口时,X和Y是相对于父窗口客户区的左 上角位置.如果把 X和Y参数都设置为 C W _ U S E D E FA U LT,那么系统将自动为窗口选定一个 位置.系统层叠排列这些新窗口(见图1-8).第一窗口 下一个窗口 第三个窗口 图1-8 CW_USEDEFAULT允许系统自动设定窗口位置 然而,如果 X和Y参数
23、都设置为 C W _ U S E D E FA U LT,那么子窗口在创建的时候,总被创 建在(0,0)的位置.创建窗口以后,可以用类 CWn d 的成员函数 Mo v e Wi nd o w()移动窗口.4.宽度和高度参数 这是两个 3 2位的参数,用于以像素为单位指定窗口的大小.如果将参数 Wi d t h 和H e i g h t 都 设置为CW_USEDEFAULT,则系统将根据桌面窗口的大小,自动选定窗口的大小.然而,对 于一个子窗口来说,系统将创建一个长和宽均为 0的窗口.如果窗口的风格是 W S _ M I N I M I Z E 或WS_MAXIMIZE,那么系统将忽视用户为
24、Wi d t h 和He i g h t 设置的任何值.创建窗口以后,可以用类 CWn d的成员函数 Mo v e Wi n d o w()重新设置窗口的大小.5.Z-Or d e r 当几个窗口占据屏幕上同一区域时,Z-O r d e r 决定哪个窗口显示在哪个窗口之上.Z O r d e r (Z顺序)中的Z来源于坐标 X-Y-Z轴的Z轴,其中 Z轴垂直屏幕,并由屏幕指向外面.当窗 口最初被创建或选中时,则窗口将出现在 Z-O r d e r 的顶层.然而,该窗口永远不可能出现在一 个最顶层窗口的上面,除非该窗口也是最顶层的窗口.最顶层窗口用 W S _ E X _ TO P M O S
25、T 窗口风格创建,并显示在所有非最顶层窗口的上面,而与该窗口是不是当前选中的窗口无关.创建窗口后,可以用 CWn d 的成员函数 Se t Wi n d o w Po s()改变窗口的Z顺序.6.父窗口或物主窗口参数 该参数是指向类 CW n d 对象的指针,根据创建的窗口类型标识是父窗口还是物主窗口 8 第一部分 基 础 知 识 下载 (Ow n e r):如果创建的是一个子窗口,那么用该参数来标识它的父窗口(该子窗口所放置的并为之 所截断的窗口).该值不能为 N U L L.子窗口只能出现在它的父窗口里面,当父窗口被 销毁时它们也被销毁,并且当父窗口被隐藏或最小化时它们也被隐藏.如果创建的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC MFC 编程实例1 编程 实例
限制150内