第 21 章
单“View|ClassWizard”,或者在开发环境的界面下直
接使用快捷键Ctrl+W,打开“ClassWizard”对话框。同时它会检测到添加了新的对话框资源,
并打开“Adding a Class”对话框,提示用户是否为新建的对话框添加一个对话框类。
(2)在“Adding a Class”对话框中,选中“Create a new class”单选框,意思是要为对
话框资源创建一个新的类,单击“OK”按钮确认后打开“New Class”对话框。
(3)在“New Class”对话框中,ClassWizard 要为新添加的IDD_TESTPAGE1 模板创建
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·84·
一个新的类。在“Ncom”输入框中输入CTestPage1,在“Base class”下拉列表框中选择
CPropertyPage,如图4-23 所示。单击“OK”按钮关闭“New Class”对话框,返回“ClassWizard”
对话框,就可以看见“ClassWizard”对话框中的“Class ncom”下拉列表框中已经自动选择
了新创建的类CTestPage1。
图4-23 创建属xìng页类的对话框
(4)依照4.1.3 第2 到第4 部分的讲解,为CTestPage1 添加合适的控件变量和控件消息
处理函数。
(5)为CTestPage1 添加合适的属xìng页消息处理函数。在已经打开的“ClassWizard”对话
框中,单击“Message Maps”选项卡,在“Class ncom”下拉列表框中选择CTestPage1,在
“Object IDs”列表框中选择CTestPage1,在“Messages”列表框中选择表4-1 中出现的合适
的消息处理函数,单击“Add Function”按钮,就可以添加对应的消息处理函数。
在实例Sample4_1 中,由于CTestPage1 作为向导对话框的第一个属xìng页,因此显示测试
页1 时向导对话框中只有“下一个”(Next)按钮。这就需要为CTestPage1 添加OnSetActive()
函数。在“Messages”列表框中选择OnSetActive,单击“Add Function”按钮添加该函数。
再单击“ Edit Function ” 按钮, 关闭“ ClassWizard ” 对话框, IDE 自动定位到
CTestPage1::OnSetActive()函数,修改函数代码如下:
BOOL CTestPage1::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
// 获得父窗口,即属xìng表CPropertySheet 类
CPropertySheet* psheet = (CPropertySheet*) GetParent();
// 设置属xìng表只有“下一步”按钮
psheet->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
经过上述步骤,就为属xìng页IDD_TESTPAGE1 添加了对应的属xìng页类CTestPage1。
枫叶文学网www.fywxw.com
第4 章 对话框
·85·
3.创建其余的属xìng页和对应的属xìng页类
为实例Sample4_1 创建其余的属xìng页,包括第二页IDD_TESTPAGE2 和最后一页
IDD_TESTPAGE3,对应的属xìng页类为CTestPage2 和CTestPage3。步骤如下:
(1)参照第1 部分,为实例Sample4_1 创建第二个属xìng页模板IDD_TESTPAGE2。
(2)参照第2 部分,为IDD_TESTPAGE2 创建属xìng页类CTestPage2,为CTestPage2 添加
合适的控件变量和控件消息处理函数,注意在CTestPage2 中不用添加OnSetActive()消息处理
函数。
如果用户想为向导对话框添加更多的中间步骤,可以重复步骤1 和2。
(3)参照第1 部分,为实例Sample4_1 创建最后一个属xìng页模板IDD_TESTPAGE3。
(4)参照第2 部分,为IDD_TESTPAGE3 创建属xìng页类CTestPage3,为CTestPage3 添加
合适的控件变量和控件消息处理函数。注意在CTestPage3 中需要添加OnSetActive()和
OnWizardFinish()消息处理函数。
添加CTestPage3::OnSetActive()函数,使得向导对话框进行到最后一页时只有“完成”
(Finish)按钮。在已经打开的ClassWizard 对话框中,单击“Message Maps”选项卡,在“Class
ncom”下拉列表框中选择CTestPage1,在“Object IDs”列表框中选择CTestPage3,在“Messages”
列表框中选择OnSetActive,单击“Add Function”按钮添加该函数。再单击“Edit Function”
按钮,关闭“ClassWizard”对话框,IDE 自动定位到CTestPage3::OnSetActive()函数,修改函
数代码如下:
BOOL CTestPage3::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
CPropertySheet* psheet = (CPropertySheet*) GetParent();
//设置属xìng表只有“完成”按钮
psheet->SetFinishText("完成");
return CPropertyPage::OnSetActive();
}
重复前面的过程, 在“ Messages ” 列表框中选择OnWizardFinish , 添加
CTestPage3::OnWizardFinish()函数,使得完成向导对话框时提示用户,添加的函数代码如下:
BOOL CTestPage3::OnWizardFinish()
{
// TODO: Add your specialized code here and/or call the base class
MessageBox("您已经完成向导!");
return CPropertyPage::OnWizardFinish();
}
这样就完成了向导对话框的所有属xìng页模板和相应属xìng页类的创建。
4.创建属xìng表类
创建完向导对话框的所有属xìng页类后,就可以为实例Sample4_1添加属xìng表CPropertySheet
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·86·
类的派生类,用于cāo作向导对话框。其步骤如下:
(1)在IDE 的主菜单中选择“View| ClassWizard”菜单命令,或按快捷键Ctrl+W 打开
ClassWizard 对话框。
(2)在“ClassWizard”对话框中,单击“Add Class”按钮,在弹出的下拉菜单中选择“New”
菜单项,打开“New Class”对话框。
(3)在“NewClass”对话框中创建名为CTestSheet 的属xìng表派生类。在“Class type”下
拉列表框中选择MFC Class,在“Ncom”输入框中输入CTestSheet,在“Base class”下拉列
表框中选择CPropertySheet,如图4-24 所示。单击“OK”按钮退出“New Class”对话框,
返回“ClassWizard”对话框,可以看到“Class ncom”下拉列表框中已经选择了新创建的
“CTestSheet”类。
图4-24 添加CProperySheet 类的派生类
(4)为CTestSheet 类添加每个属xìng页类的成员变量。关闭“ClassWizard”对话框,在IDE
左侧工作区中单击“ClassView”选项卡,展开Sample4_1 classes 节点,在CTestSheet 上单击
鼠标右键,选择“Add Member Variable”菜单项,打开Add Member Variable 对话框。在“Variable
Type”输入框中输入CTestPage1,在“Variable Ncom”输入框中输入m_page1,单击“OK”
按钮就可以为CTestSheet 类添加第一个属xìng页类CTestPage1 的m_page1 成员变量。重复这一
过程,为CTestSheet 添加成员变量CTestPage2 类的m_page2 和CTestPage3 类的m_page3。
(5)最后在属xìng表类CTestSheet 的构造函数中将所有属xìng页添加到属xìng表中。在IDE 左
侧工作区中单击“ClassView”选项卡,展开Sample4_1 classes|CTestSheet 节点,双击
“CTestSheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0)”,即可
编辑CTestSheet 的构造函数,修改函数代码如下:
CTestSheet::CTestSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&m_page1);
AddPage(&m_page2);
AddPage(&m_page3);
}
枫叶文学网www.fywxw.com
第4 章 对话框
·87·
5.打开向导对话框
在实例Sample4_1 中添加一个菜单项打开前面创建的向导对话框,步骤如下:
(1)首先创建打开向导对话框的菜单项。
单击IDE 左侧工作区的“ResourceView”标签,展开Menu 节点,双击IDR_SAMPLETYPE,
打开“IDR_SAMPLETYPE”菜单资源编辑界面。在IDE 右侧客户区展开顶层“查看”菜单,
双击虚线框,打开添加一个新的菜单项的对话框。在“ID”输入框中输入ID_WIZARD,在
“Caption”输入框中输入“打开向导对话框”,回车确认修改。
(2)为新建的菜单项添加消息处理函数。
在IDE 主菜单栏中依次选择菜单“View|ClassWizard”,或者在开发环境的界面中直接使
用快捷键Ctrl+W,打开“ClassWizard”对话框。单击“Message Maps”选项卡,在“Class ncom”
下拉列表框中选择“CSample4_1View”,在“Object IDs”列表框中选择ID_WIZARD,在
“Messages”列表框中选择COMMAND,单击“Add Function”按钮,在弹出的对话框中单击
“OK”按钮,就创建了名为OnWizard 的菜单项消息处理函数。
( 3 ) 单击“ Edit Function ” 按钮, 关闭“ ClassWizard ” 对话框, IDE 定位到
CSample4_1View::OnWizard()函数,编辑CSample4_1View::OnModalless()函数,代码如下:
void CSample4_1View::OnWizard()
{
// TODO: Add your command handler code here
// 创建属xìng表对象
CTestSheet sheet("");
// 设置属xìng对话框为向导对话框
sheet.SetWizardMode();
// 打开模态向导对话框
sheet.DoModal();
}
至此,创建向导对话框的所有步骤已经完成,编译运行Sample4_1,选择菜单“查看|打
开向导对话框”,就可以打开创建的向导对话框,图4-25 所示为在向导对话框最后一步单击
“完成”按钮后的运行结果。
图4-25 向导对话框的最后一步
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·88·
4.4.3 一般属xìng页对话框的创建步骤
一般属xìng页对话框提供了选项卡的功能,为属xìng进行合理的分类。本节将介绍这类属xìng
对话框的创建步骤。
(1)创建属xìng页模板。
(2)为各个属xìng页添加属xìng页类。
(3)创建属xìng表类。
以上3 个步骤都与向导对话框的创建步骤相同。惟一的区别是不用添加4.4.2 节中提到
的OnSetActive()和OnWizardFinish()函数。
(4)打开属xìng页对话框。
打开一般属xìng对话框与打开向导对话框的方法类似,只需要把打开前的SetWizardMode()
函数去掉即可。例如在Sample4_1 中打开一个为CTestSheet 类的一般属xìng页对话框,首
松语文学免费小说阅读_www.16sy.com
接使用快捷键Ctrl+W,打开“ClassWizard”对话框。同时它会检测到添加了新的对话框资源,
并打开“Adding a Class”对话框,提示用户是否为新建的对话框添加一个对话框类。
(2)在“Adding a Class”对话框中,选中“Create a new class”单选框,意思是要为对
话框资源创建一个新的类,单击“OK”按钮确认后打开“New Class”对话框。
(3)在“New Class”对话框中,ClassWizard 要为新添加的IDD_TESTPAGE1 模板创建
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·84·
一个新的类。在“Ncom”输入框中输入CTestPage1,在“Base class”下拉列表框中选择
CPropertyPage,如图4-23 所示。单击“OK”按钮关闭“New Class”对话框,返回“ClassWizard”
对话框,就可以看见“ClassWizard”对话框中的“Class ncom”下拉列表框中已经自动选择
了新创建的类CTestPage1。
图4-23 创建属xìng页类的对话框
(4)依照4.1.3 第2 到第4 部分的讲解,为CTestPage1 添加合适的控件变量和控件消息
处理函数。
(5)为CTestPage1 添加合适的属xìng页消息处理函数。在已经打开的“ClassWizard”对话
框中,单击“Message Maps”选项卡,在“Class ncom”下拉列表框中选择CTestPage1,在
“Object IDs”列表框中选择CTestPage1,在“Messages”列表框中选择表4-1 中出现的合适
的消息处理函数,单击“Add Function”按钮,就可以添加对应的消息处理函数。
在实例Sample4_1 中,由于CTestPage1 作为向导对话框的第一个属xìng页,因此显示测试
页1 时向导对话框中只有“下一个”(Next)按钮。这就需要为CTestPage1 添加OnSetActive()
函数。在“Messages”列表框中选择OnSetActive,单击“Add Function”按钮添加该函数。
再单击“ Edit Function ” 按钮, 关闭“ ClassWizard ” 对话框, IDE 自动定位到
CTestPage1::OnSetActive()函数,修改函数代码如下:
BOOL CTestPage1::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
// 获得父窗口,即属xìng表CPropertySheet 类
CPropertySheet* psheet = (CPropertySheet*) GetParent();
// 设置属xìng表只有“下一步”按钮
psheet->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
经过上述步骤,就为属xìng页IDD_TESTPAGE1 添加了对应的属xìng页类CTestPage1。
枫叶文学网www.fywxw.com
第4 章 对话框
·85·
3.创建其余的属xìng页和对应的属xìng页类
为实例Sample4_1 创建其余的属xìng页,包括第二页IDD_TESTPAGE2 和最后一页
IDD_TESTPAGE3,对应的属xìng页类为CTestPage2 和CTestPage3。步骤如下:
(1)参照第1 部分,为实例Sample4_1 创建第二个属xìng页模板IDD_TESTPAGE2。
(2)参照第2 部分,为IDD_TESTPAGE2 创建属xìng页类CTestPage2,为CTestPage2 添加
合适的控件变量和控件消息处理函数,注意在CTestPage2 中不用添加OnSetActive()消息处理
函数。
如果用户想为向导对话框添加更多的中间步骤,可以重复步骤1 和2。
(3)参照第1 部分,为实例Sample4_1 创建最后一个属xìng页模板IDD_TESTPAGE3。
(4)参照第2 部分,为IDD_TESTPAGE3 创建属xìng页类CTestPage3,为CTestPage3 添加
合适的控件变量和控件消息处理函数。注意在CTestPage3 中需要添加OnSetActive()和
OnWizardFinish()消息处理函数。
添加CTestPage3::OnSetActive()函数,使得向导对话框进行到最后一页时只有“完成”
(Finish)按钮。在已经打开的ClassWizard 对话框中,单击“Message Maps”选项卡,在“Class
ncom”下拉列表框中选择CTestPage1,在“Object IDs”列表框中选择CTestPage3,在“Messages”
列表框中选择OnSetActive,单击“Add Function”按钮添加该函数。再单击“Edit Function”
按钮,关闭“ClassWizard”对话框,IDE 自动定位到CTestPage3::OnSetActive()函数,修改函
数代码如下:
BOOL CTestPage3::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
CPropertySheet* psheet = (CPropertySheet*) GetParent();
//设置属xìng表只有“完成”按钮
psheet->SetFinishText("完成");
return CPropertyPage::OnSetActive();
}
重复前面的过程, 在“ Messages ” 列表框中选择OnWizardFinish , 添加
CTestPage3::OnWizardFinish()函数,使得完成向导对话框时提示用户,添加的函数代码如下:
BOOL CTestPage3::OnWizardFinish()
{
// TODO: Add your specialized code here and/or call the base class
MessageBox("您已经完成向导!");
return CPropertyPage::OnWizardFinish();
}
这样就完成了向导对话框的所有属xìng页模板和相应属xìng页类的创建。
4.创建属xìng表类
创建完向导对话框的所有属xìng页类后,就可以为实例Sample4_1添加属xìng表CPropertySheet
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·86·
类的派生类,用于cāo作向导对话框。其步骤如下:
(1)在IDE 的主菜单中选择“View| ClassWizard”菜单命令,或按快捷键Ctrl+W 打开
ClassWizard 对话框。
(2)在“ClassWizard”对话框中,单击“Add Class”按钮,在弹出的下拉菜单中选择“New”
菜单项,打开“New Class”对话框。
(3)在“NewClass”对话框中创建名为CTestSheet 的属xìng表派生类。在“Class type”下
拉列表框中选择MFC Class,在“Ncom”输入框中输入CTestSheet,在“Base class”下拉列
表框中选择CPropertySheet,如图4-24 所示。单击“OK”按钮退出“New Class”对话框,
返回“ClassWizard”对话框,可以看到“Class ncom”下拉列表框中已经选择了新创建的
“CTestSheet”类。
图4-24 添加CProperySheet 类的派生类
(4)为CTestSheet 类添加每个属xìng页类的成员变量。关闭“ClassWizard”对话框,在IDE
左侧工作区中单击“ClassView”选项卡,展开Sample4_1 classes 节点,在CTestSheet 上单击
鼠标右键,选择“Add Member Variable”菜单项,打开Add Member Variable 对话框。在“Variable
Type”输入框中输入CTestPage1,在“Variable Ncom”输入框中输入m_page1,单击“OK”
按钮就可以为CTestSheet 类添加第一个属xìng页类CTestPage1 的m_page1 成员变量。重复这一
过程,为CTestSheet 添加成员变量CTestPage2 类的m_page2 和CTestPage3 类的m_page3。
(5)最后在属xìng表类CTestSheet 的构造函数中将所有属xìng页添加到属xìng表中。在IDE 左
侧工作区中单击“ClassView”选项卡,展开Sample4_1 classes|CTestSheet 节点,双击
“CTestSheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0)”,即可
编辑CTestSheet 的构造函数,修改函数代码如下:
CTestSheet::CTestSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&m_page1);
AddPage(&m_page2);
AddPage(&m_page3);
}
枫叶文学网www.fywxw.com
第4 章 对话框
·87·
5.打开向导对话框
在实例Sample4_1 中添加一个菜单项打开前面创建的向导对话框,步骤如下:
(1)首先创建打开向导对话框的菜单项。
单击IDE 左侧工作区的“ResourceView”标签,展开Menu 节点,双击IDR_SAMPLETYPE,
打开“IDR_SAMPLETYPE”菜单资源编辑界面。在IDE 右侧客户区展开顶层“查看”菜单,
双击虚线框,打开添加一个新的菜单项的对话框。在“ID”输入框中输入ID_WIZARD,在
“Caption”输入框中输入“打开向导对话框”,回车确认修改。
(2)为新建的菜单项添加消息处理函数。
在IDE 主菜单栏中依次选择菜单“View|ClassWizard”,或者在开发环境的界面中直接使
用快捷键Ctrl+W,打开“ClassWizard”对话框。单击“Message Maps”选项卡,在“Class ncom”
下拉列表框中选择“CSample4_1View”,在“Object IDs”列表框中选择ID_WIZARD,在
“Messages”列表框中选择COMMAND,单击“Add Function”按钮,在弹出的对话框中单击
“OK”按钮,就创建了名为OnWizard 的菜单项消息处理函数。
( 3 ) 单击“ Edit Function ” 按钮, 关闭“ ClassWizard ” 对话框, IDE 定位到
CSample4_1View::OnWizard()函数,编辑CSample4_1View::OnModalless()函数,代码如下:
void CSample4_1View::OnWizard()
{
// TODO: Add your command handler code here
// 创建属xìng表对象
CTestSheet sheet("");
// 设置属xìng对话框为向导对话框
sheet.SetWizardMode();
// 打开模态向导对话框
sheet.DoModal();
}
至此,创建向导对话框的所有步骤已经完成,编译运行Sample4_1,选择菜单“查看|打
开向导对话框”,就可以打开创建的向导对话框,图4-25 所示为在向导对话框最后一步单击
“完成”按钮后的运行结果。
图4-25 向导对话框的最后一步
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·88·
4.4.3 一般属xìng页对话框的创建步骤
一般属xìng页对话框提供了选项卡的功能,为属xìng进行合理的分类。本节将介绍这类属xìng
对话框的创建步骤。
(1)创建属xìng页模板。
(2)为各个属xìng页添加属xìng页类。
(3)创建属xìng表类。
以上3 个步骤都与向导对话框的创建步骤相同。惟一的区别是不用添加4.4.2 节中提到
的OnSetActive()和OnWizardFinish()函数。
(4)打开属xìng页对话框。
打开一般属xìng对话框与打开向导对话框的方法类似,只需要把打开前的SetWizardMode()
函数去掉即可。例如在Sample4_1 中打开一个为CTestSheet 类的一般属xìng页对话框,首
松语文学免费小说阅读_www.16sy.com