讲座四 VSMFC编程几种常见对话框.docx
- 文档编号:8439912
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:32
- 大小:220.79KB
讲座四 VSMFC编程几种常见对话框.docx
《讲座四 VSMFC编程几种常见对话框.docx》由会员分享,可在线阅读,更多相关《讲座四 VSMFC编程几种常见对话框.docx(32页珍藏版)》请在冰豆网上搜索。
讲座四VSMFC编程几种常见对话框
VS2010(MFC)编程--几种对话框
VS2010/MFC编程:
模态对话框及其弹出过程
加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益。
趁热打铁,这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎样弹出。
一.模态对话框和非模态对话框
Windows对话框分为两类:
模态对话框和非模态对话框。
模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。
非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入。
非模态对话框一般用来显示提示信息等。
大家对Windows系统很了解,相信这两种对话框应该都遇到过。
之前的加法计算器对话框其实就是模态对话框。
二.模态对话框是怎样弹出的
毕竟加法计算器程序大部分都是MFC自动生成的,对话框怎么弹出来的大家可能还不是很清楚。
下面简单说说它是在哪里弹出来的,再重新建一个新的对话框并弹出它,这样大家实践以后就能更灵活的使用模态对话框了。
大家打开Addition.cpp文件,可以看到CAdditionApp类有个InitInstance()函数,在MFC应用程序框架分析中提到过此函数,不过那是单文档应用程序App类中的,函数体不太相同,但都是进行App类实例的初始化工作。
InitInstance()函数的后半部分有一段代码就是定义对话框对象并弹出对话框的,下面给出这段代码并加以注释:
C++代码
1.CAdditionDlg dlg; // 定义对话框类CAdditionDlg的对象dlg
2.m_pMainWnd = &dlg; // 将dlg设为主窗口
3.INT_PTR nResponse = dlg.DoModal(); // 弹出对话框dlg,并将DoModal函数的返回值(退出时点击按钮的ID)赋值给nResponse
4.if (nResponse == IDOK) // 判断返回值是否为OK按钮(其ID为IDOK,已经将它删除)
5.{
6. // TODO:
Place code here to handle when the dialog is
7. // dismissed with OK
8.}
9.else if (nResponse == IDCANCEL) // 判断返回值是否为Cancel按钮(其ID为IDCANCEL,鸡啄米将它的Caption改为了“退出”)
10.{
11. // TODO:
Place code here to handle when the dialog is
12. // dismissed with Cancel
13.}
弹出对话框比较关键的一个函数,就是对话框类的DoModal()函数。
CDialog:
:
DoModal()函数的原型为:
virtualINT_PTRDoModal();
返回值:
整数值,指定了传递给CDialog:
:
EndDialog(该函数用于关闭对话框)的nResult参数值。
如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。
调用了它对话框就会弹出,返回值是退出对话框时所点的按钮的ID,比如,我们点了“退出”按钮,那么DoModal返回值为IDCANCEL。
三.添加一个新对话框并弹出它
再为加法计算器程序添加一个对话框,以在计算之前询问用户是否确定要进行计算。
大家可以完整的看下对话框的添加和弹出过程。
1.根据“创建对话框模板和修改对话框属性”中所讲的方法,在ResourceView中的“Dialog”上点右键选择“InsertDialog”,创建一个新的对话框模板,修改其ID为IDD_TIP_DIALOG,Caption改为“提示”,然后参考“为对话框添加控件”中所讲,在对话框模板上添加一个静态文本框(statictext),Caption改为“您确定要进行加法计算吗?
”,接下来修改OK按钮的Caption为“确定”,Cancel按钮的Caption为“取消”,最后调整各个控件的位置和对话框的大小。
最终的对话框模板如下图:
2.根据“创建对话框类和添加控件变量”中创建对话框类的方法,在对话框模板上点右键选择“AddClass...”,弹出添加类的对话框,设置“Classname”为CTipDlg,点“OK”。
在SolutionExplorer中可以看到生成了CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp。
3.我们要在点“计算”按钮之后弹出此提示对话框,那么就要在“计算”按钮的消息处理函数OnBnClickedAddButton()中访问提示对话框类,所以为了访问CTipDlg类,在AdditionDlg.cpp中包含CTipDlg的头文件:
#include"TipDlg.h"。
4.修改OnBnClickedAddButton()的函数体,在所有代码前,构造CTipDlg类的对象tipDlg,并通过语句tipDlg.DoModal();弹出对话框,最后判断DoModal()函数的返回值是IDOK还是IDCANCEL来确定是否继续进行计算。
OnBnClickedAddButton()函数修改后如下:
C++代码
1.void CAdditionDlg:
:
OnBnClickedAddButton()
2.{
3. // TODO:
Add your control notification handler code here
4. INT_PTR nRes; // 用于保存DoModal函数的返回值
5. CTipDlg tipDlg; // 构造对话框类CTipDlg的实例
6. nRes = tipDlg.DoModal(); // 弹出对话框
7. if (IDCANCEL == nRes) // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行
8. return;
9. // 将各控件中的数据保存到相应的变量
10. UpdateData(TRUE);
11. // 将被加数和加数的加和赋值给m_editSum
12. m_editSum = m_editSummand + m_editAddend;
13. // 根据各变量的值更新相应的控件。
和的编辑框会显示m_editSum的值
14. UpdateData(FALSE);
15.}
5.测试。
编译运行程序后,在对话框上输入被加数和加数,点“计算”,弹出提示对话框询问是否进行计算,如果选择“确定”,则提示对话框退出,并在主对话框上显示被加数和加数的和,而如果选择“取消”,则提示对话框也会退出,但主对话框显示的和不变,即没有进行加法计算。
VS2010/MFC编程:
非模态对话框的创建及显示
上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示。
非模态对话框的对话框资源和对话框类
实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,所以上一讲中创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改。
创建及显示非模态对话框的步骤
需要修改的是,对话框类实例的创建和显示,也就是之前在CAdditionDlg:
:
OnBnClickedAddButton()函数体中添加的对话框显示代码。
下面是具体步骤:
1.在AdditionDlg.h中包含CTipDlg头文件并定义CTipDlg类型的指针成员变量。
详细操作方法是,在AdditionDlg.cpp中删除之前添加的#include"TipDlg.h",而在AdditionDlg.h中添加#include"TipDlg.h",这是因为我们需要在AdditionDlg.h中定义CTipDlg类型的指针变量,所以要先包含它的头文件;然后在AdditionDlg.h中为CAdditionDlg类添加private成员变量CTipDlg *m_pTipDlg;。
2.在CAdditionDlg类的构造函数中初始化成员变量m_pTipDlg。
如果cpp文件中函数太多,我们可以在ClassView上半个视图中找到CAdditionDlg类,再在下半个视图中找到其构造函数双击,中间客户区域即可马上切到构造函数的实现处。
在构造函数体中添加m_pTipDlg=NULL;,这是个好习惯,在任何指针变量使用前都初始化,可以避免因误访问重要内存地址而破坏此地址的数据。
3.将上一讲中添加的模态对话框显示代码注释或删除掉,添加非模态对话框的创建和显示代码。
VC++中注释单行代码使用“//”,注释多行代码可以在需注释的代码开始处添加“/*”,结束处添加“*/”。
修改后的CAdditionDlg:
:
OnBnClickedAddButton()函数如下:
C++代码
1.void CAdditionDlg:
:
OnBnClickedAddButton()
2.{
3. // TODO:
Add your control notification handler code here
4. /*INT_PTR nRes; // 用于保存DoModal函数的返回值
5.
6. CTipDlg tipDlg; // 构造对话框类CTipDlg的实例
7. nRes = tipDlg.DoModal(); // 弹出对话框
8. if (IDCANCEL == nRes) // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行
9. return;*/
10. // 如果指针变量m_pTipDlg的值为NULL,则对话框还未创建,需要动态创建
11. if (NULL == m_pTipDlg)
12. {
13. // 创建非模态对话框实例
14. m_pTipDlg = new CTipDlg();
15. m_pTipDlg->Create(IDD_TIP_DIALOG, this);
16. }
17. // 显示非模态对话框
18. m_pTipDlg->ShowWindow(SW_SHOW);
19. // 将各控件中的数据保存到相应的变量
20. UpdateData(TRUE);
21. // 将被加数和加数的加和赋值给m_editSum
22. m_editSum = m_editSummand + m_editAddend;
23. // 根据各变量的值更新相应的控件。
和的编辑框会显示m_editSum的值
24. UpdateData(FALSE);
25.}
4.因为此非模态对话框实例是动态创建的,所以需要手动删除此动态对象来销毁对话框。
我们在CAdditionDlg类的析构函数中添加删除代码,但是MFC并没有自动给出析构函数,这时需要我们手动添加,在对话框对象析构时就会调用我们自定义的析构函数了。
在AdditionDlg.h文件中为CAdditionDlg添加析构函数声明:
~CAdditionDlg();,然后在AdditionDlg.cpp文件中添加析构函数的实现,函数体如下:
C++代码
1.CAdditionDlg:
:
~CAdditionDlg()
2.{
3. // 如果非模态对话框已经创建则删除它
4. if (NULL !
= m_pTipDlg)
5. {
6. // 删除非模态对话框对象
7. delete m_pTipDlg;
8. }
9.}
这样,非模态对话框创建和显示的代码就添加修改完了。
让我们运行下看看效果吧。
在加法计算器对话框上输入被加数和加数,然后点“计算”按钮,依然像上节一样弹出了提示对话框,但是先不要关闭它,你可以拖动它后面的加法计算器对话框试试,我们发现加法计算器对话框竟然可以拖动了,而且“和”编辑框里已经显示了运算结果,这表明提示对话框显示以后还没有关闭,OnBnClickedAddButton() 就继续向下执行了,不仅如此,加法计算器的每个编辑框还都可以响应输入。
VS2010/MFC编程:
属性页对话框及相关类的介绍
属性页对话框的分类
属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过标签切换各个页面。
另外,我们在创建MFC工程时使用的向导对话框也属于属性页对话框,它通过点击“Next”等按钮来切换页面。
属性页对话框就是包含一般属性页对话框和向导对话框两类。
它将多个对话框集成于一身,通过标签或按钮来切换页面。
属性页对话框相关类
我们使用属性页对话框时,用到的类主要有两个:
CPropertyPage类和CPropertySheet类。
1.CPropertyPage类
CPropertyPage类继承自CDialog类,它被用于处理某单个的属性页,所以要为每个属性页都创建一个继承自CPropertyPage的子类。
大家可以在VS2010的MSDN中查找CPropertyPage类以及它的成员的详细说明。
下面就为大家讲解MSDN中列出的CPropertyPage类的部分主要成员函数。
(1)构造函数
这里讲三个CProperty类的构造函数,函数原型为:
CPropertyPage();
explicitCPropertyPage(
UINTnIDTemplate,
UINTnIDCaption=0,
DWORDdwSize=sizeof(PROPSHEETPAGE)
);
explicitCPropertyPage(
LPCTSTRlpszTemplateName,
UINTnIDCaption=0,
DWORDdwSize=sizeof(PROPSHEETPAGE)
);
第一个是没有任何参数的构造函数。
第二个构造函数中,参数nIDTemplate是属性页的对话框资源ID,参数nIDCaption是属性页对话框选项卡的标题所用字符串资源的ID,若设为0,则选项卡标题就使用该属性页的对话框资源的标题。
第三个构造函数中,参数lpszTemplateName为属性页的对话框资源的名称字符串,不能为NULL。
参数nIDCaption同上。
(2)CancelToClose()函数
在模态属性页对话框的属性页进行了某不可恢复的操作后,使用CancelToClose()函数将“OK”按钮改为“Close”按钮,并禁用“Cancel”按钮。
函数原型为:
voidCancelToClose();
(3)SetModified()函数
调用此函数可激活或禁用“Apply”按钮,函数原型为:
voidSetModified(BOOLbChanged=TRUE);
(4)可重载函数
CPropertyPage类提供了一些消息处理函数,来响应属性页对话框的各种消息。
我们重载这些消息处理函数,就可以自定义对属性页对话框操作的处理。
可重载的消息处理函数包括:
(通过类向导中消息映射来实现)
OnApply:
处理属性页的“Apply”按钮被单击的消息
OnCancel:
处理属性页的“Cancel”按钮被单击的消息
OnKillActive:
处理属性页当前活动状态被切换的消息,常用于数据验证
OnOK:
处理属性页的“OK”按钮、“Apply”按钮或者“Close”按钮被单击的消息
OnQueryCancel:
处理属性页的“Cancel”按钮被单击前发出的消息
OnReset:
处理属性页的“Reset”按钮被单击的消息
OnSetActive:
处理属性页被切换为当前活动页的消息
OnWizardBack:
处理属性页的“Back”按钮被单击的消息,仅在向导对话框中有效
OnWizardFinish:
处理属性页的“Finish”按钮被单击的消息,仅在向导对话框中有效
OnWizardNext:
处理属性页的“Next”按钮被单击的消息,仅在向导对话框中有效
2.CPropertySheet类
CPropertySheet类继承自CWnd类,它是属性表类,负责加载、打开或删除属性页,并可以在属性页对话框中切换属性页。
它跟对话框类似,也有模态和非模态两种。
下面就讲解CPropertySheet类的部分成员函数。
(1)构造函数
这里依然列出CPropertySheet类的三个构造函数:
CPropertySheet();
explicitCPropertySheet(
UINTnIDCaption,
CWnd*pParentWnd=NULL,
UINTiSelectPage=0
);
explicitCPropertySheet(
LPCTSTRpszCaption,
CWnd*pParentWnd=NULL,
UINTiSelectPage=0
);
参数nIDCaption:
标题的字符串资源的ID。
参数pParentWnd:
属性页对话框的父窗口,若设为NULL,则父窗口为应用程序的主窗口。
参数iSelectPage:
初始状态时,活动属性页的索引,默认为第一个添加到属性表的属性页。
参数pszCaption:
标题字符串。
(2)GetActiveIndex()函数
获取当前活动属性页的索引。
函数原型为:
intGetActiveIndex()const;
返回值:
当前活动属性页的索引。
(3)GetActivePage()函数
获取当前活动属性页对象。
函数原型为:
CPropertyPage*GetActivePage()const;
返回值:
当前活动属性页对象的指针。
(4)GetPage()函数
获取某个属性页对象。
函数原型为:
CPropertyPage*GetPage(intnPage)const;
参数nPage:
目标属性页的索引。
返回值:
目标属性页对象的指针。
(5)GetPageCount()函数
获取属性页的数量。
函数原型为:
intGetPageCount()const;
返回值:
属性页的数量。
(6)GetPageIndex()函数
获取某属性页在属性页对话框中的索引。
函数原型为:
intGetPageIndex(CPropertyPage*pPage);
参数pPage:
要获取索引的属性页对象的指针。
返回值:
属性页对象在属性页对话框中的索引。
(7)SetActivePage()函数
设置某个属性页为活动属性页。
函数原型为:
BOOLSetActivePage(
intnPage
);
BOOLSetActivePage(
CPropertyPage*pPage
);
参数nPage:
要设置为活动属性页的索引。
参数pPage:
要设置为活动属性页的对象指针。
(8)SetWizardButtons()函数
在向导对话框上启用或禁用Back、Next或Finish按钮,应在调用DoModal之前调用此函数。
函数原型为:
voidSetWizardButtons(
DWORDdwFlags
);
参数dwFlags:
设置向导按钮的外观和功能属性。
可以是以下值的组合:
PSWIZB_BACK 启用“Back”按钮,如果不包含此值则禁用“Back”按钮。
PSWIZB_NEXT 启用“Next”按钮,如果不包含此值则禁用“Next”按钮。
PSWIZB_FINISH 启用“Finish”按钮。
PSWIZB_DISABLEDFINISH 显示禁用的“Finish”按钮。
(9)SetWizardMode()函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 讲座四 VSMFC编程几种常见对话框 讲座 VSMFC 编程 常见 对话框