第4章对话框和常用控件_第1页
第4章对话框和常用控件_第2页
第4章对话框和常用控件_第3页
第4章对话框和常用控件_第4页
第4章对话框和常用控件_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 第第4章章 对话框和常用控件对话框和常用控件(Dialog and Common Controls)主讲教师:刘怀广主讲教师:刘怀广 窗口风格窗口风格WS_CHILD、WS_OVERLAPED、WS_POPUP窗口风格窗口风格一般过程是一般过程是:添加对话框资源;:添加对话框资源; 设置对话框的属性;设置对话框的属性; 添加和布局控件;添加和布局控件; 创建对话框类;创建对话框类; 添加对话框代码;添加对话框代码; 在程序中调用对话框在程序中调用对话框4.1 对话框的使用对话框的使用4.1.1 资源与资源标识资源与资源标识1. 资源的分类资源的分类 创建单文档应用程序创建单文档应用程序Ex_

2、SDI,然后项目工作区窗口切换到,然后项目工作区窗口切换到“ResourceView”页面。页面。资源类别资源类别资源标识符资源标识符4.1.1 资源与资源标识资源与资源标识 快捷键列表快捷键列表(Accelerator):一系列组合键用来引发一个动:一系列组合键用来引发一个动作。与菜单命令相关联,代替鼠标操作。作。与菜单命令相关联,代替鼠标操作。 对话框对话框(Dialog):含有按钮、列表框、编辑框等各种控件:含有按钮、列表框、编辑框等各种控件的窗口。的窗口。 图标图标(Icon):显示在桌面的位图:显示在桌面的位图,有有32x32/16x16像素两种像素两种规格规格 菜单菜单(Menu)

3、:可以完成应用程序的大部分操作。:可以完成应用程序的大部分操作。 字串表字串表(String Table):全局字符串或其他标识符。:全局字符串或其他标识符。 工具栏按钮工具栏按钮(Toolbar):通常与菜单命令相对应,提高工:通常与菜单命令相对应,提高工作效率。作效率。 版本信息版本信息(Version):应用程序的版本、用户注册码等相:应用程序的版本、用户注册码等相关信息。关信息。除了上述常用资源类别外,也可以自己添加新的资源类别。除了上述常用资源类别外,也可以自己添加新的资源类别。4.1.1 资源与资源标识资源与资源标识2. ID标识符标识符-遵循下列规则遵循下列规则 在标识符名称中允

4、许使用在标识符名称中允许使用字母字母az、AZ、09以及以及下划线下划线。 标识符名称标识符名称不区分不区分大小写字母,如大小写字母,如new_idd与与New_Idd是相是相同的标识符。同的标识符。 不能以数字开头,如不能以数字开头,如8BIT是不合法的标识符名。是不合法的标识符名。除了上述规则外,除了上述规则外,Visual C+还提供了一些常用的定义标识还提供了一些常用的定义标识符名称的前缀供用户使用、参考。符名称的前缀供用户使用、参考。4.1.1 资源与资源标识资源与资源标识4.1.2 添加对话框资源添加对话框资源(1) 选择选择“插入插入”“资源资源”菜单,或按快捷键菜单,或按快捷键

5、Ctrl+R。如图。如图所示。所示。新建新建 创建一个由创建一个由“资源类型资源类型”列表中指定类型的新资源列表中指定类型的新资源;定制定制 创建创建“资源类型资源类型”列表中没有的新类型的资源列表中没有的新类型的资源;导入导入 是用于将外部已有的位图、图标、光标或其他定制的资源是用于将外部已有的位图、图标、光标或其他定制的资源添加到当前应用程序中。添加到当前应用程序中。4.1.2 添加对话框资源添加对话框资源表表4.2 对话框资源类型对话框资源类型4.1.2 添加对话框资源添加对话框资源(2) 选中选中“Dialog”,单击,单击新建新建按钮,系统就会自动为当前应用按钮,系统就会自动为当前应

6、用程序添加了一个对话框资源,并出现如图所示的界面。程序添加了一个对话框资源,并出现如图所示的界面。对话框模板对话框模板控件工具栏控件工具栏布局工具栏布局工具栏默认标识符默认标识符4.1.3 设置对话框属性设置对话框属性 在对话框模板处右击鼠标,从弹出的快捷菜单中选择在对话框模板处右击鼠标,从弹出的快捷菜单中选择“属性属性” ,出现如图所示的对话框属性窗口。出现如图所示的对话框属性窗口。 对话框的属性有对话框的属性有General(一般一般)、Styles (风格风格)、More Styles(更更多风格多风格)、Extended Styles(扩展风格扩展风格)、More Extended S

7、tyles(更更多扩展风格多扩展风格)等部分,这里仅介绍最常用的等部分,这里仅介绍最常用的General属性。属性。表表4.3 对话框的对话框的General属性属性4.1.3 设置对话框属性设置对话框属性 将添加的对话框的属性进行将添加的对话框的属性进行以下以下3点修改,结果如图点修改,结果如图: 对话框对话框标识符标识符改成改成IDD_DIALOG_FIRST; 对话框对话框标题标题改为改为“我的第一我的第一个对话框个对话框”; 单击单击字体字体按钮,通过弹出的按钮,通过弹出的字体对话框将对话框内的文字体对话框将对话框内的文本设置成本设置成“宋体,宋体,9” 。4.1.3 设置对话框属性设

