📄 07 对话框(1).txt
字号:
第7章对话框( )
图 7.2程序的"关于"对话框
如果想在程序中创建自己的对话框,可以通过插入一个对话框资源来完成。具体方法是:在VC++开发环境窗口中选择【Insert】菜单下的【Resource..】菜单命令,此时会弹出如图7.3所示的对话框,在此对话框中选择Dialog资源类型,然后单击【New】按钮,即可为程序新建一个新的对话框资源。 VC++自动将其标识设置为IDD DIALOGl,井添加到 ResourceView选项卡中的 Dialog项下,同时在资源编辑窗口中打开了这个新对话框资源,如图 7.4所示。从该图中,可以看到在 Dialog项下还有一个对话框资源标识: IDD_ABOUTBOX,这就是 t面所说的那个"关于"对话框的对话框资源。
图 7.3 Insert Resource对话框
图 7.4新建的对话框资源
也可以通过单击资源工具栏上的 [New ]按钮来新建一个对
话框资源。
可以看到,这个新建的IDD_DIALOGl对话框中有两个按钮: OK和Cancel,并通过它们的属性对话框可以发现它们的ID分别为IDOK和IDCANCEL
VC++已经为这两个按钮提供了默认的消息响应函数 OnOK和 OnCancel,它们实现的主要功能都是一样的,就是关闭对话框,因此,当程序运行时,单击这两个按钮中的任何一个都可以关闭对话框。但是,单击这两个按钮关闭对话框后,返回的结果值是不一样的,在程序中,通常根据该返回值来判断用户单击的是哪个按钮,从而确定用户的行为:是确定还是取消当前操作。
我们选中IDD DIALOGl这个对话框资源本身,打开其属性对话框,将其Caption属性设置为"测试",以下统称这个对话框为测试对话框。
在MFC中,对资源的操作通常都是通过一个与资源相关的类来完成的。对话框资源也有一个相应的基类: CDialog。根据MSDN提供的帮助信息,可以知道CDia10g类派生于CWnd类,所以它是一个与窗口相关的类,主要用来在屏幕上显示一个对话框。由此可知,实际上,对话框本身也是一个窗口界面。
既然在 MFC中,对资源的操作是通过一个类来完成的,那么就需要创建一个类与这个新建的对话框资源相关联。为此,在 VC++开发环境中,选择【View】菜单下的 <ClassWizard】菜单命令,这时会弹出如图7.5所示的对话框,提示用户: IDD_DIALOGl 资源是一个新资源,并且因为它是一个对话框资源,所以需要为它创建一个相关联的类,或者可以选择程序中己有的一个类与之相关联。单击【OK】按钮,将出现如图7.6所示的对话框,利用这个对话框就可以为新建的对话框资源创建一个关联的类。
目标:在新建的对话框资源上时鼠标烛,也可弹的图 7.5所示的对
话框。
图 7.5 Adding a Class对话框图 7.6 New Class对话框
从图7.6可以看到, Dialog ID项的内容己经被自动填充,就是刚才新建的那个对话框资源标识: IDD_DIALOG1.井且在Base class项中也指定了这个新类的基类:CDialog。我们需要做的是,在Name编辑框中为这个新类命名,例如CTestDIg。读者会发现,在输入类名的同时, File name只读框中会显示这个类所在的文件名(如图7.7所示),该文件名的命名是类名去掉第一个 'C'字母。通常情况下,直接接受这个文件名即可,但有些情况下必须要修改这个文件名,例如,如果新建的这个类的文件名与程序,中己有文件同名,
或者新建的这个类名很长,想以缩写的形式来命名文件名,使其变短些等。如果想要修改这个默认的文件名,可以单击【 Change...]按钮,这时就会出现如图 7.8所示的对话框,利用这个对话框,可以改变这个新类的头文件名和源文件名。本例直接接受自动产生的类文件名,不对其进行修改,所以直接单击图 7.7所示对话框中的【 OK】按钮即可,并单击随后出现的 MFC ClassWizard对话框上的【OK】按钮,关闭该对话框,从而就完成了 CTestD lg这个新类的创建。
图 7.7为新类命名后的 New Class对话框图 7.8 Change Files对话框
这时,在 Mybole程序的 ClassView选项卡中,就可以看到这个新类。可以看到,这个 CTestDlg新类有两个成员函数,其中一个就是它的构造函数,其定义代码如例 7 -1所示。
例 7-1
CTestDlg::CTestDlg(CWnd* pParent / *=NULL*/ )
:CDialog(CTestDlg : : IDD, pParent)
//{{AFX_DATA_1N1T(CTestDlg) // NOTE : the ClassWizard will add member initializat工 on here //}}AFX_ DATA_ 1N1T
从例 7-1所示的代码中可以看到, CTestDlg类的构造函数首先调用其基类 :CDialog的构造函数,并传递两个参数 =一个是 CTestDlg类的 IDD成员,一个是父窗口指针。打开 CTestDl g类的头文件,就可以发现这个 IDD就是这个对话框资源的 ID,代码如例 7-2所示。
例 7-2
// Dialog Data
//{{AFX_ DATA(CTestDlg)
enum {IDD = IDD_DIALOG1 };
// NOTE: the ClassWizard will add data members here //}}AFX_DATA
CTestDlg类的另一个函数是: DoDataExchange,主要用来完成对话框数据的交换和校验,其定义如例 7-3所示。
例7-3
void CTestDlg :: DoDataExchange (CDataExchange* pDX)
CDialog : : DoDataExchange (pDX) ; 11 {{AFX_DATA_MAP{CTestDlg) 11 NOTE: the ClassWizard will add DDX and DDV calls here II }}AFX_DATA_MAP
现在,我们就有了一个类 (CTestDlg)与IDD-DIALOGl这个对话框资源相关联了,就像程序中 CAboutDlg类与 IDD ABOUTBOX这个对话框资源相关联一样。接下来,我们希望在程序中显示这个对话框窗口,为此,可以为 Mybole程序增加一个菜单项,当用户单击这个菜单项时就显示这个对话框窗口。因此,首先在 Mybole程序的【帮助】子菜单后增加一个菜单项,然后打开其属性对话框,将其Caption属性设置为"对话框",去掉该菜单的Pop-up选工页,井将其E设置为IDM DIALOG,如图7.9所示。
图 7.9新增对话框菜单项的属性
接着,利用 ClassWizard为此菜单项添加COMMAND命令消息响应函数。本例中,让视类 (CMyboleView )捕获这个新增的【对话框】菜单项命令响应。然后,在此响应函数中实现对话框窗口的显示。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -