2020年1月10日3时29分1C++面向对象程序设计普通高等教育“十一五”国家级规划教材中国高等院校计算机基础教育课程体系规划教材谭浩强编著湖南工业大学计算机与通信学院2020年1月10日3时29分2第16讲VC++6.0基本控件的使用16.1授课内容VC++6.0基本控件的使用。主要内容:1.基于对话框结构的程序设计;2.在基于对话框结构的界面上添加菜单;3.创建模态对话框和非模态对话框;4.常用控件的使用。2020年1月10日3时29分3第16讲VC++6.0基本控件的使用16.2授课要求1.掌握基于对话框结构的程序设计;2.掌握在基于对话框结构的界面上添加菜单;3.掌握创建模态对话框和非模态对话框;4.熟悉常用控件的使用。2020年1月10日3时29分4第16讲VC++6.0基本控件的使用16.3授课重点1.重点是常用控件的使用。16.4授课难点1.难点是熟练掌握常用控件的使用方法。2020年1月10日3时29分51.基于对话框的应用程序设计基于对话框的应用程序结构适合于比较简单的应用程序。(1)生成基于对话框的应用程序第1步:对话框中,选择生成DialogBased(基于对话框)的应用程序即可。第2步:用于设置应用程序的属性,包括是否使用版权对话框、是否需要生成上下文有关的帮助、是否使用3D风格的控件,以及是否需要对ActiveX控件的支持等问题。第3步:用于设置程序风格。第4步:用于检查和修改拟为应用程序生成的类的有关参数。即生成基于对话框的应用程序。2020年1月10日3时29分6利用向导生成的基于对话框的应用程序界面:2020年1月10日3时29分7(2)设置对话框界面的属性编辑主对话框,按右键选择属性,则可设置对话框的属性。常用的属性有:基本属性(General):字体、菜单、对话框所处位置等;风格(Styles):系统菜单、最大化、最小化、滚动条等;更多风格(MoreStyles)、扩展风格、更多扩展风格。2020年1月10日3时29分8设置界面风格后的效果图2020年1月10日3时29分9(3)对话框的初始化对话框的初始化工作一般在构造函数和CDialog::OnInitDialog()函数中完成。在对话框创建时,会收到WM_INITDIALOG消息,对话框对该消息的处理函数是OnInitDialog()。如果必要,用ClassWizard重载此函数。2020年1月10日3时29分10(4)对话框数据交换和数据检验机制控件与用户的数据交流和检验机制通过CDialog::DoDataExchange()函数来完成,其原型为:virtualvoidDoDataExchange(CDataExchange*pDX);成员变量的值与控件显示的值之间的传递方向由下面两个函数决定:UpdateData(TRUE);//从对话框到变量UpdateData(FALSE);//从变量到对话框2020年1月10日3时29分112.在基于对话框结构的界面上添加菜单(1)新建菜单资源在资源工作区中添加一新的菜单,然后编辑此菜单。(2)添加到对话框上编辑对话框资源,选择对话框属性,在弹出的属性对话框中,在菜单选项中选中需要添加的菜单ID,即可。2020年1月10日3时29分12添加菜单后的界面图2020年1月10日3时29分134.模态对话框和非模态对话框(1)含义对话框按其动作模式分为“有模式”和“无模式”两大类。有模式对话框在被关闭之前,用户无法再进行其它工作;无模式对话框被关闭之前,用户可以在应用程序的其它窗口中进行工作。当有模式对话框被打开之后,它就接管了父窗口的输入控制权,只有当用户关闭了该对话框之后,控制权才交给父窗口。而无模式对话框则与父窗口共享控制权,用户可以在主窗口和对话框之间来回切换。2020年1月10日3时29分14(2)使用有模式对话框方法如下:(a)编辑对话框资源。在Insert菜单中选择Resource菜单项或直接按下Ctrl+R加速键,打开InsertResource对话框,如图1所示。图12020年1月10日3时29分15在对话框中选取Dialog图标,然后单击New按钮,这时将建立一个新的对话框,并打开对话框编辑器,如图2所示。图22020年1月10日3时29分16(b)为对话框建立一个新类,然后创建对话框类的对象,才能使用这个资源。(c)打开模态对话框。在某类中,要使用模态对话框,则:通过类向导建立加入头文件:该模态对话框类的头文件。定义模态对话框类对象:类名对象名;显示该模态对话框:对象.DoModal();看演示2020年1月10日3时29分17(3)使用非模态对话框使用非模态对话框的方法如下:(a)首先建立非模态对话框资源和对话框类,与前(a)和(b)两步一样。(b)在要用到的类中定义一个成员变量,即一个指向非模态对话框的指针。比如:DialModalLess*m_pModelless;//定义时,需要包含头文件。2020年1月10日3时29分18(3)使用非模态对话框(c)用下列语句打开非模态对话框://判断指针是否为NULL,如果为NULL,说明对话框没有创建,则动态创建对话框if(m_pModelless==NULL){m_pModelless=newDialModalLess();m_pModelless-Create(IDD_DIALOGModalLess,this);}m_pModelless-ShowWindow(SW_SHOW);//显示对话框看演示2020年1月10日3时29分19(3)使用非模态对话框注意:(a)非模态对话框的模板资源必须具有Visible风格;(b)非模态对话框对象是用new操作符动态创建的;(c)通过调用CDialog::Create()函数来启动非模态对话框;(d)必须重载并重新编写对话框的OnOK()和OnCancel()函数;(e)必须在对话框关闭后,用delete操作符删除之;(f)必须有一个标志表明非模态对话框是否打开。2020年1月10日3时29分204.公用对话框(1)CColorDialog(颜色选择对话框类)(2)CFontDialog(字体选择对话框类)(3)CPrintDialog(打印和打印设置对话框类)(4)CFindReplaceDialog(文本查找和替换对话框类)(5)CFileDialog(文件选择对话框类)这两个可以直接这样打开使用:CFontDialogf;f.DoModal();2020年1月10日3时29分214.公用对话框CFileDialog示例:CStringm_fileName;CFileDialogFileDlg(true,“*.bmp”,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,“bmp文件(*.bmp)|*.bmp;);*.bmp|所有文件(*.*)|*.*||);if(FileDlg.DoModal()==IDOK){m_fileName=FileDlg.GetFileName();//UpdateData(false);}2020年1月10日3时29分225.在对话框中加入控件(1)控件控件:一个现成的程序组件,可以独立运行以完成一定的功能。控件(Control)是Windows提供的独立小部件,控件都是CWnd类派生出来的后代类对象,实际上也是一个窗口,对应一个CWnd派生类的对象。每个控件均有一个标识符(ID)。2020年1月10日3时29分23(2)对话框与控件对话框与控件是密不可分的。Windows提供了一批基本控件,如静态控件(StaticText)、编辑控件(EditBox)、组框、列表框等,可解决大部分用户输入界面设计的需求。2020年1月10日3时29分24(3)向对话框加入控件在对话框资源编辑窗口旁边有一个控件工具箱,如图3所示,使用其中的工具可以向对话框增加控件。图3Controls工具箱2020年1月10日3时29分25(4)对齐控件为使对话框布局美观,需要精确地对齐控件。首先选中需要对齐的控件(用鼠标左键拖放一个矩形,使其包含所需控件;或按住Ctrl键,然后用鼠标左键逐个选取控件),再使用“控件对齐栏”的各个按钮来对齐控件,如图4所示。看演示2020年1月10日3时29分262020年1月10日3时29分27(5)为对话框类加入成员变量对话框的主要功能是输出和输入数据,这个任务是通过控件完成的。为此,要为这些控件定义一个对应的成员变量。与控件对应的成员变量既可以是一个数据,也可以是一个控件对象。利用ClassWizard可以很方便地为对话框类添加数据成员,在弹出的对话框中选择“membervariables”,即可增加对应的成员变量。2020年1月10日3时29分28看演示2020年1月10日3时29分296.常用控件的使用(1)常用的控件有:A.静态文本(StaticText)控件;B.编辑(EditBox)控件;C.按钮(Button)控件;D.检查框(CheckBox)控件;E.单选按钮(RadioButton)控件;F.列表框(ListControl)控件;G.组框(GroupBox)控件;H.图片(Picture)控件;J.组合框(ComboBox)是编辑控件和列表框的组合。2020年1月10日3时29分30(2)控件的使用A.静态文本(StaticText)控件和组框(GroupBox)控件这两个控件直接添加上去,然后设置适当的属性值就可,一般不需另外编程。静态文本一般用于文字提示。组框用于把一些相同(或相似)功能的控件布局在一起。2020年1月10日3时29分31(2)控件的使用文本框组框2020年1月10日3时29分32(2)控件的使用选定一组控件的方法:(a)先通过菜单Layout/TabOrder设置好对话框中控件的跳格顺序。(b)设置控件属性,每组的第一个控件选中Group属性,同组的其他控件就不要选中Group属性。(c)另一组开始,再重复(b)步。注意:将控件组成一组并不靠组框(GroupBox)控件起作用,而是靠属性框中的General标签中的Group属性和控件的跳格顺序(TabOrder)决定的。2020年1月10日3时29分332020年1月10日3时29分34B.编辑(EditBox)控件编辑控件的作用是接受用户输入的字符串信息。它的ID很重要,因为要实现数据交换。使用方法:(a)添加编辑框控件,并设置属性。(b)为编辑框控件加入成员变量。利用类向导即可添加。(c)成员变量的值与控件显示的值之间的传递。传递方法:UpdateData(TRUE);//从对话框到变量UpdateData(FALSE);//从变量到对话框注意:变量的类型。2020年1月10日3时29分35比如:下图中编辑框对应的变量名为:m_Num1、m_Num2、m_Result。计算两个数的和并显示出来。voidCKJ17_1Dlg::OnEqual(){UpdateData(TRUE);m_Result=m_Num1+m_Num2;UpdateData(FALSE);}代码2020年1月10日3时29分36C.按钮(Button)控件命令按钮,用于执行一个自编函数或功能。使用方法:(a)添加按钮,并设置属性。(b)添加消息响应函数。通过类向导添加BN_CLICKED消息响应函数。(c)编辑消息响应函数。比如:前面的计算两个数的和的“=”命令函数。2020年1月10日3时29分37D.检查框(CheckBox)控件它是复选框控件,可以从中选择多个。检查框使用方法:(a)添加控件,设置属性。一般把几个一组的检查框用组框框在一起,并设置为一组。(b)为每一个控件添加一个BOOL类型的变量。当一个控件被选中时,所对应的变量值为真(TRUE),否则为假(FALSE)。图72020年1月10日3时29分38D.检查框(CheckBox)控件比如:对图7所示的检查框定义三个BOOL变量m_Chk1、m_Chk2、m