8、置对话框属性4.1.4 添加和布局控件添加和布局控件1. 控件的添加控件的添加 利用此工具栏中的各个按钮可以顺利完成控件的添加。利用此工具栏中的各个按钮可以顺利完成控件的添加。控件的选择控件的选择静态文本静态文本组框组框复选框复选框组合框组合框水平滚动条水平滚动条旋转按钮旋转按钮滑动条滑动条列表视图列表视图标签标签复合编辑复合编辑月历月历用户定制控件用户定制控件静态图片静态图片编辑框编辑框按钮按钮单选框单选框列表框列表框垂直滚动条垂直滚动条进展条进展条热键热键树形视图树形视图动画动画日期选择日期选择IP地址地址扩展组合框扩展组合框4.1.4 添加和布局控件添加和布局控件2. 控件的选取控件的选

9、取单个控件单个控件: 用鼠标直接选取用鼠标直接选取 用用Tab键选取键选取:系统会根据控件的添加次序自动设置相应的:系统会根据控件的添加次序自动设置相应的Tab键次序。键次序。多个控件:多个控件: 按住鼠标左键不放,拖出一个大的虚框,则被该虚框所包围按住鼠标左键不放,拖出一个大的虚框,则被该虚框所包围的控件都将被选取。的控件都将被选取。 先按住先按住Shift键不放,然后用鼠标选取控件。键不放,然后用鼠标选取控件。(a)(b)4.1.4 添加和布局控件添加和布局控件图图4.8 控件布局工具栏控件布局工具栏3. 控件的删除、复制和布局控件的删除、复制和布局 对话框编辑器中提供了控件布局工具栏,它

10、可以自动地排对话框编辑器中提供了控件布局工具栏,它可以自动地排列对话框内的控件,并能改变控件的大小。列对话框内的控件,并能改变控件的大小。表表4.4 “编排编排”菜单命令的快捷键及功能描述菜单命令的快捷键及功能描述4.1.5 创建对话框类创建对话框类 在对话框资源模板的空白区域在对话框资源模板的空白区域(没有其他元素或控件没有其他元素或控件)内内双双击鼠标击鼠标,将弹出,将弹出“添加新类添加新类”对话框。对话框。 单击单击OK按钮。在按钮。在“New Class”对话框的对话框的Name框中输框中输入类名入类名CFirstDlg。Base class和和Dialog ID内容是由系统内容是由系

11、统自动设置的,一般无需修改。自动设置的,一般无需修改。 从从Base class框的内容可以看出,用户对话框类是从基类框的内容可以看出,用户对话框类是从基类CDialog派生而来的。派生而来的。 单击单击OK按钮,一个基于对话框资源模板的对话框类按钮,一个基于对话框资源模板的对话框类CFirstDlg就创建好了。就创建好了。 4.1.6 添加对话框代码添加对话框代码在在MFC ClassWizard对话框,在对话框,在IDs列表中选择列表中选择CFirstDlg。1)初始化:)初始化:在在Messages框中找到并选定框中找到并选定WM_INITDIALOG消消息,如图示。息,如图示。4.1.

12、6 添加对话框代码添加对话框代码BOOL CFirstDlg:OnInitDialog() CDialog:OnInitDialog(); / TODO: Add extra initialization here CStatic* pWnd =(CStatic*)GetDlgItem(IDC_STATIC_1); pWnd-SetWindowText(这是我的第一个对话框!这是我的第一个对话框!); return TRUE;/ return TRUE unless you set the focus to a control/ EXCEPTION: OCX Property Pages sh

13、ould return FALSE2)选择)选择OnInitDialog函数函数,单击,单击Edit Code按钮按钮(或直接在函或直接在函数名双击鼠标数名双击鼠标),将自动出现该函数代码编辑窗口,将自动出现该函数代码编辑窗口,添加代码添加代码:CStatic是静态文本控件的是静态文本控件的MFC类,类,SetWindowText是是CWnd的的一个成员函数,用来设置窗口的文本内容。一个成员函数,用来设置窗口的文本内容。GetDlgItem也是也是CWnd类的一个成员函数,用来获得对话框中控件类的一个成员函数,用来获得对话框中控件(参数是控件参数是控件的的ID标识符,这里是标识符,这里是IDC

14、_STATIC_1)的窗口指针。的窗口指针。4.1.7 在程序中调用对话框在程序中调用对话框(1) 在菜单的空位置上双击鼠标左键,则出现它的属性对话框,在在菜单的空位置上双击鼠标左键,则出现它的属性对话框,在标题框中输入标题框中输入“测试测试(&T)”,结果如图所示,其中符号,结果如图所示,其中符号&用来其后用来其后面的字符作为该菜单项的助记符,这样当按住面的字符作为该菜单项的助记符,这样当按住“Alt”键键不放,再敲不放,再敲击该助记符键时,对应的菜单项就会被选中,或在菜单打开时,击该助记符键时,对应的菜单项就会被选中,或在菜单打开时,直接按相应的助记符键,对应的菜单项也会被

