VC MFC 编程实例1.pdf

上传人:asd****56 文档编号:70332745 上传时间:2023-01-19 格式:PDF 页数:11 大小:26.60KB
返回 下载 相关 举报
VC MFC 编程实例1.pdf_第1页
第1页 / 共11页
VC MFC 编程实例1.pdf_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《VC MFC 编程实例1.pdf》由会员分享,可在线阅读,更多相关《VC MFC 编程实例1.pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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.子窗口只能出现在它的父窗口里面,当父窗口被 销毁时它们也被销毁,并且当父窗口被隐藏或最小化时它们也被隐藏.如果创建的

26、是重叠窗口或弹出窗口,用该参数来标识物主窗口.如果该值为 N U L L,则桌面窗口成为物主窗口.从属窗口总是显示在它们的主窗口上面,并且随着物主窗 口的销毁而被销毁;物主窗口最小化时,则从属窗口被隐藏;但当物主窗口被隐藏时,从属窗口并不被隐藏.一个子窗口可能是另一个子窗口的父窗口,但绝不可能是一个物主窗口.如果试图使一 个子窗口成为一个物主窗口,那么系统只能使那个子窗口的最顶层窗口作为物主窗口.图 1-9 是这些关系的概述.子窗口对象被创建,并显示在父窗口中 重叠或弹出窗口对 象被创建,并显示 在屏幕上 弹出或重叠窗口对象 被创建,并显示在父 窗口中 图1-9 物主,父,子窗口的层次关系 可

27、以用 C W n d 的成员函数 Se t Ow n e r()改变已有窗口的物主窗口,用 C W n d 的成员函数 Se t Pa r e n t()改变父窗口.7.菜单或控件 ID参数 该参数用来标识菜单(M e n u )句柄或控件(Co n t r o l )ID,这要依赖于创建的窗口是子窗口,重叠窗口,还是弹出窗口.p a g e 5 如果创建的是一个子窗口,用该参数标识控件 I D,控件I D通常用来帮助父窗口识别子 窗口.因为该参数寻求一个 H M E N U变量,因此,需要用 H M E N U类型重载变量定义控 件ID.例如,如果子窗口的控件 ID是102,应该用如下方法定

