因最近研究工作要用到MFC,故再次重温了孙鑫老师的MFC对话框编程,因所用的编译软件为VS2008,与视频中孙老师使用的VC++6.0有很大出入,造成很大不便,我通过各方查找,实现了VS2008相对应于VC++6.0的方法。现将对话框编程整个视频的详细内容分享如下,希望对有缘看到的朋友提供方便。笔者水平有限,难免有不足之处,欢迎批评指正。
一.准备工作
1.创建一个MFC Application.
File->New->Project->Visual C++->MFC->MFC Application.输入项目名称Menu后,点击NEXT,Application type->Single document.建议取消勾选下方的Use Unicode libraries,不然有时候会出错。然后直接点Finish。完成MFC程序创建过程。
2.新建对话框
点击Resource View(资源视图)->Dialog,右键添加资源->选择对话框->新建,控件ID为IDD_DIALOG1。
我们会看到,程序刚建好时资源视图对话框中已有IDD_ABOUTBOX,这个是版本信息提示对话框,程序中点击帮助可查看。
点击类视图,对话框资源对应的类:CObject->CCmdTarget->CWnd->CDialog
一个概念:模态对话框和非模态对话框,模态对话框显示时不能执行程序其它任务,而非模态对此无限制。
3.新建一个和对话框相关的类
左键资源视图中刚创建的对话框资源,右键右面的对话框,Add Class->Class Name->CTestDlg,MFC中前缀C代表类。
这样,我们就得到一个新类---CTestDlg,此类就是与刚创建的对话框相对应的,我们对对话框的操作可以在这里进行。
两个重要函数:
构造函数:调用基类CDialog的构造函数,IDD为对话框资源的ID
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestDlg::IDD, pParent)
{
}
CTestDlg::DoDataExchange(),此函数主要用来对话框数据交换和数据校验
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
4.创建对话框操作
在Menu菜单中增加菜单项”Dialog”,属性设置为PopUp
在该菜单项添加消息响应函数:
Message Type:COMMAND,Class List:CmenuView
二.对话框操作
1.模态对话框与非模态对话框
(1)模态对话框
模态对话框的创建函数:CDialog::DoModal()
模态对话框的关闭函数:CDialog::EndDialog()
#注意:View类中并不知道CTestDlg类型,要包涵头文件”TestDlg.h”,创建过程在View类的OnDialog()函数中。
void CmenuView::OnDialog()
{
// TODO: Add your command handler code here
CTestDlg dlg;
dlg.DoModal();//对话框出现就不能在操作其他,除非先关闭它
}
(2)非模态对话框
非模态对话框的创建函数:BOOL CDialog::Create(ID号,父窗口指针);
若父窗口指针设为NULL,对话框父窗口就被设置为主应用程序窗口(此应用中为框架窗口)。
CtestDlg dlg;
dlg.Create(IDD_DIALOG1,this);
#注意:
对于非模态对话框必须调用ShowWindow();而模态创建函数本身有显示功能 dlg.ShowWindow(SW_SHOW);
非模态对话框不能是局部变量,而模态因为要暂停,程序停止执行,停留在其生命周期内,所以可以是局部变量
非模态也可以是局部变量两种方案:
a.定义Dlg类型的成员变量
b.定义指针,在堆上分配内存
CTestDlg *pDlg=new CTestDlg();
Dlg->Create(IDD_DIALOG1,this);
pDlg->ShowWindow(SW_SHOW);
//这种方法不能解决内存释放重利用问题,最好是添加成员变量,再用析构函数delete释放
#注意:
对于模态对话框,点击OK后窗口被销毁,而非模板对话框没被销毁而是隐藏了。
非模态对话框点击OK时,由基类中OnOK虚函数响应,只隐藏不销毁。
好的方法是类中要覆盖基类的OnOK()在其内部调用DestroyWindow()销毁。
所以,之后示例中我们都使用模态对话框。
2.关于对话框的操作
(1)Task:在对话框上添加一个按钮,点击该按钮再动态创建一个按钮
VS2008切换到资源视图,工具栏直接拖动添加名称是Add的按钮。为这个按钮添加消息响应函数,按钮的点击属于通告消息:
<