1、-1-本章目标 掌握模态对话框和非模态对话框的创建方法 熟悉常用的标准控件 掌握对话框控件的静态创建方法 了解对话框控件的动态创建方法 掌握对话框控件成员变量的添加方法 掌握对话框数据交换与验证的使用 掌握对话框控件通知消息的处理对话框基础知识 对话框是Windows应用程序中的一个很重要的用户接口,其作用是接收用户的数据输入或显示数据给用户。对话框也是一个窗口,它不仅可以接收消息,而且还可以被移动和关闭,甚至可以在它的客户区进行绘图。对话框可以被看成是一个大容器,其上能够放置各种各样的控件,以支持用户数据输入和数据显示。-2-对话框基础知识对话框种类模态对话框非模态对话框-3-对话框基础知识
2、CDialog类 在MFC中,应用程序使用对话框时,一般需要定义一个CDialog的派生类,并与对话框模板资源相连接。CDialog类继承自CWnd类,负责对话框的创建、显示和管理工作。-4-对话框基础知识CDialog类 CDialog类主要的成员函数及功能类别类别成员函数成员函数函数说明函数说明创建Create()创建非模态对话框,若要显示,必须调用CWnd:ShowWindow()DoModal()显示模态对话框关闭EndDialog()关闭模态对话框(隐藏而不销毁)。如要关闭非模态对话框,需要调用CWnd:DestroyWindow()操作NextDlgCtrl()将焦点移至对话框中的
3、下一个控件PrevDlgCtrl()将焦点移至对话框中的上一个控件SetDefID()设置对话框默认按钮控件GetDefID()获取对话框默认按钮控件的IDGotoDlgCtrl()将焦点移至对话框中指定的控件虚函数OnInitDialog()初始化对话框函数,对话框显示时,被框架自动调用OnOk()可以派生类中覆盖此函数实现模态对话框中的“OK”按钮动作,默认是关闭对话框。OnCancel()可以在派生类中覆盖此函数实现模态对话框中的“Cancel”按钮或“ESC”键动作,默认是关闭对话框。-5-对话框创建和显示创建对话框模板资源添加对话框资源修改对话框属性-6-对话框创建和显示创建对话框模
4、板资源工具箱在对话框中添加控件-7-对话框创建和显示创建对话框模板资源添加对话框类-8-对话框创建和显示模态对话框 模态对话框的创建和关闭需要经过以下步骤:使用对话框类实例化对象;调用DoMoal()成员函数创建和显示模态对话框;点击“确定”或“取消”按钮,或者在对话框类内部调用EndDialog()、OnOk()、OnCncel()函数关闭对话框。-9-对话框创建和显示非模态对话框 非模态对话框的创建和关闭需要经过以下步骤:使用new运算符在堆上动态构造对话框对象;调用Create()成员函数创建对话框;调用ShowWindow()成员函数显示对话框;调用DestroyWindow()成员函
5、数销毁对话框;使用delete运算符释放堆内存。-10-对话框创建和显示基于对话框的应用程序-11-标准控件与对话框标准控件简介MFC类类控件控件描述描述CButton按钮用来产生某种行为,包括复选框、单选按钮等CEdit编辑框用于键入文本CListBox列表框包括一系列字符串的列表CComboBox组合框编辑框和列表框的组合CListCtrl列表视图显示文本及其图标类表的窗口CProgressCtrl进度条用于在一较长操作中提示用户所完成的进度CScrollBar滚动条为窗体提供控件形式的滚动操作CSliderCtrl滑块包括一个可选标记的滑块的窗口CSpinButtonCtrl旋转按钮提供
6、一对可用于增减某个值的箭头CStatic静态文本常用于为其他控件提供标签CTabCtrl选项卡在选项卡对话框或属性页中提供具有分隔标签外观的选项卡CTreeCtrl树形视图按树形显示一系列数据的窗口CMonthCalCtrl日历控件提供一个类似月历的控件接口,通过此接口可输入或选择一个日期CIPAddressCttrlIP地址控件与编辑控件相似,运行用户输入并管理IP格式的数字化地址-12-标准控件与对话框对话框控件的创建 给对话框创建控件有两种方法:p 静态创建,在VS2010内使用对话框编辑器的控件“工具箱”,将控件直接拖到对话框上,而后就可以设置控件的属性(如前述例子)。这是最常用的方法
7、。p 动态创建,即使用控件类创建控件对象,然后调用控件类的成员函数Create()完成控件的创建。而控件的属性和显示位置则只能通过调用控件类的成员函数来实现。-13-标准控件与对话框对话框控件成员变量 在对话框上布置好控件后,要使对话框能与程序通讯,需要给对话框类添加数据成员,以保存各控件的初始值,并可以从控件读取数据。与控件对应的数据成员有两种类型:p 变量型成员(Value),控件成员变量的类型可以是任何数据类型,用于控件初始化或保存控件值。p 控件型成员(Control),控件成员变量的类型是相应控件类,以调用控件类的成员函数来操作控件。-14-标准控件与对话框访问对话框控件 访问控件有
8、多种方式:p 使用函数GetDlgItem(.)。p 使用GetDlgItemText()/SetDlgItemText()。p 将控件和值变量相关联。p 将控件和控件变量相关联。p 使用SendMessage()函数。p 使用SendDlgItemMessage()函数。-15-void CRegDlg:OnBnClickedOk()/*1、访问对话框控件*/char chPhone30;memset(chPhone,0,sizeof(chPhone);GetDlgItem(IDC_ED_PHONE)-GetWindowTextW(LPTSTR)chPhone,20);GetDlgItem(
9、IDC_ED_PHONE2)-SetWindowTextW(LPTSTR)chPhone);void CRegDlg:OnBnClickedOk()/OnOK();char chPhone30;memset(chPhone,0,sizeof(chPhone);/*2、访问对话框控件*/GetDlgItemText(IDC_ED_PHONE,(LPTSTR)chPhone,20);SetDlgItemText(IDC_ED_PHONE2,(LPTSTR)chPhone);-16-char chPhone30;memset(chPhone,0,sizeof(chPhone);edPhone.Get
10、WindowTextW(LPTSTR)chPhone,20);edPhone2.SetWindowTextW(LPTSTR)chPhone);class CRegDlg:public CDialogchar phone30;/此处是向导添加的变量;GetDlgItemText(IDC_ED_PHONE,(LPTSTR)phone,20);SetDlgItemText(IDC_ED_PHONE2,(LPTSTR)phone);-17-char chPhone30;memset(chPhone,0,sizeof(chPhone);edPhone.SendMessage(WM_GETTEXT,20,
11、(LPARAM)chPhone);edPhone2.SendMessage(WM_SETTEXT,0,(LPARAM)chPhone);char chPhone30;memset(chPhone,0,sizeof(chPhone);:SendDlgItemMessage(this-m_hWnd,IDC_ED_PHONE,WM_GETTEXT,20,(LPARAM)chPhone);:SendDlgItemMessage(this-m_hWnd,IDC_ED_PHONE2,WM_SETTEXT,0,(LPARAM)chPhone);-18-标准控件与对话框对话框数据交换与验证 数据交换:p 在对
12、话框类中,MFC自动添加了DoDataExchange()函数,在其中实现对话框控件数据的交换和验证机制。void CRegDlg:DoDataExchange(CDataExchange*pDX)CDialog:DoDataExchange(pDX);DDX_Text(pDX,IDC_ED_USERNAME,m_edUserName);DDX_Text(pDX,IDC_ED_PHONE,m_edPhone);DDX_Text(pDX,IDC_ED_EMAIL,m_edEmail);-19-标准控件与对话框对话框数据交换与验证 数据验证:p 可以设定控件的输入值在某个范围,程序运行时若用户为控
13、件输入的值不在设定的范围就自动给予警告或禁止输入。void CRegDlg:DoDataExchange(CDataExchange*pDX)CDialog:DoDataExchange(pDX);.DDV_MaxChars(pDX,m_edUserName,8);-20-标准控件与对话框对话框控件通知消息 常用控件通知消息:控件控件通知消息通知消息描述描述CButtonBN_CLICKED用户单击了按钮CEditEN_CHANGE用户改变了文本CListBoxLBN_DBLCLK用户在控件内双击了鼠标左键CComboBoxCBN_EDITCHANGE用户更改了编辑控件中的文本CBN_SELC
14、HANGE控件中的选定内容已更改-21-小结对话框是Windows应用程序中非常重要的用户界面元素,对话框通过其上的各种控件和用户进行交互使用对话框时需要定义一个CDialog派生类,并与资源相连接Windows有两种对话框:模态对话框和非模态对话框模态对话框工作时,会导致其父窗口类无效,直到对话框结束非模态对话框在打开期间,允许用户切换到程序其他部分,不一定要关闭对话框模态对话框经常用于程序设置等场合,非模态对话框用于“查找”或“替换”等场合MFC提供了基于对话框(Dialog based)的应用程序框架,对话框就是程序框架,负责数据输入和输出以及消息处理控件有两种创建方法:在资源内静态创建、用代码动态创建与控件对应的对话框数据成员可以方便的实现对话框与程序通讯与控件对应的对话框数据成员有两种类型:变量型成员和控件型成员对话框类的DoDataExchange()函数实现对话框数据的交换和验证机制当程序需要交换数据时,通过调用CWnd:UpdateData()函数来调用DoDataExchange()函数控件将事件消息发往父窗体(对话框),在对话框类内可以处理它们谢 谢 Thanks for listening.