1、C+学习CWND窗口类2011-03-22 14:56CDialog的成员函数:1、构造函数: CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );CDialog( );CDialog重载了三个构造函数。其中,第三个是缺省构造函数;第一个和第二个构造函数从指定的对话框模板资源创建,pParentWnd指定了父窗口或所属窗口,若空则设置父窗口为应用程序主窗口。2、初始化函数 BOOL Create( LPCTSTR lps
2、zTemplateName, CWnd* pParentWnd = NULL );BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );BOOL CreateIndirect( LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd = NULL );BOOL CreateIndirect( HGLOBAL hDialogTemplate, CWnd* pParentWnd = NULL );BOOL InitModalIndirect( LPCDLGTEMPLATE lpDialogTem
3、plate, CWnd* pParentWnd = NULL );BOOL InitModalIndirect( HGLOBAL hDialogTemplate, CWnd* pParentWnd = NULL );Create用来根据模板创建无模式对话框;CreateInDirect用来根据内存中的模板创建无模式对话框;InitModalIndirect用来根据内存中的模板创建模式对话框。它们都提供了两个重载版本。3、对话框操作函数 void MapDialogRect( LPRECT lpRect ) const;void NextDlgCtrl( ) const;void PrevDlg
4、Ctrl( ) const;void GotoDlgCtrl( CWnd* pWndCtrl );void SetDefID( UINT nID );void SetHelpID( UINT nIDR );void EndDialog( int nResult );4、虚拟函数 virtual int DoModal( ); virtual BOOL OnInitDialog( );virtual void OnSetFont( CFont* pFont );virtual void OnOK( );virtual void OnCancel( );5、用来管理对话框控件的CWnd成员函数Ch
5、eckDlgButton 选中或不选中按钮控件。CheckRadioButton 选择一个指定的单选按钮并使同组内的其它单选按钮不被选择。DlgDirList 往一个列表框中添加文件、目录或驱动器的列表。DlgDirListComboBox 往一个组合框中的列表框内添加文件、目录或驱动器的列表。DlgDirSelect 从一个列表框中获得当前选择的文件、目录或驱动器。DlgDirSelectBomboBox 从一个组合框中获得当前选择的文件、目录或驱动器。GetCheckedRadioButton 返回指定的单选按钮组中被选择的单选按钮的ID。GetDlgItem 返回一个指向一给定的控件的临
6、时对象的指针。GetDlgItemInt 返回在一个指定的控件中由正文表示的数字值。GetDlgItemText 获得在一个控件内显示的正文。GetNextDlgGroupItem 返回一个指向一组控件内的下一个或上一个控件的临时对象的指针。GetNextDlgTabItem 返回下一个tab顺序的控件的临时对象的指针。IsDlgButtonChecked 返回一个按钮控件的状态。SendDlgItemMessage 把一个消息传送给一个控件。SetDlgItemInt 将一个整数转换为正文,并将此正文赋给控件。SetDlgItemText 设置一个控件显示的正文。CWinThread:m_p
7、MainWnd:保存指向应用程序的主窗口指针。CWinThread:GetMainWnd:查询指向线程主窗口的指针。CWinThread:InitInstance:重载以实现线程实例的初始化。AfxGetApp:获得指向CWinApp对象的指针。AfxGetInstanceHandle:获得当前应用程序实例的句柄。AfxGetResourceHandle:获得应用程序资源的句柄。AfxGetAppName:获得一个字符串指针,其中包含了应用程序的名字。另外,如果你拥有一个指向CWinApp对象的指针,可以通过m_pszExename来获得应用程序的名字。CDocument:IsModified
8、:标识文档从最近一次保存以来是否被修改过。CDocument:UpdateAllViews:通知所有视图文档已被修改的消息。CWnd:m_hWnd:指明与这个CWnd对象相关联的HWND句柄。CWnd:Create:创建并初始化与CWnd对象相关联的子窗口。CWnd:PreCreateWindow:在与CWnd对象相关联的窗口被创建之前调用。CWnd:IsWindowEnabled:确定一个窗口是否允许鼠标和键盘输入。CWnd:EnableWindow:允许或禁止鼠标和键盘输入。CWnd:SetWindowPos:改变子窗口、弹出窗口和顶层窗口的大小、位置以及顺序。CWnd:GetDlgIte
9、m:获得指定的对话框中具有指定ID的控件。CWnd:UpdateData:初始化对话框或获得对话框中的数据。CWnd:GetWindowRect:获得CWnd的屏幕坐标。CWnd:GetDC:获得客户区的设备环境。CWnd:RedrawWindow:更新客户区中的指定矩形或区域。CWnd:UpdateWindow:更新客户区。CWnd:Invalidate:使整个客户区无效。CWnd:ShowWindow:显示或隐藏窗口。CWnd:ClientToScreen:将给定点或显示器上矩形的客户区坐标转换为屏幕坐标。CWnd:ScreenToClient:将给定点或显示器上矩形的屏幕坐标转换为客户坐
10、标。CWnd:SetWindowText:将窗口的文本或标题文字(如果有)设为指定的文本。CWnd:SetFont:设置当前字体。CWnd:GetDlgItemInt:将给定对话框中控件的文本转换为整数。CWnd:SetTimer:安装一个系统定时器,当它被激活时,发送一个WM_TIMER消息。CWnd:KillTimer:销毁一个系统定时器。CWnd:FlashWindow:使窗口闪烁一次。CWnd:MessageBox:创建并显示一个窗口,其中包含了应用程序提供的消息和标题。MFC窗口:重叠窗口(Overlapped),弹出窗口(Popup),子窗口(Child)MFC窗口不对窗口进行直接
11、的控制,而在API环境中却是可以的。如果不能在API环境中实现某项功能,那么肯定也不能在MFC环境中实现。举例来说,MFC库的CWnd可以创建一个窗口,但它只是过去在API环境中使用API调用的封装。创建MFC窗口是复杂的,首先,创建类CWnd的一个实例,然后调用类CWnd的一个成员函数,该成员函数调用API中的CreateWindow()函数。返回的窗口句柄保存在类CWnd的成员变量m_hWnd中注:因为窗口在内存中创建,而内存经常发生变化,窗口地址可能是经常变化的。因此,窗口句柄并非直接指向窗口对象,而是指向跟踪窗口对象地址的另一个指针。销毁窗口同样复杂,必须确保销毁了该窗口对象,以及封装
12、该窗口对像的CWnd实例。怎样应用MFC创建一个窗口:CWnd wndBOOL b=wnd.CreateEx(ExStyle,ClassName,WindowName,Style,x,y,Width,Height,parent,Menu,param);第一行代码创建了一个CWnd类的对象,第二行通过调用Windows API函数CreateWindowEx创建了真正的窗口。HWND hwnd=:CreateWindowEx(Exstyle,ClassName,WindowName,Style,x,y,Width,Height,Parent, meun,instance,Param); 因为CW
13、nd类只是封装了用于创建窗口的Window API函数(CreateWindowEx(),因此,从本质上讲, 创建窗口所必须的参数在API环境和MFC环境中是相同的; 参数style和Exstyle决定窗口的外观和类型(重叠,弹出,子窗口). 参数ClassName决定在创建窗口时使用的窗口类 参数WindowName决定窗口标题内容 参数x,y,Width,Height决定窗口的位置的大小. 参数parent指向拥有该窗口的窗口指针 参数Menu指向内存中的一个对象,作为它的菜单使用-除非创建一个子窗口,如果是这样的话 ,那么该参数是帮助父窗口识别子窗口的IDnumber 参数Instanc
14、e识别该窗口属于哪个应用程序,以便发送到该窗口的消息能被发送到正确的应用程序 的消息队列中。CWnd类填入Instance参数 参数param是在创建窗口时由窗口类使用的指针,该指针是指向附加信息的非强制性结构指针 返回的hwnd参数是指向创建的窗口对象的指针,但在未创建任何窗口时,该窗口数返回值为NULL 窗口句柄自动地保存在CWnd类的m_hWnd成员变量中. 参数规则: a.窗口名称参数 该参数是一个零结尾的文本串,用该串指明在窗口标题栏中显示的内容。如果窗口没有标题 栏,该参数可以为0 然而,某些通过控件也使用该参数。例如,按钮控件把该参数的内容放在按钮的表面。在 创建窗口标题栏后,可
15、以用类CWnd的成员函数SetWindowText(),来改变窗口标题栏的名 称. b.风格和扩展风格参数 这两个是32位的参数,用来指定创建什么类型的窗口。可以选择多种类型,如下面的例子所示: .WS_CHILD|WS_VISIBLE 窗口风格参数的作用包括: 用于创建三种基本窗口类的风格,用WM_CHILD创建一个子窗口;用 WM_POPUP创建一个弹出 窗口,WM_OVERLAPPED创建一个重叠窗口。如果不为窗口指定任何一种风格,那么窗口风格 默认为WM_OVERLAPPED. 用以增添窗口的非客户区特色的风格。例如可用WS_VSCROOLL窗口添加一个垂直滚动条. 由每个通用控件定义
16、的风格。例如,BS_FLAT按钮风格告诉按钮控件绘制一个二维按钮 用来标识控件组起始控件的风格,或者当用户敲击Tab键控制焦点在窗口中变化时,用 来指示哪个控件有资格获得输入焦点的风格. 在创建窗口以后,可以用CWnd的成员函数ModifyStyle()和ModifyStyleEx()改变窗口 风格。某些风格可能要求重画窗口,这时,可以给ModifySytle()函数添加三第三个参 数,自动激发类CWnd成员函数SetWindowPos()做重画工作。 CWnd wnd; wnd.ModifyStyle(0,WS_BORDER,SWP_NOZORDER);事实上,给MOdifyStyle()或
17、给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)的位置 创建窗口
18、以后,可以用类CWnd的成员函数MoveWindow()移动窗口 d.宽度和高度参数 这是两个32位的参数,用于以像素为单位指定窗口的大小。如果将参数Width和Heihght都 设置为CW_USEDEFAULT,则系统将根据桌面窗口的大小,自动选定窗口的大小。然而,对于 一个子窗口来说,系统系统将创建一个长和宽为的窗口。如果窗口的风格是WS_MINIMIZE 或WS_MAXIMIZE,那么系统将忽视用户为Width和Height设置的任何值。 创建窗口以后,可以用类CWnd的成员函数MoveWindow()重新设置窗口的大小。 e.Z_Order 当几个窗口占据屏幕上同一区域时,Z_Orde
19、r决定哪个窗口显示在哪个窗口之上。 创建窗口后,可以用CWnd的成员函数SetWindowPos()改变窗口Z的顺序 f.父窗口或物主窗口参数 该参数是指向类CWnd对象的指针,根据创建的窗口类型标识是父窗口还是物主窗口。 如果创建的是一个子窗口,那么用该参数来标识它的父窗口,该值不能为NULL。子 窗口只能出现在它的父窗口里面,当父窗口被销毁时它他们也被销毁;物主窗口最 小化时,则从属窗口被隐藏;但当物主窗口被隐藏时,从属窗口并不被隐藏 怎么使用MFC销毁一个窗口 删除一个MFC窗口可能有些烦琐,必须按下面的顺序删除两个对象: pWnd-DestroyWindow();/destroys w
20、indow Object delete pWnd; /destroys Cwnd Object 也可以只删除CWnd对象,因为DestroyWindow()是从CWnd的析构函中调用中,但不提倡 使用这种方法。销毁一个窗口而不先调用DestroyWindow()函数,将使某些析构消息不能 被任何从CWnd派生的类处理。你几乎不需自己销毁一个窗口,用户或系统通常会做这项 工作。如果需要在销毁窗口的同时销毁CWnd对象,则应该在CWnd的派生类中添加下面的 重载函数: CYourWnd:PostNcDestroy() delete this; PostNcDestroy()是销毁窗口前调用的最后一
21、个成员函数。但是,几乎不需要对该函数 进行重载,因为CWnd和派生类一般是嵌在另一个类中或建立在堆栈中的. 捆绑到一个已有的窗口 如果一个窗口是用Windows API在应用程序建立之前或外面创建的,并且需要把它封装到CWnd 类中,可以用下面的语句实现: CWnd wnd; wnd.Attach(hwnd); 这里的hwnd是已有窗口的句柄。Attach()只是把CWnd 的成员变量m_hWnd赋给hwnd. 也可以使用CWnd:Fromhandle(hwnd),它查看是否有CWnd对象已经封装了该窗口句柄并 返回该CWnd对象的指针。如果不存在这样的CWnd对象,将创建一个临时对象。如果是
22、临时 对象,则不要使用该指针,因为在应用程序空闲的时候,该指针指向的对象将被删除。 窗口类: 一个窗口类不是一个C+类,而是早于并存在C+之外的窗口专用的类。窗口类的作用就像一个 模板,可以由此创建其它窗口,并可以共享某些特征,包括下面所示的特征: 类风格 包括能给予窗口的一些微小的特征 类图标 如果窗口有图标,用它来指定窗口中显示的菜单 类菜单 如果窗口有菜单,用它来指定窗口中显示的菜单 类光标 当光标通过窗口的客户区时,用它来指定显示哪种鼠标形状 背景色 定义用什么颜色来擦除窗口的背景色。窗口的客户区将显示该颜色 窗口进程 定义处理任何发送到该窗口的消息时应该调用的函数。定义窗口进程 可能
23、是类唯一最重要的前提 窗口进程: 窗口与环境的交互是通过发送的接收消息实现的。如果系统要求窗口自己进行绘制 ,系统给它发送一个WM_PAINT消息;如果系统要求窗口销毁自己,则发送一个WM_ DESTROY消息。这些消息都由窗口的窗口进程处理,该窗口进程的地址在窗口类中 定义。对于发送到由相同的窗口类创建的窗口的消息,系统采用完全相同的窗口进 程进行处理。 怎样使用MFC创建一个窗口类: 当用户创建一个窗口类时,实际上只是在三个操作系统列表之一中注册一个WNDCLASS 结构。系统为每个窗口类类型维护一个列表: 系统全局类(System Global Class) 在系统启动时注册,且必须注册
24、,对所有应用程序 都有效 系统程序全局类(Application Global Class)由应用程序注册,只对应用程序及应用 程序的线程有效 应用程序局部类(Application Local Class)由应用程序注册,并只对注册它们的应用 程序或DLL有效 当系统搜索一个窗口类时,从应用程序局部类开始,然后搜索应用程序全局类,最后 搜索系统全局类 要创建一个窗口类,可以及先创建WNDCLASS结构的实例,然后用MFC类库的 AfxRegisterClass()注册它。也可以用MFC类库的AfxRegisterWndClass()来创建一个 基于调用参数的WNDCLASS对象 使用AfxRegisterWndClass()函数注册一个窗口类: AfxRegisterWndClass()函数在使用上是非常自动化的,一些通常需要你提供的参数都能自己 填入,甚至连新的窗口类的名字也能自动产生。 LPCTSTR lpszClassName=AfxRegisterWndClas