⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 001.txt

📁 vc++编程实例
💻 TXT
📖 第 1 页 / 共 3 页
字号:
位置。系统层叠排列这些新窗口(见图1 - 8 )。
然而,如果X和Y参数都设置为C W _ U S E D E FA U LT,那么子窗口在创建的时候,总被创
建在(0, 0)的位置。
创建窗口以后,可以用类C W n d的成员函数M o v e Window( )移动窗口。
4. 宽度和高度参数
这是两个3 2位的参数,用于以像素为单位指定窗口的大小。如果将参数Wi d t h和H e i g h t都
设置为C W _ U S E D E FA U LT,则系统将根据桌面窗口的大小,自动选定窗口的大小。然而,对
于一个子窗口来说,系统将创建一个长和宽均为0的窗口。如果窗口的风格是W S _ M I N I M I Z E 
或W S _ M A X I M I Z E,那么系统将忽视用户为Wi d t h和H e i g h t设置的任何值。
创建窗口以后,可以用类CWn d的成员函数M o v e Window( )重新设置窗口的大小。
5. Z-Order 
当几个窗口占据屏幕上同一区域时, 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 T 
窗口风格创建,并显示在所有非最顶层窗口的上面,而与该窗口是不是当前选中的窗口无关。
创建窗口后,可以用CWn d的成员函数S e t Wi n d o w P o s ( )改变窗口的Z顺序。
该参数是指向类CWn d对象的指针,根据创建的窗口类型标识是父窗口还是物主窗口
8 第一部分基础知识
②子窗口对象被创建, 
并显示在父窗口中
①重叠或弹出窗口对
象被创建,并显示
在屏幕上
③ 弹出或重叠窗口对象
被创建,并显示在父
窗口中
图1-9 物主、父、子窗口的层次关系
( O w n e r ): 
■ 如果创建的是一个子窗口,那么用该参数来标识它的父窗口(该子窗口所放置的并为之
所截断的窗口)。该值不能为N U L L。子窗口只能出现在它的父窗口里面,当父窗口被
销毁时它们也被销毁,并且当父窗口被隐藏或最小化时它们也被隐藏。
■ 如果创建的是重叠窗口或弹出窗口,用该参数来标识物主窗口。如果该值为N U L L, 
则桌面窗口成为物主窗口。从属窗口总是显示在它们的主窗口上面,并且随着物主窗
口的销毁而被销毁;物主窗口最小化时,则从属窗口被隐藏;但当物主窗口被隐藏时, 
从属窗口并不被隐藏。
一个子窗口可能是另一个子窗口的父窗口,但绝不可能是一个物主窗口。如果试图使一
个子窗口成为一个物主窗口,那么系统只能使那个子窗口的最顶层窗口作为物主窗口。图1 - 9 
是这些关系的概述。
可以用C W n d的成员函数SetOwner( ) 改变已有窗口的物主窗口,用C W n d的成员函数
SetParent( )改变父窗口。
7. 菜单或控件I D参数
该参数用来标识菜单( M e n u )句柄或控件(Control )ID,这要依赖于创建的窗口是子窗口、
重叠窗口,还是弹出窗口。
■ 如果创建的是一个子窗口,用该参数标识控件I D,控件I D通常用来帮助父窗口识别子
窗口。因为该参数寻求一个H M E N U变量,因此,需要用H M E N U类型重载变量定义控
件I D。例如,如果子窗口的控件I D是1 0 2,应该用如下方法定义它: 
., (HMENU) 102,. 
■ 如果创建的是一个重叠窗口或弹出窗口,用该参数定义窗口的菜单。若该值为N U L L, 
则菜单默认为在该窗口的窗口类中定义的任何菜单;如果窗口类也没有指定的菜单, 
则该窗口在创建时没有菜单。可以用下面的方法为该参数加载一个菜单: 
HMENU hMenu=::LoadMenu (AfxGetInstanceHandle( ), MAKEINTRESOURCE (xx)); 
下载
口第1章窗9 
下载
这里的x x是应用程序资源里面的菜单ID(Menu ID)。
可以用C W n d的SetDlgCtrlID( )改变已有子窗口的I D。用类C W n d的成员函数SetMenu( )改
变一个重叠窗口或弹出窗口的菜单。
8. 实例
前面已提到,C W n d类将填入该参数。C W n d通过调用AfxGetInstanceHandle( )获得该实例
( I n s t a n c e )。一个应用程序的实例从本质上标识了哪个程序在内存里。AfxGetInstanceHandle( ) 
是由M F C库提供的静态函数。
9. 参数
该3 2位参数( P a r a m e t e r )是可选的。它通常是指向一个结构或者类对象的指针,而该结构
或者类对象是创建某种类型的窗口时需要提供的。例如,当用M D I C L I E N T窗口类创建窗口时, 
需要该参数提供一个C L I E N T C R E AT E S T R U C T结构的指针。
10. 类名参数
类名(Class Name)参数是一个零结尾字符串,当创建一个窗口时,用来标识使用那个窗口
类。关于窗口类和窗口处理,将在本章后面的内容中详细讨论。该参数不能为N U L L,在创建
一个非常一般的M F C窗口时,使用AfxRegisterWndClass (0)填入该参数。
1.4 怎样使用MFC销毁一个窗口
如前面所提到的一样,删除一个M F C窗口可能有些烦琐,必须按下面的顺序删除两个对
象: 
//destroys Cwnd Object 
p W n d - > D e s t r o y Window( ); //destroys Window Object 
delete pWnd; 
也可以只删除C W n d对象,因为D e s t r o y Window( )是从C W n d的析构函数中调用的,但不
提倡使用这种方法。销毁一个窗口而不先调用D e s t r o y Window( )函数,将使某些析构消息不能
被任何从C W n d派生的类处理。你几乎不需自己销毁一个窗口,用户或系统通常会做这项工作。
如果需要在销毁窗口的同时销毁C W n d对象,则应该在C W n d的派生类中添加下面的重载函
数:
C YourWnd::PostNcDestroy( ) 
{ 
delete this; 
}
PostNcDestroy( )是销毁窗口前调用的最后一个成员函数。但是,几乎不需对该函数进行
重载,因为C W n d和派生类一般是嵌在另一个类中或建立在堆栈中的。
1.4.1 捆绑到一个已有的窗口
如果一个窗口是用Windows API在应用程序建立之前或外面创建的,并且需要把它封装到
C W n d类中,可以用下面的语句实现: 
CWnd wnd; 
wnd.Attach (hwnd); 
这里的h w n d是已有窗口的句柄。Attach( )只是把C W n d的成员变量m _ h W n d赋给h w n d。
也可以使用CWnd::FromHandle (hwnd),它查看是否有C W n d对象已经封装了该窗口句柄
并返回该C W n d对象的指针。如果不存在这样的C W n d对象,将创建一个临时对象。如果是临
10 第一部分基础知识
1.4.2 窗口类
前面已提及,一个窗口类不是一个C + +类,而是早于并存在于C + +之外的窗口专有的类。
窗口类的作用就像一个模板,可以由此创建其他窗口,并可共享某些特征,包括下面所示的
特征:
类风格包括能给予窗口的一些微小的特征。
类图标如果窗口有图标,用它来指定在窗口的左上角处所画的图标。
类菜单如果窗口有菜单,用它来指定窗口中显示的菜单。
类光标当光标通过窗口的客户区时,用它来指定显示哪种鼠标形状。
背景色定义用什么颜色来擦除窗口的背景色。窗口的客户区将显示该颜色。
窗口进程定义处理任何发送到该窗口的消息时应该调用的函数。定义窗口进程可能是窗
口类唯一最重要的前提。
窗口对象
③“ BUTTON”的窗口进程搜索窗口对象,以
查明绘制什么类型的按钮,如果风格是
“Check Box”,则绘制一个复选框
父窗口
1.4.3 窗口进程
窗口与环境的交互是通过发送和接收消息来实现的。如果系统要求窗口自己进行绘制, 
系统给它发送一个W M _ PA I N T 消息; 如果系统要求窗口销毁自己, 则发送一个
W M _ D E S T R O Y消息。这些消息都由窗口的窗口进程处理,该窗口进程的地址在窗口类中定
义。对于发送到由相同的窗口类创建的窗口的消息,系统采用完全相同的窗口进程进行处理。
相同的窗口进程是怎样跟踪所有的窗口的呢?它是怎么知道窗口A画在( 1 0 , 3 4 ),而窗口B画在
( 5 6 , 2 1 )呢?所有这些工作的完成只需使用窗口的窗口对象。
例如,所有用按钮窗口类创建的窗口,都使用相同的按钮窗口进程。如果一个
W M _ PA I N T消息发送到其中任何一个窗口,则按钮窗口进程根据每个窗口的窗口对象指定的
大小、位置和风格画出确切的按钮(见图1 - 1 0 )。
①用“BUTTON”窗
口类创建的窗口
④如果风格是“ Push 
下载
时对象,则不要使用该指针,因为在应用程序空闲的时候,该指针指向的对象将被删除。
⑤ 窗口进程也搜索窗口对象以
查明在哪里绘制这些控件窗Button”,则窗口进
②通过发送一个W M _ PA I N T 消
口程绘制一个按钮
息到窗口进程,窗口管理器
告诉每个窗口绘制自己
图1-10 按钮窗口进程使用窗口对象指定对哪个窗口进行操纵
口第1章窗11 
下载
1.5 怎样使用MFC创建一个窗口类
当用户创建一个窗口类时,实际上只是在三个操作系统列表之一中注册一个W N D C L A S S 
结构。系统为每个窗口类类型维护一个列表: 
系统全局类(System Global Class) 在系统启动时注册,且必须注册,对所有应用程序都
有效。
应用程序全局类(Application Global Class) 由应用程序注册,只对应用程序及应用程序
的线程有效。
应用程序局部类(Application Local Class) 由应用程序注册,并只对注册它们的应用程序
或D L L有效。
当系统搜索一个窗口类时,从应用程序局部类开始,然后搜索应用程序全局类,最后搜
索系统全局类。
要创建一个窗口类,可以先创建W N D C L A S S结构的实例,然后用M F C类库的A f x R e g i s t e r 
Class( ) 注册它。也可以用M F C类库的AfxRegisterWndClass( ) 来创建一个基于调用参数的
W N D C L A S S对象。
1.5.1 使用AfxRegisterWndClass( )函数注册一个窗口类
AfxRegisterWndClass( )函数在使用上是非常自动化的,一些通常需要你提供的参数都能
自己填入,甚至连新的窗口类的名字也能自动产生。
LPCTSTR lpszClassName=AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor=0,HBRUSH 
hbrBackground=0, HICON hIcon=0); 
这些参数的使用规则如下: 
1. 类名
根据传给该函数的参数,为新的窗口类产生名字。如果传输的参数完全相同,那么创建
的窗口类也将完全相同。如果需要创建新的窗口类,可以用AfxRegisterClass( )。
2. 风格
窗口类风格由下面选项列表中一系列标记的或( O R )运算提供: 
类风格
C S _ O W N D C 
CS_ PA R E N T D C 
C S _ C L A S S D C 
C S _ S AV E B I T S 
C S _ B Y T E A L I G N C L I E N T 
C S _ B Y T E A L I G N W I N D O W 窗口在字节边缘时,显示卡更容易移动窗口
C S _ G L O B A L C L A S S 
C S _ V R E D R AW 
C S _ H R E D R AW 
C S _ N O C L O S E 
C S _ D B L C L K S 
为为该窗口类创建的每个窗口分配唯一的设备环境。有关设备环境的更详尽资料
见第4章
为从系统高速缓存中检索设备环境,然后设置该设备环境的剪裁区,以组合到父
窗口中,以便子窗口能画在父窗口上
为分配一个设备环境给所有由该窗口类创建的窗口使用
为由该类创建的任何窗口的视频存储区将被保存,以便窗口移动或关闭时,不需
要重画基础窗口—这对快速机器来说作用不大
为当计算机的显示卡和C P U速度较慢时,这两种风格有用。添加这些风格后,当
为如果设置该风格,则该类是应用程序的全局类,否则它是一个应用程序局部类
为如果设置了垂直风格,并且窗口的垂直大小发生了变化,则整个窗口被重画。
水平风格也这样
为禁用系统菜单中的关闭命令
为如果未设置该参数,并且双击由该窗口类创建的窗口,则传送给应用程序的将
不是双击事件,而是两个相继完成的单击事件
12 第一部分基础知识
下载
N U L L ,并且设置了
3. 图标( I c o n ) 
该参数是显示在窗口左上角的图标的句柄,但只适用于使用W S _ S Y S M E N U的窗口风格。
应用程序主窗口的图标也显示在任务栏上。如果将该参数设置为
W S _ S Y S M E N U风格,则系统将提供一个默认的图标。在M F C环境中,绝大部分图标已被处
理过,用CWn d的S e t I c o n ( )可改变已有的图标。
4. 光标( C u r s o r ) 
该参数是鼠标移经应用程序窗口的客户区时,将要显示的鼠标光标句柄。如果将该参数
设置为N U L L,则显示的是箭头光标。可以用下面的语句装载一个光标: 
HICON hIcon=AfxGetApp( )->LoadCursor (xx); 
这里的x x是应用程序资源中光标的名字或I D。
这里指定的光标意味着是该窗口的默认光标。如果想动态地改变光标形状,则应该处理
该窗口的W M _ S E T C U R S O R消息,并用SetCursor( )来改变光标形状(见第8章例3 3 )。
5. 背景色
当系统创建窗口时,先在显示窗口的地方画一个矩形区域,以擦除该区域的背景色。该
参数指定填充该矩形域时所用画刷的句柄(参见第4章有关画刷的详细内容)。为窗口类创建的
画刷对象在该类退出注册时被自动释放。
在指定背景色时,也可以不创建画刷对象,而指定下面所列系统颜色之一: 
C O L O R _ A C T I V E B O R D E R 
C O L O R _ A C T I V E C A P T I O N 
C O L O R _ A P P W O R K S PA C E 
C O L O R _ B A C K G R O U N D 
C O L O R _ B T N FA C E 
C O L O R _ B T N S H A D O W 
C O L O R _ B T N T E X T 
C O L O R _ C A P T I O N T E X T 
C O L O R _ G R AY T E X T 
C O L O R _ H I G H L I G H T 
C O L O R _ H I G H L I G H T T E X T 
C O L O R _ I N A C T I V E B O R D E R 
C O L O R _ I N A C T I V E C A P T I O N 
C O L O R _ M E N U 
C O L O R _ M E N U T E X T 
C O L O R _ S C R O L L B A R 
C O L O R _ W I N D O W 
C O L O R _ W I N D O W F R A M E 
C O L O R _ W I N D O W T E X T 
然而,必须分配颜色到一个画刷句柄类型,并加1。
(HBRUSH) (COLOR_WINDOW+1) 
设置该参数为N U L L,则在画一个窗口之前,系统不对窗口进行擦除。在非客户区的绘制
还是同平常一样,但客户区将保持窗口被画前原来屏幕所显示的样子。若该参数设为N U L L, 
应确认窗口是画全部客户区,还是处理W M _ E R A S E B R G N D消息以擦除背景颜色。
1.5.2 使用AfxRegisterClass( ) 函数创建一个窗口类
如果想完全控制一个新窗口类的创建,如指定窗口类的名字,则应该用下面的语句:
下载
BOOL AFXAPI AfxRegisterClass (WNDCLASS. lpWndClass); 
这里的W N D C L A S S结构定义如下: 
typedef struct _WNDCLASS { 
UINT style; 
W N D P R O C l p f n W n d P r o c ; 
c b C l s E x t r a ; i n t 
c b W n d E x t r a ; i n t 
h I n s t a n c e ; H A N D L E 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -