📄 001.txt
字号:
第一部分基础知识
下载
用Visual C++ 和M F C创建的应用程序大多会自动生成窗口,并且可以处理消息,
进行绘图。M i c r o s o f t在这方面做了大量的工作,隐藏了内部工作,使我们能够更轻松
地创建一个一般的应用程序。然而,当用户不能实现他们想要实现的功能时,适当地
了解内部工作机制,对于消除编程上的困惑会有好处。更重要的是,知道怎样执行任
务(诸如把窗口放置到什么地方,从什么地方获得一个消息和在任意地方绘图),有助
于分清用户的应用程序和由Visual C++ 和M F C自动提供的限于窗口、消息和绘图的应
用程序。
Visual C++应用程序有四项主要基本知识:创建一个窗口、了解其他的M F C类、把消息
发送到一个窗口和在一个窗口内绘图。当然还有其他一些基本知识,我们也将在涉及时适当
地进行讨论。不过本部分将讨论以下四项基本知识。
窗口
在第1章中,我们首先讨论在使用和不使用M F C的情况下创建一个窗口,以便清楚地了解
M F C是如何工作的。M F C窗口既可以由属于M F C的C + +类创建,也可以由一个早于并存在于
M F C之外的非C + +窗口类创建。我们将进一步观看窗口类并讨论那些由Wi n d o w s操作系统提
供的窗口类。最后,再看看M F C应用程序中都有什么。
在第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 rg e t )派生来的。并讨论构成一个应用程序的M F C类、支持窗口
界面的M F C类、用来绘图的类、访问文件的类、维护数据和数据库的类和访问因特网
( I n t e r n e t )的M F C类。
消息处理
在第3章中,我们将讨论一个M F C应用程序是怎样通过消息与外界及应用程序进行通信的。
还将讨论四种消息类型,并跟踪一个消息通过接收消息的类。最后将探讨该路径上的重定向
消息。
绘图
在第4章中,我们将讨论在窗口中绘图的方法,包括绘图工具、绘图用的颜色、在屏幕或
打印机上绘图、绘制位图和图标、绘制矩形和圆、绘制动画。
口第1章窗
在本章中,我们将讨论M F C用户界面的基本要素:窗口。在此基础上比较A P I窗口和
M F C窗口的异同,描述如何创建一个窗口、销毁一个窗口和控制Wi n d o w s操作系统与窗口的
下载
通信问题。
窗口
窗口
窗口窗口
图1-1 Windows应用程序用户界面包括的窗口
1.1 窗口和API环境
窗口是屏幕上的一个矩形区域,应用程序在该区域中显示数据并等待鼠标点击。
Wi n d o w s应用系统的用户界面可以包含许多窗口,每个窗口都有不同的特点,但都是互相联
系的,如图1 - 1所示。
应用程序的主窗口
1.1.1 三种类型窗口
在这么多窗口中,基本类型只有三种:重叠( O v e r l a p p e d )窗口,弹出( P o p u p )窗口和子窗口
( C h i l d )。在它们之间并没有太多内在的差异,但是使用不同的窗口风格,它们的外观是不同
的(见图1 - 2 )。
重叠窗口通常用于建立应用程序主窗口。事实上,有时也叫做“主”窗口或者“框架”
窗口。
弹出窗口通常以对话框和消息框的形式与用户对话。
子窗口通常用在视图( Vi e w )中,如在文本编辑器中的文本显示,也用在控件中,如在对
话框中的O K按钮。而对那些看起来像按钮或控件的子窗口,也称为“控件”窗口。
重叠窗口和弹出窗口的主要区别是弹出窗口出现时可以没有标题(也称为标题栏)。子窗口
与重叠窗口或弹出窗口的主要区别是子窗口只能出现在另一个窗口中,并且子窗口的任何多
余部分都被该窗口移去或剪切掉。另外,子窗口是唯一不能有菜单条的窗口。
参见图1 - 3中的Windows 应用程序,其中包括重叠窗口、弹出窗口和子窗口。
重叠窗口
最基本的
窗体
典型的外观
共同的设置
图1-2 窗口风格可以用来区分三种不同类型的窗口
不是一个窗口—
显示在子窗口中,
并由子窗口绘制
属于弹出窗口的子
窗口,它位于弹出
窗口之中
图1-3 由重叠窗口、弹出窗口和子窗口组成的窗口应用程序
应用程序图标
图1-4 窗口的非客户区可以由系统选择绘制
下载
属于桌面的重叠窗
口,也称为主窗口
1.1.2 客户区和非客户区
每个窗口都有由系统绘制的“非客户区”和由应用程序绘制的“客户区”。系统可以绘制
图1 - 4显示的其中一个或者全部特征,当然也可以把所有的特征留给你去绘制。
菜单条
系统菜单(单击应用程
序图标时,显示虚线框)
每个窗口代表内存中的一个窗口对象,并由该窗口对象告诉Wi n d o w s操作系统将窗口绘
制在何处,以及在对鼠标单击、键盘按下(假设该窗口拥有输入焦点)和时钟终止等事件作出响
口3
弹出窗口
注意:在它的最基
本的窗体中,系统
不进行任何绘制。
窗口都是客户区
最小化按钮任务栏
客户区
第1章窗
子窗口
注意:在它的最基
本的窗体中,系统
不进行任何绘制。
窗口都是客户区
注意:这都是客户区。子
窗口通常自己进行绘制
注意:子窗口不能有子菜单
属于主窗口的子窗口
属于主窗口的弹
出窗口
最大化按钮
关闭按钮
垂直滚动条
水平滚动条
4 第一部分基础知识
应时应调用什么应用程序。窗口对象自身是窗口类的一个实例,它不是Visual C++的类,而是
存在于Visual C++之外,并早于Visual C++的Microsoft Wi n d o w s所属的类。然而,就像C + +的
类一样,窗口类为每个基于它创建的窗口定义了若干特征,如背景色和往何处发送消息等(见
图1 - 5 )。
下载
窗口对象
窗口类
窗口
②窗口对象由CreateWindow( ) ③窗口管理器保持一个窗口对
函数创建,作为它的变量传象列表,并告诉每个对象在
输窗口类屏幕上绘制自己
图1-5 Microsoft Windows所属的窗口类创建的窗口对象
①使用RegisterClass( )
函数创建窗口类
Wi n d o w s操作系统提供了一个扩展的应用程序接口( A P I ),可以用来创建和维护这些窗口
对象。调用C r e a t e Window( )函数可以创建一个窗口对象;调用S e t WindowLong( )函数可以改
变由窗口类定义的特征;调用M o v e Window( )函数可以移动窗口;调用D e s t r o y Window( )可以
退出窗口。如此说来, M F C又能做些什么呢?
此,窗口句柄并非直接指向窗口对象,而是指向跟踪窗口对象地址的另一个指针。
1.2 窗口和MFC环境
M F C窗口是C + +和Windows API调用的综合。事实上, M F C窗口提供了许多(但不是全
部) Windows 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可以创建
一个窗口,但它只是过去在A P I环境中使用的A P I调用的封装。
微软已经把在M F C库中创建和维护一个窗口的逻辑作为真正的C + +封装和控制。然而,
这种方法虽使得M F C库万能,但却是不方便的,并导致了严重的冗余和更多的错误。
创建M F C窗口是复杂的,首先,创建类C W n d的一个实例,然后调用类C W n d的一个成员
函数,该成员函数调用A P I中的C r e a t Window( )函数。返回的窗口句柄(这只是指向窗口对象的
非直接指针)保存在类C W n d的成员变量m _ h W n d中。
注意因为窗口在内存中创建,而内存经常发生变化,窗口地址可能是经常变化的。因
销毁窗口同样也是复杂的,必须确保销毁了该窗口对象,以及封装该窗口对象的C W n d实
例。虽然C W n d对象知道窗口对象,但是窗口对象并不知道CWn d对象(见图1 - 6 )。
第1章窗
窗口对象
窗口类CWnd类对象
窗口
下载
①首先,用AfxRegister Class( )
函数创建一个窗口类④ ::Create Window ⑤窗口管理器告知
再次创建窗口;
窗口句柄保存到
每个窗口对象在
屏幕上绘制自己
CWnd中
③调用CWnd的成员函数
Create(),该函数自身
调用图1 - 4中看到的
②然后,在堆栈上
或堆中创建一个
CWnd类对象
::Create Wi n d o w ( )函数
图1-6 应用两个对象创建MFC窗口
尽管窗口应用程序的用户界面可以由几十个、甚至几百个窗口构成,但是大多数窗口还
是由不到十个的窗口类创建的。即使在应用程序中有一千个窗口,每个窗口也只能是三种基
本类型之一:重叠窗口、弹出窗口或子窗口。
1.3 怎样应用MFC创建一个窗口
可以用M F C的C W n d类创建一个窗口:
CWnd wnd;
BOOL b=wnd.CreateEx (ExStyle, ClassName, WindowName, Style, x, y, Width, Height, Parent, Menu,
P a r a m ) ;
第一行代码创建了一个C W n d类的对象,第二行通过调用Windows API函数C r e a t e WindowEx( )
创建了真正的窗口。
HWND h w n d = : : C r e a t e WindowEx (ExStyle, ClassName, WindowName, Style, x, y, Width, Height, Parent,
Menu, Instance, Param);
因为C W n d类只是封装了用于创建窗口的Windows API函数( C r e a t e WindowEx( )),因此,
从本质上讲,创建窗口所必须的参数在A P I环境和M F C环境中是相同的:
■ 参数S t y l e和E x S t y l e决定窗口的“外观”和类型(重叠、弹出、子窗口)。
■ 参数C l a s s N a m e决定在创建窗口时使用的窗口类。
■ 参数Wi n d o w N a m e决定窗口标题内容(如果窗口标题有内容)。
■ 参数x, y, Wi d t h和H e i g h t决定窗口的位置和大小。
■ 参数P a r e n t指向拥有该窗口的窗口指针(如果有这样的窗口)。
■ 参数M e n u指向内存中的一个对象,作为它的菜单使用—除非创建一个子窗口,如果
是这样的话,那么该参数是帮助父窗口识别子窗口的I D n u m b e r。
■ 参数I n s t a n c e识别该窗口属于哪个应用程序,以便发送到该窗口的消息能被发送到正确
的应用程序的消息队列中。C W n d类填入I n s t a n c e参数。
■ 参数P a r a m是在创建窗口时由窗口类使用的指针,该指针是指向附加信息的非强制性结
构的指针。
返回的h w n d参数是指向创建的窗口对象的指针,但在未创建任何窗口时,该参数返回值为
N U L L。窗口句柄自动地保存在C W n d类的m _ h W n d成员变量中,这在前面的图1 - 6中可以看到。
口5
6 第一部分基础知识
规则。
规则
1. 窗口名称参数
该参数是一个零结尾的文本串,用该串指明在窗口标题栏中显示的内容。如果窗口没有
标题栏,该参数可以为零( 0 )。
然而,某些通用控件也使用该参数。例如,按钮控件把该参数的内容放在按钮的表面。
在创建窗口标题栏后,可以用类C W n d的成员函数S e t Wi n d o w Te x t ( )来改变窗口标题栏的名称。
2. 风格和扩展风格参数
这两个是3 2位的参数,用来指定创建什么类型的窗口。可以选择多种类型,如下面的例
子所示:
,W S _ C H I L D | W S _ V I S I B L E ,
窗口风格参数的作用包括:
■ 用于创建三种基本窗口类型的风格,用W M _ C H I L D创建一个子窗口;用W M _ P O P U P
创建一个弹出窗口。
■ W M _ O V E R L A P P E D创建一个重叠窗口。如果不为窗口指定任何一种风格,那么窗口
风格默认为W M _ O V E R L A P P E D。
■ 用以增添窗口的非客户区特色的风格。例如,可以用W S _ V S C R O L L为窗口添加一个
垂直滚动条,如图1 - 7所示其他非客户区窗口风格。
若在CreateWindow( ) 中定义
了菜单条,则菜单条出现,
它不是一个子窗口
(使窗口可视)
(禁止窗口输入)
■ 由每个通用控件定义的风格。例如, B S _ F L AT按钮风格告诉按钮控件绘制一个二维按
钮。
■ 用来使窗口可视、可操作和/或初始最大化的风格。
■ 用来标识控件组起始控件的风格,或者当用户敲击Ta b键控制焦点在窗口中变化时,用
来指示哪个控件有资格获得输入焦点的风格。
■ 想了解更多的有关窗口风格的例子,请参阅附录A。
在创建窗口以后,可以用C W n d的成员函数ModifyStyle( )和ModifyStyleEx( )改变窗口风
格。某些风格可能要求重画窗口,这时,可以给ModifyStyle( )函数添加第三个参数,自动激
发类C W n d的成员函数S e t WindowPos( )做重画窗口工作。
下载
现在既然已了解了有关创建窗口的基本知识,那么让我们进一步来看看填写这些参数的
如果选取了最小化或最大化按
钮则关闭按钮出现
图1-7 非客户窗口风格用来增添窗口的特色
口第1章窗7
下载
图1-8 CW_USEDEFAULT允许系统自动设定窗口位置
6. 父窗口或物主窗口参数
CWnd wnd;
wnd.ModifyStyle (0,WS_BORDER,SWP_NOZORDER);
事实上,给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 WindowPos( ) 选项: 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和
第三个窗口下一个窗口第一窗口
S W P _ S H O W。
注意有时候,甚至一个重画的窗口可能与新风格不相容,尤其对通用控件窗口来说更
是这样。因为单个窗口决定重画窗口时使用什么风格。在这种情况下,唯一的办法是:
在事先存储已有窗口的风格和其他参数后,销毁和重建该窗口。
3. X和Y位置参数
这是两个3 2位的参数,用于以像素为单位指定窗口的位置。创建重叠窗口和弹出窗口时,
X和Y是相对于桌面窗口左上角的位置。而创建子窗口时, X和Y是相对于父窗口客户区的左
上角位置。如果把X和Y参数都设置为C W _ U S E D E FA U LT,那么系统将自动为窗口选定一个
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -