C++学习.docx
《C++学习.docx》由会员分享,可在线阅读,更多相关《C++学习.docx(11页珍藏版)》请在冰豆网上搜索。
C++学习
CWND窗口类
2011-03-2214:
56
CDialog的成员函数:
1、构造函数:
CDialog(LPCTSTRlpszTemplateName,CWnd*pParentWnd=NULL);
CDialog(UINTnIDTemplate,CWnd*pParentWnd=NULL);
CDialog();
CDialog重载了三个构造函数。
其中,第三个是缺省构造函数;第一个和第二个构造函数从指定的对话框模板资源创建,pParentWnd指定了父窗口或所属窗口,若空则设置父窗口为应用程序主窗口。
2、初始化函数
BOOLCreate(LPCTSTRlpszTemplateName,CWnd*pParentWnd=NULL);
BOOLCreate(UINTnIDTemplate,CWnd*pParentWnd=NULL);
BOOLCreateIndirect(LPCDLGTEMPLATElpDialogTemplate,CWnd*pParentWnd=NULL);
BOOLCreateIndirect(HGLOBALhDialogTemplate,CWnd*pParentWnd=NULL);
BOOLInitModalIndirect(LPCDLGTEMPLATElpDialogTemplate,CWnd*pParentWnd=NULL);
BOOLInitModalIndirect(HGLOBALhDialogTemplate,CWnd*pParentWnd=NULL);
Create用来根据模板创建无模式对话框;CreateInDirect用来根据内存中的模板创建无模式对话框;InitModalIndirect用来根据内存中的模板创建模式对话框。
它们都提供了两个重载版本。
3、对话框操作函数
voidMapDialogRect(LPRECTlpRect)const;
voidNextDlgCtrl()const;
voidPrevDlgCtrl()const;
voidGotoDlgCtrl(CWnd*pWndCtrl);
voidSetDefID(UINTnID);
voidSetHelpID(UINTnIDR);
voidEndDialog(intnResult);
4、虚拟函数virtualintDoModal();
virtualBOOLOnInitDialog();
virtualvoidOnSetFont(CFont*pFont);
virtualvoidOnOK();
virtualvoidOnCancel();
5、用来管理对话框控件的CWnd成员函数
CheckDlgButton选中或不选中按钮控件。
CheckRadioButton选择一个指定的单选按钮并使同组内的其它单选按钮不被选择。
DlgDirList往一个列表框中添加文件、目录或驱动器的列表。
DlgDirListComboBox往一个组合框中的列表框内添加文件、目录或驱动器的列表。
DlgDirSelect从一个列表框中获得当前选择的文件、目录或驱动器。
DlgDirSelectBomboBox从一个组合框中获得当前选择的文件、目录或驱动器。
GetCheckedRadioButton返回指定的单选按钮组中被选择的单选按钮的ID。
GetDlgItem返回一个指向一给定的控件的临时对象的指针。
GetDlgItemInt返回在一个指定的控件中由正文表示的数字值。
GetDlgItemText获得在一个控件内显示的正文。
GetNextDlgGroupItem返回一个指向一组控件内的下一个或上一个控件的临时对象的指针。
GetNextDlgTabItem返回下一个tab顺序的控件的临时对象的指针。
IsDlgButtonChecked返回一个按钮控件的状态。
SendDlgItemMessage把一个消息传送给一个控件。
SetDlgItemInt将一个整数转换为正文,并将此正文赋给控件。
SetDlgItemText设置一个控件显示的正文。
CWinThread:
:
m_pMainWnd:
保存指向应用程序的主窗口指针。
CWinThread:
:
GetMainWnd:
查询指向线程主窗口的指针。
CWinThread:
:
InitInstance:
重载以实现线程实例的初始化。
AfxGetApp:
获得指向CWinApp对象的指针。
AfxGetInstanceHandle:
获得当前应用程序实例的句柄。
AfxGetResourceHandle:
获得应用程序资源的句柄。
AfxGetAppName:
获得一个字符串指针,其中包含了应用程序的名字。
另外,如果你拥有一个指向CWinApp对象的指针,可以通过m_pszExename来获得应用程序的名字。
CDocument:
:
IsModified:
标识文档从最近一次保存以来是否被修改过。
CDocument:
:
UpdateAllViews:
通知所有视图文档已被修改的消息。
CWnd:
:
m_hWnd:
指明与这个CWnd对象相关联的HWND句柄。
CWnd:
:
Create:
创建并初始化与CWnd对象相关联的子窗口。
CWnd:
:
PreCreateWindow:
在与CWnd对象相关联的窗口被创建之前调用。
CWnd:
:
IsWindowEnabled:
确定一个窗口是否允许鼠标和键盘输入。
CWnd:
:
EnableWindow:
允许或禁止鼠标和键盘输入。
CWnd:
:
SetWindowPos:
改变子窗口、弹出窗口和顶层窗口的大小、位置以及顺序。
CWnd:
:
GetDlgItem:
获得指定的对话框中具有指定ID的控件。
CWnd:
:
UpdateData:
初始化对话框或获得对话框中的数据。
CWnd:
:
GetWindowRect:
获得CWnd的屏幕坐标。
CWnd:
:
GetDC:
获得客户区的设备环境。
CWnd:
:
RedrawWindow:
更新客户区中的指定矩形或区域。
CWnd:
:
UpdateWindow:
更新客户区。
CWnd:
:
Invalidate:
使整个客户区无效。
CWnd:
:
ShowWindow:
显示或隐藏窗口。
CWnd:
:
ClientToScreen:
将给定点或显示器上矩形的客户区坐标转换为屏幕坐标。
CWnd:
:
ScreenToClient:
将给定点或显示器上矩形的屏幕坐标转换为客户坐标。
CWnd:
:
SetWindowText:
将窗口的文本或标题文字(如果有)设为指定的文本。
CWnd:
:
SetFont:
设置当前字体。
CWnd:
:
GetDlgItemInt:
将给定对话框中控件的文本转换为整数。
CWnd:
:
SetTimer:
安装一个系统定时器,当它被激活时,发送一个WM_TIMER消息。
CWnd:
:
KillTimer:
销毁一个系统定时器。
CWnd:
:
FlashWindow:
使窗口闪烁一次。
CWnd:
:
MessageBox:
创建并显示一个窗口,其中包含了应用程序提供的消息和标题。
MFC
窗口:
重叠窗口(Overlapped),弹出窗口(Popup),子窗口(Child)
MFC窗口不对窗口进行直接的控制,而在API环境中却是可以的。
如果不能在API环境中实现某项功能,那么
肯定也不能在MFC环境中实现。
举例来说,MFC库的CWnd可以创建一个窗口,但它只是过去在API环境中使用
API调用的封装。
创建MFC窗口是复杂的,首先,创建类CWnd的一个实例,然后调用类CWnd的一个成员函数,该成员函数调用
API中的CreateWindow()函数。
返回的窗口句柄保存在类CWnd的成员变量m_hWnd中
注:
因为窗口在内存中创建,而内存经常发生变化,窗口地址可能是经常变化的。
因此,窗口句柄并非直接
指向窗口对象,而是指向跟踪窗口对象地址的另一个指针。
销毁窗口同样复杂,必须确保销毁了该窗口对象,以及封装该窗口对像的CWnd实例。
怎样应用MFC创建一个窗口:
CWndwnd
BOOLb=wnd.CreateEx(ExStyle,ClassName,WindowName,Style,x,y,Width,Height,parent,Menu,param);
第一行代码创建了一个CWnd类的对象,第二行通过调用WindowsAPI函数CreateWindowEx创建了真正的
窗口。
HWNDhwnd=:
:
CreateWindowEx(Exstyle,ClassName,WindowName,Style,x,y,Width,Height,Parent,
meun,instance,Param);
因为CWnd类只是封装了用于创建窗口的WindowAPI函数(CreateWindowEx()),因此,从本质上讲,
创建窗口所必须的参数在API环境和MFC环境中是相同的;
参数style和Exstyle决定窗口的"外观"和类型(重叠,弹出,子窗口).
参数ClassName决定在创建窗口时使用的窗口类
参数WindowName决定窗口标题内容
参数x,y,Width,Height决定窗口的位置的大小.
参数parent指向拥有该窗口的窗口指针
参数Menu指向内存中的一个对象,作为它的菜单使用----除非创建一个子窗口,如果是这样的话
,那么该参数是帮助父窗口识别子窗口的IDnumber
参数Instance识别该窗口属于哪个应用程序,以便发送到该窗口的消息能被发送到正确的应用程序
的消息队列中。
CWnd类填入Instance参数
参数param是在创建窗口时由窗口类使用的指针,该指针是指向附加信息的非强制性结构指针
返回的hwnd参数是指向创建的窗口对象的指针,但在未创建任何窗口时,该窗口数返回值为NULL
窗口句柄自动地保存在CWnd类的m_hWnd成员变量中.
参数规则:
a.窗口名称参数
该参数是一个零结尾的文本串,用该串指明在窗口标题栏中显示的内容。
如果窗口没有标题
栏,该参数可以为0
然而,某些通过控件也使用该参数。
例如,按钮控件把该参数的内容放在按钮的表面。
在
创建窗口标题栏后,可以用类CWnd的成员函数SetWindowText(),来改变窗口标题栏的名
称.
b.风格和扩展风格参数
这两个是32位的参数,用来指定创建什么类型的窗口。
可以选择多种类型,如下面的例子所示:
.WS_CHILD|WS_VISIBLE
窗口风格参数的作用包括:
用于创建三种基本窗口类的风格,用WM_CHILD创建一个子窗口;用WM_POPUP创建一个弹出
窗口,WM_OVERLAPPED创建一个重叠窗口。
如果不为窗口指定任何一种风格,那么窗口风格
默认为WM_OVERLAPPED.
用以增添窗口的非客户区特色的风格。
例如可用WS_VSCROOLL窗口添加一个垂直滚动条.
由每个通用控件定义的风格。
例如,BS_FLAT按钮风格告诉按钮控件绘制一个二维按钮
用来标识控件组起始控件的风格,或者当用户敲击Tab键控制焦点在窗口中变化时,用
来指示哪个控件有资格获得输入焦点的风格.
在创建窗口以后,可以用CWnd的成员函数ModifyStyle()和ModifyStyleEx()改变窗口
风格。
某些风格可能要求重画窗口,这时,可以给ModifySytle()函数添加三第三个参
数,自动激发类CWnd成员函数SetWindowPos()做重画工作。
CWndwnd;
wnd.ModifyStyle(0,WS_BORDER,SWP_NOZORDER);
事实上,给MOdifyStyle()或给MOdifyStyleEx()添加任何第三个参数,都要添加下面
的SetWindowpos()选项:
SWP_NOZORDER,SWP_NOMOVE,SWP_NOACTIVATE,SWP_SHOW.
c.X和Y位置参数
这是两个32位的参数,用于以象素为单位指定窗口的位置。
创建重叠窗口和弹出窗口时,
X和Y是相对于桌面窗口左上角的位置。
而创建子窗口时,X和Y是相对于父窗口客户区的左
上角位置。
如果把X和Y参数都设置为CW_USEDEFAULT,那么系统将自动为窗口选定一个位置。
然而,如果X和Y参数都设置为CW_USEDEFFAULT,那么子窗口在创建的时候,总被创建在
(0,0)的位置
创建窗口以后,可以用类CWnd的成员函数MoveWindow()移动窗口
d.宽度和高度参数
这是两个32位的参数,用于以像素为单位指定窗口的大小。
如果将参数Width和Heihght都
设置为CW_USEDEFAULT,则系统将根据桌面窗口的大小,自动选定窗口的大小。
然而,对于
一个子窗口来说,系统系统将创建一个长和宽为0的窗口。
如果窗口的风格是WS_MINIMIZE
或WS_MAXIMIZE,那么系统将忽视用户为Width和Height设置的任何值。
创建窗口以后,可以用类CWnd的成员函数MoveWindow()重新设置窗口的大小。
e.Z_Order
当几个窗口占据屏幕上同一区域时,Z_Order决定哪个窗口显示在哪个窗口之上。
创建窗口后,可以用CWnd的成员函数SetWindowPos()改变窗口Z的顺序
f.父窗口或物主窗口参数
该参数是指向类CWnd对象的指针,根据创建的窗口类型标识是父窗口还是物主窗口。
如果创建的是一个子窗口,那么用该参数来标识它的父窗口,该值不能为NULL。
子
窗口只能出现在它的父窗口里面,当父窗口被销毁时它他们也被销毁;物主窗口最
小化时,则从属窗口被隐藏;但当物主窗口被隐藏时,从属窗口并不被隐藏
怎么使用MFC销毁一个窗口
删除一个MFC窗口可能有些烦琐,必须按下面的顺序删除两个对象:
pWnd->DestroyWindow();//destroyswindowObject
deletepWnd; //destroysCwndObject
也可以只删除CWnd对象,因为DestroyWindow()是从CWnd的析构函中调用中,但不提倡
使用这种方法。
销毁一个窗口而不先调用DestroyWindow()函数,将使某些析构消息不能
被任何从CWnd派生的类处理。
你几乎不需自己销毁一个窗口,用户或系统通常会做这项
工作。
如果需要在销毁窗口的同时销毁CWnd对象,则应该在CWnd的派生类中添加下面的
重载函数:
CYourWnd:
:
PostNcDestroy()
{
deletethis;
}
PostNcDestroy()是销毁窗口前调用的最后一个成员函数。
但是,几乎不需要对该函数
进行重载,因为CWnd和派生类一般是嵌在另一个类中或建立在堆栈中的.
捆绑到一个已有的窗口
如果一个窗口是用WindowsAPI在应用程序建立之前或外面创建的,并且需要把它封装到CWnd
类中,可以用下面的语句实现:
CWndwnd;
wnd.Attach(hwnd);
这里的hwnd是已有窗口的句柄。
Attach()只是把CWnd的成员变量m_hWnd赋给hwnd.
也可以使用CWnd:
:
Fromhandle(hwnd),它查看是否有CWnd对象已经封装了该窗口句柄并
返回该CWnd对象的指针。
如果不存在这样的CWnd对象,将创建一个临时对象。
如果是临时
对象,则不要使用该指针,因为在应用程序空闲的时候,该指针指向的对象将被删除。
窗口类:
一个窗口类不是一个C++类,而是早于并存在C++之外的窗口专用的类。
窗口类的作用就像一个
模板,可以由此创建其它窗口,并可以共享某些特征,包括下面所示的特征:
类风格 包括能给予窗口的一些微小的特征
类图标 如果窗口有图标,用它来指定窗口中显示的菜单
类菜单 如果窗口有菜单,用它来指定窗口中显示的菜单
类光标 当光标通过窗口的客户区时,用它来指定显示哪种鼠标形状
背景色 定义用什么颜色来擦除窗口的背景色。
窗口的客户区将显示该颜色
窗口进程 定义处理任何发送到该窗口的消息时应该调用的函数。
定义窗口进程
可能是类唯一最重要的前提
窗口进程:
窗口与环境的交互是通过发送的接收消息实现的。
如果系统要求窗口自己进行绘制
,系统给它发送一个WM_PAINT消息;如果系统要求窗口销毁自己,则发送一个WM_
DESTROY消息。
这些消息都由窗口的窗口进程处理,该窗口进程的地址在窗口类中
定义。
对于发送到由相同的窗口类创建的窗口的消息,系统采用完全相同的窗口进
程进行处理。
怎样使用MFC创建一个窗口类:
当用户创建一个窗口类时,实际上只是在三个操作系统列表之一中注册一个WNDCLASS
结构。
系统为每个窗口类类型维护一个列表:
系统全局类(SystemGlobalClass)在系统启动时注册,且必须注册,对所有应用程序
都有效
系统程序全局类(ApplicationGlobalClass)由应用程序注册,只对应用程序及应用
程序的线程有效
应用程序局部类(ApplicationLocalClass)由应用程序注册,并只对注册它们的应用
程序或DLL有效
当系统搜索一个窗口类时,从应用程序局部类开始,然后搜索应用程序全局类,最后
搜索系统全局类
要创建一个窗口类,可以及先创建WNDCLASS结构的实例,然后用MFC类库的
AfxRegisterClass()注册它。
也可以用MFC类库的AfxRegisterWndClass()来创建一个
基于调用参数的WNDCLASS对象
使用AfxRegisterWndClass()函数注册一个窗口类:
AfxRegisterWndClass()函数在使用上是非常自动化的,一些通常需要你提供的参数都能自己
填入,甚至连新的窗口类的名字也能自动产生。
LPCTSTRlpszClassName=AfxRegisterWndClas