15、选中。直接按相应的助记符键,对应的菜单项也会被选中。4.1.7 在程序中调用对话框在程序中调用对话框(2) 单击菜单属性对话框中的单击菜单属性对话框中的“保存可见保存可见”(Keep Visible)按钮。单击按钮。单击“测试测试”菜单项下方的空位置,在属性对话框中,输入标题菜单项下方的空位置,在属性对话框中,输入标题“对话框对话框(&D)”,在,在ID框输入该菜单项的资源标识:框输入该菜单项的资源标识:ID_TEST_DLG,如图所,如图所示。示。(3) 单击单击“测试测试”菜单项并按住鼠标左键不放,移动鼠标,将菜单项并按住鼠标左键不放,移动鼠标,将“测试测试”菜单项移到菜单项移到“

16、查看查看”和和“帮助帮助”菜单项之间,然后释放鼠标。菜单项之间,然后释放鼠标。4.1.7 在程序中调用对话框在程序中调用对话框(4) 弹出弹出MFC ClassWizard对话框。类选择对话框。类选择“CMainFrame”,IDs选择选择“ID_TEST_DLG”,在,在Messages框中选择框中选择COMMAND消息。消息。(5) 单击单击Add Function按钮,出现按钮,出现Add Member Function对对 话框,输入成员函数的名称:话框,输入成员函数的名称:OnTestDlg,如图所示。当应用,如图所示。当应用程序运行时,程序运行时,用户选择用户选择“测试测试”“对话

17、框对话框”,则该函数则该函数OnTestDlg被调用,执行函数中的代码。被调用,执行函数中的代码。4.1.7 在程序中调用对话框在程序中调用对话框 代码中,代码中,DoModal是是CDialog基类成员函数,用来将对话基类成员函数,用来将对话框按框按模式方式模式方式来显示。来显示。(6) 单击单击OK ,ClassWizard的的Member functions列表中将列表中将列出新增加的成员函数。列出新增加的成员函数。void CMainFrame:OnTestDlg( ) CFirstDlg dlg;/ 定义对话框类对象定义对话框类对象 dlg.DoModal(); / 显示对话框显示对

18、话框4.1.7 在程序中调用对话框在程序中调用对话框(8) 编译运行。在应用程序菜单上,选择编译运行。在应用程序菜单上,选择“测试测试”“对话框对话框”菜单项,将出现如图对话框。菜单项,将出现如图对话框。(7) 在在OnTestDlg函数的实现文件函数的实现文件MainFrm.cpp的前面添加的前面添加CFirstDlg类的包含语句,即:类的包含语句,即:#include Ex_SDI.h#include MainFrm.h#include FirstDlg.h4.1.8 使用无模式对话框使用无模式对话框模式对话框:模式对话框:对话框被弹出,户必须对话框作出相应的操作,对话框被弹出,户必须对话

19、框作出相应的操作,在退出对话框之前,其它操作不能继续执行在退出对话框之前,其它操作不能继续执行。无模式对话框:无模式对话框:是指当对话框被弹出后,是指当对话框被弹出后,一直保留在屏幕上一直保留在屏幕上,用用户可以继续进行其它操作户可以继续进行其它操作。4.1.8 使用无模式对话框使用无模式对话框创建并使用无模式对话框,其步骤如下:创建并使用无模式对话框,其步骤如下:添加一个对话框,将其标识符设为添加一个对话框,将其标识符设为IDD_DIALOG_SECOND。为为IDD_DIALOG_SECOND对话框资源创建一个对话框类对话框资源创建一个对话框类CSecondDlg。 MFC ClassWi

20、zard,从,从“Class name”列表中选择列表中选择CSecondDlg,在,在IDs列表中选择列表中选择IDOK,它是对话框中,它是对话框中OK按按钮的标识符,然后在钮的标识符,然后在Messages框中选择框中选择BN_CLICKED(单击按单击按钮钮)消息,单击消息,单击Add Function按钮,输入成员函数的名称,保按钮,输入成员函数的名称,保留系统默认的函数名为留系统默认的函数名为OnOK。该函数是对。该函数是对OK按钮单击消息按钮单击消息的映射,即当用户单击此对话框中的的映射,即当用户单击此对话框中的OK按钮时,按钮时,OnOK函数函数被执行。被执行。 修改修改CSec

21、ondDlg:OnOK函数中的代码。函数中的代码。4.1.8 使用无模式对话框使用无模式对话框void CSecondDlg:OnOK( ) DestroyWindow(); / 终止对话框显示终止对话框显示 delete this; / 删除对话框,释放内存空间删除对话框,释放内存空间 代码中,代码中,DestroyWindow是对话框基类是对话框基类CWnd的一个的一个成员函数,用来终止窗口。成员函数,用来终止窗口。4.1.8 使用无模式对话框使用无模式对话框将项目工作区切换到将项目工作区切换到ClassView页面,展开页面,展开CMainFrame类的类的所有成员,双击所有成员,双击O

22、nTestDlg自动定位到该函数的实现代码处,自动定位到该函数的实现代码处,修改代码如下:修改代码如下:void CMainFrame:OnTestDlg( ) CSecondDlg *pDlg=new CSecondDlg;/ 动态分配内存空间动态分配内存空间 pDlg-Create(IDD_DIALOG_SECOND); / 创建对话框创建对话框 pDlg-ShowWindow(SW_NORMAL); / 显示对话框显示对话框 在文件在文件MainFrm.cpp的前面添加包含语句的前面添加包含语句,编译运行。编译运行。#include SecondDlg.h4.1.8 对话框的使用对话框的

23、使用1.DoModal() 重载函数,重载DoModal()成员函数2.PreSubclassWindow() 重载函数,允许首先子分类一个窗口3.OnCreate() 消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建4.OnSize() 消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化5.OnMove() 消息响应函数,响应WM_MOVE消息,以告诉窗口正在移动6.OnSetFont() 消息响应函数,响应WM_SETFONT消息,以允许改变对话框中控件的字体7.OnInitDialog() 消息响应函数,响应WM_INITDIALOG消息允

24、许初始化对话框中的控件,或创建新控件8.OnShowWindow() 消息响应函数,响应WM_SHOWWINDOW消息,被ShowWindow()函数调用9.OnCtlColor() 消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色10. OnChildNotify() 重载函数,作为WM_CTLCOLOR消息的结果发送1.OnClose() 消息响应函数,响应WM_CLOSE消息,当关闭按钮被单击的时候,该函数被调用2.OnKillFocus() 消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送3.OnDes

25、troy() 消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送4.OnNcDestroy() 消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送5.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用4.1.8 对话框的使用对话框的使用1.PreSubclassWindow() 重载函数,允许用户首先子分类一个窗口2.OnCreate() 消息响应函数,响应WM_CREATE消息,以告诉一个窗口已经被创建3.OnSize() 消息响应函数,响应WM_SIZE消息,以告诉窗口大小发生变化4.On

26、Move() 消息响应函数,响应WM_MOVE消息,以告诉窗口正在移动5.OnSetFont() 消息响应函数,响应WM_SETFONT消息,以允许改变对话框中控件的字体1.OnClose() 消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息2.OnDestroy() 消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息3.OnNcDestroy() 消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息4.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作,被CWn

27、d调用4.2 控件的创建和使用方法控件的创建和使用方法 为了更好地发挥控件作用,必须理解和掌握控件的属性、为了更好地发挥控件作用,必须理解和掌握控件的属性、消息以及创建和使用的方法。消息以及创建和使用的方法。4.2.1 控件的创建方法控件的创建方法 一种是一种是将控件的父窗口指定为对话框将控件的父窗口指定为对话框,这样做的好处是,这样做的好处是明显的,因为当应用程序启动该对话框时,明显的,因为当应用程序启动该对话框时,Windows系统就系统就会为对话框创建控件;而当对话框消失时,控件也随之清除。会为对话框创建控件;而当对话框消失时,控件也随之清除。 另一种是另一种是将控件看作是任一窗口的子窗

28、口将控件看作是任一窗口的子窗口,并通过调用,并通过调用相应的相应的Create函数来创建。函数来创建。4.2.1 控件的创建方法控件的创建方法例例Ex_DlgCtrls 使用控件的编程方式来创建一个按钮使用控件的编程方式来创建一个按钮 选择选择“文件文件”“新建新建”菜单,在弹出的菜单,在弹出的新建对话框新建对话框的项的项目类型列表中选择目类型列表中选择MFC AppWizard(exe)类型,在工程框类型,在工程框中输入项目名中输入项目名Ex_DlgCtrls。1. 单击单击确定确定按钮,在出现的按钮,在出现的“Step 1”对话框中选择对话框中选择“基本基本对话对话”应用程序类型,单击应用

29、程序类型,单击完成完成按钮。按钮。 将项目工作区切换到将项目工作区切换到ClassView页面,展开页面,展开CEx_DlgCtrlsDlg类,右击类,右击CEx_DlgCtrlsDlg类名,弹出如图所示快捷菜单。类名,弹出如图所示快捷菜单。4.2.1 控件的创建方法控件的创建方法 从快捷菜单中选择从快捷菜单中选择Add Member Variable,定义一个,定义一个CButton类对象类对象m_btnWnd,通常以,通常以“m_”来作为变量的来作为变量的开头,表示开头,表示“成员成员”(member)的意思。单击的意思。单击OK。4.2.1 控件的创建方法控件的创建方法 在项目工作区窗口

30、的在项目工作区窗口的ClassView页面中,双击页面中,双击OnInitDialog函函数名。数名。BOOL CEx_DlgCtrlsDlg:OnInitDialog() CDialog:OnInitDialog(); m_btnWnd.Create(你好你好, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20, 20, 120, 60), this, 201); / 创建创建 CFont *font = this-GetFont();/ 获取对话框的字体获取对话框的字体 m_btnWnd.SetFont(font);/ 设置控件字体设置控件字体

31、 return TRUE; / return TRUE unless you set the focus to a control Create用来创建一个按钮控件,该函数用来创建一个按钮控件,该函数第一个参数第一个参数:指定该按钮的标题,指定该按钮的标题,第二个参数第二个参数:指定控件的风格,:指定控件的风格,第三第三个参数个参数:指定它在父窗口中的位置和大小,:指定它在父窗口中的位置和大小,第四个参数第四个参数:指定父窗口指针,指定父窗口指针,最后一个参数最后一个参数:该控件的标识值。:该控件的标识值。4.2.2 控件的消息及消息映射控件的消息及消息映射typedef struct tag

32、MSG / msg HWND hwnd; / 接收到消息的窗口句柄接收到消息的窗口句柄 UINT message;/ 消息消息 WPARAM wParam;/ 消息的附加信息,它的含义取消息的附加信息,它的含义取决于决于message LPARAM lParam; / 消息的附加信息,它的含义消息的附加信息,它的含义取决于取决于message DWORD time; / 消息传送时的时间消息传送时的时间 POINT pt; / 消息传送时,光标所在的屏幕坐标消息传送时,光标所在的屏幕坐标 MSG; 当控件的状态发生改变时,控件就会向其父窗口发送消息,这当控件的状态发生改变时,控件就会向其父窗口

33、发送消息,这个消息称为个消息称为“通知消息通知消息”。对于每个消息,系统都会用一个。对于每个消息,系统都会用一个MSG结结构来记录,构来记录,MSG具有下列结构:具有下列结构:4.2.2 控件的消息及消息映射控件的消息及消息映射 通知消息通常是一条通知消息通常是一条WM_COMMAND消息,这条消息的消息,这条消息的wParam参数的低位字中含有控件标识符,参数的低位字中含有控件标识符,wParam参数的高参数的高位字则为通知代码,位字则为通知代码,lParam参数则是指向控件的句柄。参数则是指向控件的句柄。 而对于有些控件,其通知消息通常是一条而对于有些控件,其通知消息通常是一条WM_NOT

34、IFY消息,这条消息的消息,这条消息的wParam参数是发送通知消息的控件的标识参数是发送通知消息的控件的标识符,而符,而lParam参数则是指向一个结构指针。参数则是指向一个结构指针。4.2.2 控件的消息及消息映射控件的消息及消息映射1. 映射控件消息映射控件消息 将项目工作区窗口切换到将项目工作区窗口切换到ResourseView页面,双击页面,双击Dialog资源下的标识资源下的标识DD_EX_DLGCTRLS_DIALOG,打开该,打开该对话框资源模板。对话框资源模板。1)添加一个按钮控件,保留其默认属性。如图所示。)添加一个按钮控件,保留其默认属性。如图所示。2) 打开打开MFC

35、ClassWizard,选择,选择CEx_DlgCtrlsDlg,在,在IDs中中选 择选 择 I D C _ B U T TO N 1 , 然 后 在, 然 后 在 M e s s a g e s 框 中 选 择框 中 选 择BN_CLICKED消息。消息。4.2.2 控件的消息及消息映射控件的消息及消息映射3) 单击单击Add Function或双击或双击BN_CLICKED,出现,出现“Add Member Function”对话框,在这里可以输入成员函数的名称。对话框,在这里可以输入成员函数的名称。4) 单击单击OK,新增加的成员函数。单击,新增加的成员函数。单击Edit Code按钮

36、按钮(或直或直接在函数名双击鼠标接在函数名双击鼠标)。void CEx_DlgCtrlsDlg:OnButton1() MessageBox(你按下了你按下了Button1按钮!按钮!);4.2.2 控件的消息及消息映射控件的消息及消息映射2. 映射控件映射控件通用通用消息消息 (自学自学) 也可通过也可通过WM_COMMAND消息的映射来处理一个或多个消息的映射来处理一个或多个控件的通用消息:控件的通用消息:1)打开)打开MFC ClassWizard,在,在IDs列表中选择列表中选择CEx_DlgCtrlsDlg,在,在Messages框中找到并双击框中找到并双击OnCommand,这样,

37、这样OnCommand消息函数就添加好了。消息函数就添加好了。2) 在在OnCommand函数中添加下列代码:函数中添加下列代码: 4.2.2 控件的消息及消息映射控件的消息及消息映射BOOL CEx_DlgCtrlsDlg:OnCommand(WPARAM wParam, LPARAM lParam) WORD nCode = HIWORD(wParam); / 控件的通知消息控件的通知消息 WORD nID = LOWORD(wParam);/ 控件的控件的ID值值 if (nID = 201)&(nCode = BN_CLICKED) MessageBox(你按下了你按下了你好你

38、好按钮!按钮!); if (nID = IDC_BUTTON1)&(nCode = BN_CLICKED) MessageBox(这是在这是在OnCommand处理的结果!处理的结果!); return CDialog:OnCommand(wParam, lParam);注意:第一条注意:第一条if语句中,语句中,201是前面用是前面用Create创建按钮时指创建按钮时指定的标识值。定的标识值。4.2.3 控件的数据交换控件的数据交换(DDX)和数据校验和数据校验(DDV) MFC ClassWizard可以很容易地为一个控件定义关联可以很容易地为一个控件定义关联变量并可设置其数据范围

39、。例如,下面的步骤是为变量并可设置其数据范围。例如,下面的步骤是为CEx_DlgCtrlsDlg类的按钮控件类的按钮控件IDC_BUTTON1添加并使添加并使用其关联变量用其关联变量m_RelBtn。 MFC ClassWizardMember Variables页面。页面。(2) 选定选定Class name CEx_DlgCtrlsDlg 在在Control IDs列列表中表中 IDC_BUTTON1 双击鼠标左键双击鼠标左键 Add Member Variable对话框,在对话框设置变量的名称、类别和数据类对话框,在对话框设置变量的名称、类别和数据类型,如图所示。型,如图所示。4.2.3

40、 控件的数据交换控件的数据交换(DDX)和数据校验和数据校验(DDV)4.2.3 控件的数据交换控件的数据交换(DDX)和数据校验和数据校验(DDV)/ Dialog Data/AFX_DATA(CEx_DlgCtrlsDlg)enum IDD = IDD_EX_DLGCTRLS_DIALOG ;/ 枚举类型CButtonm_RelBtn;CStringm_strEdit;/AFX_DATA(3) 在对话框中任意添加一个编辑框控件,取默认的在对话框中任意添加一个编辑框控件,取默认的ID,为其关,为其关联一个联一个CString类的成员变量类的成员变量m_strEdit,下方数据校验窗口中,下方

41、数据校验窗口中设置变量允许的最大字符个数。设置变量允许的最大字符个数。(4) 单击单击确定确定 打开打开CEx_DlgCtrlsDlg源文件,源文件,三方面的修改三方面的修改。Ex_DlgCtrlsDlg.h中,添加控件关联变量的声明,代码如下面中,添加控件关联变量的声明,代码如下面的加粗部分:的加粗部分:Ex_DlgCtrlsDlg.cpp中的中的CEx_DlgCtrlsDlg处,添加了控件处,添加了控件变量的一些初始代码:变量的一些初始代码:CEx_DlgCtrlsDlg:CEx_DlgCtrlsDlg(CWnd* pParent /*=NULL*/): CDialog(CEx_DlgCt

42、rlsDlg:IDD, pParent)/AFX_DATA_INIT(CEx_DlgCtrlsDlg) m_strEdit = _T();/AFX_DATA_INIT4.2.3 控件的数据交换控件的数据交换(DDX)和数据校验和数据校验(DDV)在在Ex_DlgCtrlsDlg.cpp文件中的文件中的DoDataExchange函数体内,函数体内,添加了控件的添加了控件的DDX/DDVvoid CEx_DlgCtrlsDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /调用此函数作为DDX开始 /AFX_DA

43、TA_MAP(CEx_DlgCtrlsDlg) DDX_Control(pDX, IDC_BUTTON1, m_RelBtn); DDX_Text(pDX, IDC_EDIT1, m_strEdit); /将IDC_EDIT1与m_strEdit进行数据交换 DDV_MaxChars(pDX, m_strEdit, 20); /校验m_strEdit的最大字符个数不超过20 /AFX_DATA_MAP4.2.3 控件的数据交换控件的数据交换(DDX)和数据校验和数据校验(DDV)void CEx_DlgCtrlsDlg:OnButton1() UpdateData();/ 默认参数值是默认参数

44、值是TRUEm_RelBtn.SetWindowText(m_strEdit);(5) 可以使用可以使用CWnd:UpdateData函数实现控件数据的输入函数实现控件数据的输入和读取。和读取。 代码中,代码中,UpdateData函数只有一个为函数只有一个为TRUE或或FALSE的的参数。参数。4.2.3 控件的数据交换控件的数据交换(DDX)和数据校验和数据校验(DDV)(6) 运行该程序,当在编辑框中输入运行该程序,当在编辑框中输入“Hello”后,单击后,单击Button1按钮,按钮,OnButton1函数中的函数中的UpdateData将编辑框将编辑框内容保存到内容保存到m_strE

45、dit变量中,从而执行下一条语句后按钮变量中,从而执行下一条语句后按钮的名称就变成了编辑框控件中的内容的名称就变成了编辑框控件中的内容“Hello”,如图所示。,如图所示。图图4.33 使用控件的数据成员变量使用控件的数据成员变量4.2.3 控件的数据交换控件的数据交换(DDX)和数据校验和数据校验(DDV)4.3 常用控件常用控件分为三类:分为三类:Windows公共控件公共控件ActiveX控件控件MFC新增的一些控件新增的一些控件4.3 常用控件常用控件4.3.1 静态控件和按钮静态控件和按钮1. 静态控件静态控件 一个静态控件是用来显示一个字符串、框、矩形、图标、一个静态控件是用来显示

46、一个字符串、框、矩形、图标、位图或增强的图元文件。它可以被用来作为标签、框或位图或增强的图元文件。它可以被用来作为标签、框或用来分隔其它的控件。一个静态控件一般不接收用户输用来分隔其它的控件。一个静态控件一般不接收用户输入,也不产生通知消息。入,也不产生通知消息。 属于静态控件的有:属于静态控件的有:静态文本静态文本( )、组框组框( )和和静静态图片态图片( )三种。其中,静态图片控件的一般属性对三种。其中,静态图片控件的一般属性对话框如图话框如图4.34所示。所示。 4.3.1 静态控件和按钮静态控件和按钮General属性对话框属性对话框表表4.6 静态图片控件的静态图片控件的Gener

47、al和和Style属性属性4.3.1 静态控件和按钮静态控件和按钮2. 按钮按钮常见的常见的3种类型:种类型:按键按钮、单选按钮、复选框按钮按键按钮、单选按钮、复选框按钮。单选按钮单选按钮:分为:分为一般和自动一般和自动两种类型。在自动类型中,若选中两种类型。在自动类型中,若选中同同组组中的某个单选按钮,则其余的单选按钮的选中状态就会清除。中的某个单选按钮,则其余的单选按钮的选中状态就会清除。按键按钮按键按钮:按键按钮有两种风格:按键按钮有两种风格:标准按键按钮和默认按键标准按键按钮和默认按键按钮。按钮。复选框复选框:选中时,复选框中就加上一个:选中时,复选框中就加上一个“”标记,通常复选框标

48、记,通常复选框只有选中和未选中两种状态。设定成三态复选框的方法是在复选只有选中和未选中两种状态。设定成三态复选框的方法是在复选框属性对话框的框属性对话框的Style页面中选中页面中选中“(状态状态)Tri-state”项。项。 4.3.1 静态控件和按钮静态控件和按钮3. 按钮的消息按钮的消息常见的只有两个:常见的只有两个:BN_CLICKED (单击按钮单击按钮)BN_DOUBLE- CLICKED (双击按钮双击按钮)4.3.1 静态控件和按钮静态控件和按钮void SetCheck( int nCheck );int GetCheck( ) const; nCheck和和GetCheck

49、返回值:返回值:0不选中,不选中,1选中,选中,2不确定不确定(仅用于三态按钮仅用于三态按钮)4. 按钮选中操作按钮选中操作 CButton类的类的SetCheck和和GetCheck分别用来设置或分别用来设置或获取指定按钮的选中状态。获取指定按钮的选中状态。4.3.1 静态控件和按钮静态控件和按钮5. 示例:制作问卷调查示例:制作问卷调查4.3.1 静态控件和按钮静态控件和按钮例例Ex_Research 制作问卷调查制作问卷调查1)创建并设计对话框创建并设计对话框 创建一个默认的对话框应用程序创建一个默认的对话框应用程序Ex_Research。 Visual C+会自动打开对话框编辑器并显示

50、对话框资源模板。会自动打开对话框编辑器并显示对话框资源模板。 调整对话框的大小。调整对话框的大小。右击添加的组框控件。右击添加的组框控件。ID为默认的为默认的IDC_STATIC。Caption属属性内容由性内容由“Static”改成改成“你的年龄你的年龄”。组框控件的。组框控件的Styles属属性:性:“水平对齐水平对齐”属性用来指定文本在顶部的左边属性用来指定文本在顶部的左边(Left)、居、居中中(Center)还是右边还是右边(Right)。默认。默认(Default)选项表示左对齐。选项表示左对齐。4.3.1 静态控件和按钮静态控件和按钮 在组框内添加在组框内添加4个个单选按钮单选按

51、钮,默认的,默认的ID依次为依次为IDC_RADIO1、IDC_RADIO2、IDC_RADIO3和和IDC_RADIO4。 添加一个添加一个静态文本静态文本,标题设为,标题设为“你使用的接入方式:你使用的接入方式:”,然,然后在其下再添加后在其下再添加4个单选按钮,标题分别是个单选按钮,标题分别是“FTTL或或ADSL”、“单位单位LAN”、“拨号拨号56K”和和“其他其他”。 添加一个添加一个组框控件组框控件,其标题为,其标题为“你上网主要是你上网主要是”。然后添加。然后添加四个复选框,其标题分别为四个复选框,其标题分别为“收发邮件收发邮件”、“浏览资料浏览资料”、“聊天游戏聊天游戏”和和

52、“其他。其他。4.3.1 静态控件和按钮静态控件和按钮 对话框测试后,可以发现:顺序添加的这对话框测试后,可以发现:顺序添加的这8个单选按钮全部个单选按钮全部变成一组,在这组中只有一个单选按钮被选中,这不符合我变成一组,在这组中只有一个单选按钮被选中,这不符合我们的本意。解决这个问题的最好的办法是将每一组中的第一们的本意。解决这个问题的最好的办法是将每一组中的第一个单选按钮的个单选按钮的Group(组组)属性属性选中。选中。 分别将这二个问题中的第一个单选按钮的分别将这二个问题中的第一个单选按钮的Group(组组)属性均属性均选中。选中。 单击对话框编辑器工具栏上的单击对话框编辑器工具栏上的切