28、义它:,(HMENU)102,如果创建的是一个重叠窗口或弹出窗口,用该参数定义窗口的菜单.若该值为 N U L L,则菜单默认为在该窗口的窗口类中定义的任何菜单;如果窗口类也没有指定的菜单,则该窗口在创建时没有菜单.可以用下面的方法为该参数加载一个菜单:HMENU h Me n u=:Lo a d Me n u (Af x Ge t In s t a n c e Ha n d l e(),MAKEINTRESOURCE(x x);下载 这里的x x 是应用程序资源里面的菜单 ID(Me n u ID).第1章 窗 口 9 可以用CWn d 的Se t Dl g Ct r l ID()改变已有子

29、窗口的 ID.用类CWn d 的成员函数 Se tMe n u()改 变一个重叠窗口或弹出窗口的菜单.8.实例 前面已提到,CWn d 类将填入该参数.CWn d 通过调用Af x Ge t In s t a n c e Ha n d l e()获得该实例(In s t a n c e).一个应用程序的实例从本质上标识了哪个程序在内存里.Af x Ge t In s t a n c e Ha n d l e()是由MFC库提供的静态函数.9.参数 该3 2位参数(P a r a m e t e r )是可选的.它通常是指向一个结构或者类对象的指针,而该结构 或者类对象是创建某种类型的窗口时需要

30、提供的.例如,当用 MDICLIENT窗口类创建窗口时,需要该参数提供一个 CLIENTCREATESTRUCT结构的指针.10.类名参数 类名(Cl a s s Na m e)参数是一个零结尾字符串,当创建一个窗口时,用来标识使用那个窗口 类.关于窗口类和窗口处理,将在本章后面的内容中详细讨论.该参数不能为 NULL,在创建 一个非常一般的 MFC窗口时,使用Af x Re g i s t e rWn d Cl a s s (0)填入该参数.1.4 怎样使用MFC销毁一个窗口 如前面所提到的一样,删除一个 M F C窗口可能有些烦琐,必须按下面的顺序删除两个对 象:p Wn d-De s t

31、 r o y Wi n d o w();/d e s t r o y s Wi n d o w Ob j e c t d e l e t e p Wn d;/d e s t ro y s Cw n d Ob j e c t 也可以只删除 C W n d 对象,因为 D e s t r o y Wi n d o w()是从C W n d 的析构函数中调用的,但不 提倡使用这种方法.销毁一个窗口而不先调用 De s t r o y Wi n d o w()函数,将使某些析构消息不能 被任何从CWn d 派生的类处理.你几乎不需自己销毁一个窗口,用户或系统通常会做这项工作.如果需要在销毁窗口的同时销

32、毁 C W n d 对象,则应该在 C W n d 的派生类中添加下面的重载函 数:CYo u r Wn d:Po s t Nc De s t r o y()d e l e t e t h i s;Po s t Nc De s t r o y()是销毁窗口前调用的最后一个成员函数.但是,几乎不需对该函数进行 重载,因为 CWn d 和派生类一般是嵌在另一个类中或建立在堆栈中的.1.4.1 捆绑到一个已有的窗口 如果一个窗口是用 Wi n d o w s API在应用程序建立之前或外面创建的,并且需要把它封装到 CWn d 类中,可以用下面的语句实现:CWn d w n d;w n d.At t

33、 a c h (h w n d);这里的h w n d 是已有窗口的句柄.At t a c h()只是把CWn d 的成员变量 m _h Wn d 赋给hw n d.也可以使用CWn d:Fr o m Ha n d l e (h w n d),它查看是否有 C W n d 对象已经封装了该窗口句柄 并返回该 C W n d 对象的指针.如果不存在这样的 C W n d 对象,将创建一个临时对象.如果是临 10 第一部分 基 础 知 识 下载 时对象,则不要使用该指针,因为在应用程序空闲的时候,该指针指向的对象将被删除.1.4.2 窗口类 前面已提及,一个窗口类不是一个 C+类,而是早于并存在于

34、 C+之外的窗口专有的类.窗口类的作用就像一个模板,可以由此创建其他窗口,并可共享某些特征,包括下面所示的 特征:类风格 包括能给予窗口的一些微小的特征.类p a g e 6图标 类菜单 如果窗口有图标,用它来指定在窗口的左上角处所画的图标.如果窗口有菜单,用它来指定窗口中显示的菜单.类光标 当光标通过窗口的客户区时,用它来指定显示哪种鼠标形状.背景色 定义用什么颜色来擦除窗口的背景色.窗口的客户区将显示该颜色.窗口进程 定义处理任何发送到该窗口的消息时应该调用的函数.定义窗口进程可能是窗 口类唯一最重要的前提.1.4.3 窗口进程 窗口与环境的交互是通过发送和接收消息来实现的.如果系统要求窗

35、口自己进行绘制,系 统给 它 发 送 一个 W M _ PA I N T 消 息;如 果 系 统要 求 窗 口 销毁 自 己,则发 送一个 W M _ D E S T R O Y消息.这些消息都由窗口的窗口进程处理,该窗口进程的地址在窗口类中定 义.对于发送到由相同的窗口类创建的窗口的消息,系统采用完全相同的窗口进程进行处理.相同的窗口进程是怎样跟踪所有的窗口的呢?它是怎么知道窗口 A画在(1 0,3 4),而窗口 B画在(56,21)呢?所有这些工作的完成只需使用窗口的窗口对象.例如,所有用按钮窗口类创建的窗口,都使用相同的按钮窗口进程.如果一个 WM_PAINT消息发送到其中任何一个窗口,

36、则按钮窗口进程根据每个窗口的窗口对象指定的 大小,位置和风格画出确切的按钮(见图1-10).窗口对象 BUTTON的窗口进程搜索窗口对象,以 查明绘制什么类型的按钮,如果风格是 Ch e c k Bo x ,则绘制一个复选框 父窗口 用BUTTON窗 口类创建的窗口 通过发送一个WM_PAINT 消 息到窗口进程,窗口管理器 告诉每个窗口绘制自己 如果风格是 Pu s h Bu t t o n,则窗口进 程绘制一个按钮 窗口进程也搜索窗口对象以 查明在哪里绘制这些控件窗 口 图1-10 按钮窗口进程使用窗口对象指定对哪个窗口进行操纵 下载 1.5 怎样使用MFC创建一个窗口类 第1章 窗 口

37、11 当用户创建一个窗口类时,实际上只是在三个操作系统列表之一中注册一个 W N D C L A S S 结构.系统为每个窗口类类型维护一个列表:系统全局类(Sy s t e m Gl ob a l Cl a s s)有效.应用程序全局类(Ap p l i c a t i o n Gl o b a l Cl a s s)的线程有效.应用程序局部类(Ap p l i c a t i o n Lo c a l Cl a s s)由应用程序注册,并只对注册它们的应用程序 或DLL有效.当系统搜索一个窗口类时,从应用程序局部类开始,然后搜索应用程序全局类,最后搜 索系统全局类.要创建一个窗口类,可以先

38、创建 WNDCLASS结构的实例,然后用 MFC类库的Af x Re g i s t e r Cl a s s()注册它.也可以用 M F C类库的 Af x Re g i st e r Wn d Cl a s s()来创建一个基于调用参数的 WNDCLASS对象.1.5.1 使用Af x Re g i s t er Wn d Cl a s s()函数注册一个窗口类 Af x Re g i s t e r Wn d Cl a s s()函数在使用上是非常自动化的,一些通常需要你提供的参数都能 自己填入,甚至连新的窗口类的名字也能自动产生.LPCTSTR l p s z Cl a s s Na

39、m e=Af x Re g i s t e r Wn d Cl a s s(UINT n Cl a s s St y l e,HCURSOR hCu r s o r=0,HBRUSH h b r Ba c k g r o u n d=0,HICON h Ic o n=0);在系统启动时注册,且必须注册,对所有应用程序都 由应用程序注册,只对应用程序及应用程序 这些参数的使用规则如下:1.类名 根据传给该函数的参数,为新的窗口类产生名字.如果传输的参数完全相同,那么创建 的窗口类也将完全相同.如果需要创建新的窗口类,可以用 Af x Re g i s t e r Cl a s s().2.风格

40、窗口类风格由下面选项列表中一系列标记的或(OR)运算提供:类 风 格 CS_OWNDC CS_PARENTDC CS_CLASSDC CS_SAVEBITS CS_BYTEALIGNCLIENT CS_BYTEALIGNWINDOW CS_GLOBALCLASS CS_VREDRAW CS_HREDRAW CS_NOCLOSE CS_DBLCLKS 描 述 为为该窗口类创建的每个窗口分配唯一的设备环境.有关设备环境的更详尽资料 见第4章 为从系统高速缓存中检索设备环境,然后设置该设备环境的剪裁区,以组合到p a g e 7父 窗口中,以便子窗口能画在父窗口上 为分配一个设备环境给所有由该窗口类

41、创建的窗口使用 为由该类创建的任何窗口的视频存储区将被保存,以便窗口移动或关闭时,不需 要重画基础窗口 这对快速机器来说作用不大 为当计算机的显示卡和 C P U速度较慢时,这两种风格有用.添加这些风格后,当 窗口在字节边缘时,显示卡更容易移动窗口 为如果设置该风格,则该类是应用程序的全局类,否则它是一个应用程序局部类 为如果设置了垂直风格,并且窗口的垂直大小发生了变化,则整个窗口被重画.水平风格也这样 为禁用系统菜单中的关闭命令 为如果未设置该参数,并且双击由该窗口类创建的窗口,则传送给应用程序的将 不是双击事件,而是两个相继完成的单击事件 12 第一部分 基 础 知 识 下载 3.图标(I

42、c o n)该参数是显示在窗口左上角的图标的句柄,但只适用于使用 W S _ S Y S M E N U的窗口风格.应用程序主窗口的图标也显示在任务栏上.如果将该参数设置为 理过,用CWn d 的Se t Ic o n()可改变已有的图标.4.光标(Cu r s o r)该参数是鼠标移经应用程序窗口的客户区时,将要显示的鼠标光标句柄.如果将该参数 设置为NULL,则显示的是箭头光标.可以用下面的语句装载一个光标:HICON h Ic o n=Af x Ge t Ap p()-Lo a d Cu r s o r (x x);N U L L,并且设置了 W S _ S Y S M E N U风格,

43、则系统将提供一个默认的图标.在 M F C环境中,绝大部分图标已被处 这里的x x 是应用程序资源中光标的名字或 ID.这里指定的光标意味着是该窗口的默认光标.如果想动态地改变光标形状,则应该处理 该窗口的WM_SETCURSOR消息,并用 Se t Cu r s o r()来改变光标形状(见第8章例33).5.背景色 当系统创建窗口时,先在显示窗口的地方画一个矩形区域,以擦除该区域的背景色.该 参数指定填充该矩形域时所用画刷的句柄(参见第 4章有关画刷的详细内容).为窗口类创建的 画刷对象在该类退出注册时被自动释放.在指定背景色时,也可以不创建画刷对象,而指定下面所列系统颜色之一:COLOR

44、_ACTIVEBORDER COLOR_ACTIVECAPTION COLOR_APPWORKSPACE COLOR_BACKGROUND COLOR_BTNFACE COLOR_BTNSHADOW COLOR_BTNTEXT COLOR_CAPTIONTEXT COLOR_GRAYTEXT COLOR_HIGHLIGHT COLOR_HIGHLIGHTTEXT COLOR_INACTIVEBORDER COLOR_INACTIVECAPTION COLOR_MENU COLOR_MENUTEXT COLOR_SCROLLBAR COLOR_WINDOW COLOR_WINDOWFRAME C

45、OLOR_WINDOWTEXT 然而,必须分配颜色到一个画刷句柄类型,并加 1.(HBRUSH)(COLOR_WINDOW+1)设置该参数为 NULL,则在画一个窗口之前,系统不对窗口进行擦除.在非客户区的绘制 还是同平常一样,但客户区将保持窗口被画前原来屏幕所显示的样子.若该参数设为 N U L L,应确认窗口是画全部客户区,还是处理 WM_ERASEBRGND消息以擦除背景颜色.1.5.2 使用Af x Re g i s t e r Cl a s s()函数创建一个窗口类 如果想完全控制一个新窗口类的创建,如指定窗口类的名字,则应该用下面的语句:下载 BOOL AFXAPI Af x Re

46、 g i s t e r Cl a s s (WNDCLASS l p Wn d Cl a s s);第1章 窗 口 13 这里的WNDCLASS结构定义如下:t y p e d e f s t r u c t _WNDCLASS UINT s t y l e;WNDPROC l p f n Wn d Pr o c;/s t y l e o f t h e c l a s s /f u n c t i o n c a l l e d b y s y s t e m w h e n /i t h a s a m e s s a g e f o r a wi n d o w /c r e a t

47、e d w i t h t h i s c l a s s i n t c b Cl s Ex t r a;/e x t r a b y t e s t o a d d t o t h e /WNDCLASS s t r u c t u r e w h e n /r e g i s t e r i n g i n t HANDLE HICON HCURSOR HBRUSH c b Wn d Ex t r a;h In s t a n c e;h Ic o n;h Cu r s o r;h b r Ba c k g r o u n d;/e x t r a b y t e s to a d d

48、t o t h e Wi n d o w /Ob j e c t s c r e a t e d w i t h t h i s c l a s s /i n s t a n c e t h a t o wn s t h i s c l a s s /i c o n t o b e u s e d w h e n w i n d o w /d i s p l a y s a n i c o n /c u r s o r p a g e 8t o u s e w h e n m o u s e i s o v e r /a w i n d o w c r e a t e d w i t h t

49、h i s c l a s s /b a c k g r o u nd c o l o r t o u s e w h e n /e r a s i n g t h e b a c k g r o u n d a r e a u n d e r /a w i n d o w c r e a te d w i t h t h i s c l a s s LPCTSTR l p s z Me n u Na m e;/m e n u n a m e t o b e u s e d w h e n /cr e a t i n g a m e n u f o r a w i n d o w /c r e

50、 a t e d w i t h t h i s c l a s s LPCTSTR l p s z Cl a s s Nam e;/t h e c l a s s n a m e t h a t i d e n t i f i e s /t h i s WNDCLASS f o r t h e s y s t e m WNDCLASS;有关填入类的风格 图标 光标和背景色参数的规则参看前面部分的介绍,其余参数的填入规则如下:1.类名 类名参数是用来标识新窗口类的零结尾字符串.可以任意命名窗口类,但是不要与已有 的窗口类同名,除非想使该类无效.正如前面所提及的,系统从应用程序局部类开始,在三

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

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

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