第4章对话框和常用控件4.1对话框的使用4.2控件的创建和使用方法4.3常用控件4.4通用对话框和消息对话框4.2控件的创建和使用方法控件是在系统内部定义的能够完成特定功能的控制程序单元。4.2.1控件的创建方法控件的创建方式有以下两种:一种是在对话框模板中用编辑器指定控件;优点:当应用程序启动该对话框时,Windows系统就会为对话框创建控件;而当对话框消失时,控件也随之清除。另一种方式是将控件看作是任一窗口的子窗口,并通过调用相应的Create函数来创建。[例Ex_DlgCtrls]使用控件的编程方式来创建一个按钮(1)选择“文件”→“新建”菜单,在项目类型列表中选择MFCAppWizard(exe)类型,在工程框中输入项目名Ex_DlgCtrls,结果如图4.23所示。图4.23MFCAppWizard的“新建”对话框(2)单击[确定]按钮,在出现的“Step1”对话框中选择“基于对话框”应用程序类型,创建一个默认的基于对话框的应用程序项目。(3)将项目工作区切换到ClassView页面,展开Ex_DlgCtrlsDlg类,右击CEx_DlgCtrlsDlg类名,弹出如图4.24所示的快捷菜单。图4.24弹出的快捷菜单(4)从快捷菜单中选择AddMemberVariable(添加成员变量),在出现的对话框中定义一个CButton类对象m_btnWnd,通常以“m_”来作为变量的开头,表示“成员”(member)的意思。如图4.25所示,单击[OK]按钮。图4.25添加成员变量(5)在项目工作区窗口的ClassView页面中,双击OnInitDialog函数名,在该函数中添加下列代码:BOOLCEx_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);//设置控件字体returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}Create用来创建一个按钮控件,该函数第一个参数用来指定该按钮的标题;第二个参数用来指定控件的风格;第三个参数用来指定它在父窗口中的位置和大小;第四个参数用来指定父窗口指针;最后一个参数是指定该控件的标识值。(6)编译并运行,结果如图4.26所示。图4.26控件创建的结果4.2.2控件的消息及消息映射当控件的状态发生改变时,控件就会向其父窗口发送消息,这个消息称为“通知消息”。对于每个消息,系统都会用一个MSG结构来记录。对于一般控件来说,其通知消息通常是一条WM_COMMAND消息。而对于有些控件,其通知消息通常是一条WM_NOTIFY消息。1.映射控件消息下面的步骤是用来映射按钮命令消息:(1)打开Ex_DlgCtrls应用程序项目。(2)将项目工作区窗口切换到ResourseView页面,双击Dialog资源下的标识IDD_EX_DLGCTRLS_DIALOG,打开该对话框资源模板。(3)删除“TODO:在这里设置对话控制。”控件,添加一个按钮控件,保留其默认属性。如图4.27所示。图4.27添加一个按钮(4)打开MFCClassWizard对话框,“Classname”列表中选择CEx_DlgCtrlsDlg,在IDs列表中选择IDC_BUTTON1,这是添加按钮后,系统自动为此按钮设置的默认标识符,然后在Messages框中选择BN_CLICKED消息。(5)单击[AddFunction]按钮,出现“AddMemberFunction”对话框,在这里可以输入成员函数的名称,系统默认的函数名为OnButton1。图4.28添加按钮消息映射函数(6)单击[OK]按钮,在MFCClassWizard的“Memberfunctions”列表中将列出新增加的成员函数。选择此函数,单击[EditCode]按钮,定位到该函数的实现代码处。在此成员函数中添加代码:voidCEx_DlgCtrlsDlg::OnButton1(){MessageBox(你按下了\Button1\按钮!);}(7)编译并运行,当单击[Button1]按钮时,就会执行OnButton1函数,弹出一个消息对话框。2.映射控件通用消息也可通过WM_COMMAND消息的映射来处理一个或多个控件的通用消息,如下面的步骤:(1)打开MFCClassWizard对话框,在“Classname”列表中选择CEx_DlgCtrlsDlg;在IDs列表中选择CEx_DlgCtrlsDlg,在Messages框中找到并双击OnCommand,这样OnCommand消息函数就添加好了,如图4.29所示。图4.29添加OnCommand函数重载(2)在OnCommand函数中添加下列代码:BOOLCEx_DlgCtrlsDlg::OnCommand(WPARAMwParam,LPARAMlParam){WORDnCode=HIWORD(wParam);//控件的通知消息WORDnID=LOWORD(wParam);//控件的ID值if((nID==201)&&(nCode==BN_CLICKED))MessageBox(你按下了\你好\按钮!);if((nID==IDC_BUTTON1)&&(nCode==BN_CLICKED))MessageBox(这是在OnCommand处理的结果!);returnCDialog::OnCommand(wParam,lParam);}注意:第一条if语句中,201是前面用Create创建按钮时指定的标识值。(3)编译并运行。当单击如前图4.27所示的[Button1]按钮时,就会弹出一个消息对话框。说明:”Button1”按钮的BN_CLICKED消息处理同时存在两种函数,即OnButtol1和OnCommand,因此若单击”Button1”按钮,系统先执行OnCommand函数代码,然后执行OnButton1函数代码。4.2.3控件的数据交换(DDX)和数据校验(DDV)使用MFCClassWizard可以很容易地为一个控件定义关联变量并可设置其数据范围。例如,下面的步骤是为CEx_DlgCtrlsDlg类的按钮控件IDC_BUTTON1添加并使用其关联变量m_RelBtn。(1)打开MFCClassWizard,并切换到MemberVariables页面,如图4.30所示。图4.30“MemberVariables”页面(2)选定Classname为CEx_DlgCtrlsDlg,然后在ControlIDs列表中,选定所要关联的控件ID标识符IDC_BUTTON1,单击[AddVariable]按钮,弹出AddMemberVariable对话框,在对话框设置变量的名称、类别和数据类型,如图4.31所示。图4.31“AddMemberVariable”对话框说明:①对于大多数控件而言,类别Category框内可选择Value或Control两种类型。Control所对应的变量类型就是以MFC为该控件封装的控件类,Value所对应的是数值类型。②不同的控件所提供的关联的数值类型各不相同。例如,对于编辑框来说,Variablestype中的数值类型可以有CString(字符串类)、int、UINT、long、DWORD、float、double、BYTE、short、BOOL等。(3)在Membervariablename框中填好与控件相关联的成员变量m_RelBtn,单击[OK]按钮,又回到MFCClassWizard对话框的MemberVariables页面中,在ControlIDs列表中出现刚才添加的控件关联变量(或直接称之为“控件变量”)。说明:①在DDV/DDX技术中,允许用户为同一个控件关联多个变量,但必须保证这些变量名是互不相同的,且这些变量在同一个类型中不能有多个变量,即在Value和Control类型中各自只能有一个关联变量。②如果添加的关联变量是一个数值类型,则在“MFCClassWizard“对话框的”MembersVariables“页面下方还要求用户输入变量的范围,这就是控件的数据校验设置。例如,在“CEx_DlgCtrlsDlg”对话框中任意添加一个编辑框控件,并取默认的ID标识符IDC_EDIT1,为其关联一个CString类型的成员变量m_strEdit后,其结果如图4.32所示,它要求在下方MaximumCharacters框中设定该变量允许的最大字符个数。图4.32添加编辑框的数据成员后的结果(4)单击[确定]按钮。(5)当为一个控件定义一个关联的数据变量后,就可以使用CWnd::UpdateData函数实现控件数据的输入和读取。例如,将CEx_DlgCtrlsDlg::OnButton1修改成下列代码:voidCEx_DlgCtrlsDlg::OnButton1(){UpdateData();//默认参数值是TRUEm_RelBtn.SetWindowText(m_strEdit);}当调用UpdateData(FALSE)时,数据由控件相关联的成员变量向控件传输,当调用UpdateData(TRUE)或不带参数的UpdateData时,数据从控件向相关联的成员变量复制。(6)运行该程序,当在编辑框中输入“Hello”后,单击[Button1]按钮,OnButton1函数中的UpdateData()将编辑框内容保存到m_strEdit变量中,从而执行下一条语句m_RelBtn.SetWindowText(m_strEdit);后按钮的名称就变成了编辑框控件中的内容“Hello”,其结果如图4.33所示图4.33使用控件的数据成员变量4.3常用控件根据控件的特性和功能,一般可将其分为3类:Windows公共控件、ActiveX控件以及MFC新增的一些控件等。表4.5常用控件类4.3.1静态控件和按钮1.静态控件静态控件是用来显示一个字符串、框、矩形、图标、位图或增强的图元文件。在对话框编辑器的控件工具栏中,属于静态控件的有:静态文本()、组框()和静态图片()三种。图4.34静态图片控件的General属性对话框表4.6静态图片控件的General和Style属性2.按钮按钮是用来实现一种开与关的输入.常见的按钮有3种类型:按键按钮、单选按钮、复选框按钮。图4.37按钮的不同类型(1)按键按钮。按键按钮通常可以立即产生某个动作,执行某个命令,因此也常被称为命令按钮。按键按钮有两种风格:标准按键按钮和默认按键按钮。(2)单选按钮单选按钮的外形是在文本前有一个圆圈,当它被选中时,单选按钮中就标上一个黑点,它可分为一般和自动两种类型。3.按钮的消息在按钮映射的消息中,常见的只有两个:BN_CLICKED(单击按钮)和BN_DOUBLE-CLICKED(双击按钮)。(3)复选框复选框的外形是在文本前有一个空心方框,当它被选中时,复选框中就加上一个“”标记,通常复选框只有选中和未选中两种状态.若复选框前面有一个灰色是“”,则这样的复选框是三态复选框,它表示复选框的选择状态是“不确定”。在复选框属性对话框的Style页面中选中“(状态)Tri-state”项。4.按钮选中操作最常用的按钮操作是设置或获取一个按钮或多个按钮的选中状态。CButton类的成员函数SetCheck和GetCheck分别用来设置或获取指定按钮的选中状态,其原型如下:voidSetCheck(intnCheck);intGetCheck()const;其中,nCheck和GetCheck函数返回的值可以是:0表示不选中,1表示选中,2表示不确定(仅用于三态按钮)。而对于同组多个单选按钮的选中状