53、换辅助线按钮切换辅助线按钮,然后将对话,然后将对话框中的控件调整到辅助线以内,并适当对其他控件进行调整。框中的控件调整到辅助线以内,并适当对其他控件进行调整。这样,整个问卷调查的对话框就设计好了,单击工具栏上的这样,整个问卷调查的对话框就设计好了,单击工具栏上的测试对话框按钮测试对话框按钮 进行测试。进行测试。2) 完善代码完善代码(1) 将项目工作区切换到将项目工作区切换到ClassView(类视图类视图)页面,展开页面,展开CEx_ResearchDlg类所有成员,双击类所有成员,双击OnInitDialog函数名函数名BOOL CEx_ResearchDlg:OnInitDialog()

54、 CDialog:OnInitDialog(); CheckRadioButton(IDC_AGE_L18, IDC_AGE_M38, IDC_AGE_18T27); CheckRadioButton(IDC_CM_FTTL, IDC_CM_OTHER, IDC_CM_FTTL); CButton* pBtn = (CButton*)GetDlgItem(IDC_DO_POP); pBtn-SetCheck(1);/ 使使“收发邮件收发邮件”复选框选中复选框选中 return TRUE; / return TRUE unless you set the focus to a control G

55、etDlgItem是是CWnd类的一个成员函数,用来获得对话框中类的一个成员函数,用来获得对话框中控件的窗口指针。控件的窗口指针。4.3.1 静态控件和按钮静态控件和按钮(2) 用用MFC ClassWizard在在CEx_ResearchDlg类中添加类中添加IDOK按钮的按钮的BN_CLICKED消息映射,并添加下列代码。消息映射,并添加下列代码。void CEx_ResearchDlg:OnOK() CString str, strCtrl;/ 定义两个字符串变量,定义两个字符串变量,CString是操是操作字符串的作字符串的MFC类类 / 获取第一个问题的用户选择获取第一个问题的用户选

56、择str = 你的年龄:你的年龄:;UINT nID = GetCheckedRadioButton( IDC_AGE_L18, IDC_AGE_M38);GetDlgItemText(nID, strCtrl);/ 获取指定控件的标题文本获取指定控件的标题文本str = str + strCtrl; / 获取第二个问题的用户选择获取第二个问题的用户选择str = str + n你使用的接入方式:你使用的接入方式:;nID = GetCheckedRadioButton( IDC_CM_FTTL, IDC_CM_OTHER);GetDlgItemText(nID, strCtrl);/ 获取指

57、定控件的标题文本获取指定控件的标题文本str = str + strCtrl; / 获取第三个问题的用户选择获取第三个问题的用户选择str = str + n你上网主要是:你上网主要是:n;UINT nCheckIDs4=IDC_DO_POP, IDC_DO_READ, IDC_DO_GAME, IDC_DO_OTHER;CButton* pBtn;for (int i=0; iGetCheck() ) pBtn-GetWindowText( strCtrl ); str = str + strCtrl; str = str + ;MessageBox( str );CDialog:OnOK(

58、); GetDlgItemText是是CWnd类成员函数,第一个参数用来指类成员函数,第一个参数用来指定控件的标定控件的标识识,第二个参数是返回的,第二个参数是返回的窗口文本窗口文本。后面的函数。后面的函数GetWindowText的作用与的作用与GetDlgItemText相同,也是获取窗口的文本内容。不过,相同,也是获取窗口的文本内容。不过,GetWindowText使用更加广泛。使用更加广泛。4.3.2 编辑框和旋转按钮控件编辑框和旋转按钮控件1. 编辑框编辑框 编辑框是一个让用户从键盘输入和编辑文本的矩形窗口,很方编辑框是一个让用户从键盘输入和编辑文本的矩形窗口,很方便地输入各种文本、

59、数字或者口令,也可使用它来编辑和修改简单便地输入各种文本、数字或者口令,也可使用它来编辑和修改简单的文本内容。的文本内容。(1) 编辑框的属性和通知消息编辑框的属性和通知消息:如图:如图4.44所示。表所示。表4.7还列出其中各还列出其中各项的含义。向其父窗口发送一些消息,如表项的含义。向其父窗口发送一些消息,如表4.8所示。所示。表表4.7 编辑框的编辑框的Style属性属性表表4.8 编辑框的通知消息编辑框的通知消息4.3.2 编辑框和旋转按钮控件编辑框和旋转按钮控件1. 编辑框编辑框(2) 编辑框的基本操作编辑框的基本操作1) 口令设置口令设置:用户输入的每个字符都被一个特殊的字符代替显

60、:用户输入的每个字符都被一个特殊的字符代替显示。默认的口令字符是示。默认的口令字符是“*”,用成员函数,用成员函数CEdit:SetPasswordChar 来定义自己的口令字符:来定义自己的口令字符: void SetPasswordChar( TCHAR ch );/当当ch = 0时,编辑时,编辑框内显示实际字符。框内显示实际字符。2) 选择文本选择文本:作为整体进行各种编辑操作。用:作为整体进行各种编辑操作。用鼠标鼠标的方法:在的方法:在要选择的文本的一端按下鼠标左键并拖动鼠标,到另一端释要选择的文本的一端按下鼠标左键并拖动鼠标,到另一端释放鼠标键。用放鼠标键。用键盘键盘的方法:在按光标方向移动键的同时,按的方法:在按光

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论