VS2019 MFC对话框的创建和显示

1.创建项目

在vs2019中选择MFC应用,点击下一步
图1
输入项目名称后,选择存储位置,并勾选将解决方案和项目放在同一目录中,点击创建
图2
在弹出的消息框内,选择单个文档,点击完成。
图3

2.对话框创建

创建好项目后,在解决方案资源管理器中找到资源视图,找到其中的menu.rc,双击进入资源视图。
图4
之后打开Dialog项,鼠标右键点击Dialog,选择添加资源,单击新建,这样一个新的对话框就创建好了。
在这里插入图片描述
在这里插入图片描述
接下来需要创建一个类与这个新建的对话框资源相关联,双击打开刚刚创建的对话框,右键窗体,选择添加类。
在这里插入图片描述
添加一个新类 CTestDlg,对话框选择我们之前添加的 IDD_DIALOG1
在这里插入图片描述
点击确定后,可以在类视图中找到新创建的CTestDlg类
在这里插入图片描述
现在,就有一个类(CTestDlg)与IDD_DIALOG1这个对话框资源相关联了,接下来需要在程序中显示这个对话框窗口,可以增加一个菜单项,当单击菜单项时就显示这个新的对话框窗口。

3.增加菜单项

在资源视图中找到Menu,并双击打开其下的 IDR_MAINFRAME
在这里插入图片描述
在帮助后面添加新的菜单栏,命名为对话框。
在这里插入图片描述
运行程序,得到如下窗口,可见刚刚添加的对话框也在窗口中。
在这里插入图片描述
接下来创建模态对话框

4.模态对话框创建

创建模态对话框需要调用CDialog类的成员函数:DoModal
首先到刚刚创建的菜单栏“对话框”处,鼠标右键点击“对话框”,选择添加事件处理程序选项。
在这里插入图片描述
在弹出来的窗口中选择xxxView类,消息类型选择COMMAND,这样就完成了对消息框的配置,只需要在VS自动生成的代码中配置创建模态对话框即可。
在这里插入图片描述
由于在视类中并不知道CTestDlg对话框是什么样是数据类型,所以在View的源文件中必须包含CTestDlg的头文件。

void CChildView::OnDialog()
{
	// TODO: 在此添加命令处理程序代码
	CTestDlg dlg;
	dlg.DoModal();
}

运行之后即可出现对话框。

5.非模态对话框创建

如果要创建非模态对话框,则需要利用CDialog类的Create成员函数。

void CChildView::OnDialog()
{
	// TODO: 在此添加命令处理程序代码
	CTestDlg dlg;
	//dlg.DoModal();
	dlg.Create(IDD_DIALOG1, this);//第一个参数可以是对话框的ID也可以是对话框模板的名称 第二个参数制定了对话框的父窗口
	dlg.ShowWindow(SW_SHOW);//当利用Create函数创建非模态对话框时,还需要调用ShowWindow函数将对话框显示出来
}

上述程序在运行时,对话框出现的情况是一闪而过。因为此时的dlg是一个局部对象,当执行完OnDialog函数时,dlg的生命周期也就结束了。
针对上述问题,有以下两种方法:
1.把对话框对象定义为视类成员变量;
2.将它定义为指针

方法1
在视类的.h头文件中添加如下代码:

private:
	CTestDlg dlg;

并添加对CTestDlg.h的引用
然后将void CChildView::OnDialog()函数中的CTestDlg dlg;语句注释掉即可。

void CChildView::OnDialog()
{
	// TODO: 在此添加命令处理程序代码
	//CTestDlg dlg;
	//dlg.DoModal();
	dlg.Create(IDD_DIALOG1, this);//第一个参数可以是对话框的ID也可以是对话框模板的名称 第二个参数制定了对话框的父窗口
	dlg.ShowWindow(SW_SHOW);//当利用Create函数创建非模态对话框时,还需要调用ShowWindow函数将对话框显示出来
}

这样运行代码之后对话框就可以完整显示。
但上述代码仍存在问题,对话框显示之后,如果点击确定对话框会消失,但是如果再次打开对话框程序就会崩溃。这是因为非模态对话框在单击OK后并没有被销毁而是隐藏起来了,因此,对于非模态对话框来说,如果有一个ID为IDOK的按钮,就必须重写基类的OnOK这个虚函数,并在重写的函数中调用DestoryWindows函数,以销毁对话框。
在资源视图中打开之前创建的对话框,双击确定和取消按钮,VS会自动生成点击他们的代码

void CTestDlg::OnBnClickedCancel()
{
	// TODO: 在此添加控件通知处理程序代码
	CDialog::OnCancel();
}

在其中加入DestoryWindows函数

void CTestDlg::OnBnClickedCancel()
{
	// TODO: 在此添加控件通知处理程序代码
	CDialog::OnCancel();
	DestroyWindow();
}

这样再运行代码,点击确定和取消再打开对话框程序就不会崩溃。

方法2
将其定义为指针

void CChildView::OnDialog()
{
	// TODO: 在此添加命令处理程序代码
	CTestDlg *dlg= new CTestDlg;
	//dlg.DoModal();
	dlg->Create(IDD_DIALOG1, this);//第一个参数可以是对话框的ID也可以是对话框模板的名称 第二个参数制定了对话框的父窗口
	dlg->ShowWindow(SW_SHOW);//当利用Create函数创建非模态对话框时,还需要调用ShowWindow函数将对话框显示出来
}

最后需要在CTestDlg类中重载PostNcDestroy虚函数,释放this指针所指向的内存(需要在.h中声明PostNcDestroy函数)

void CTestDlg::PostNcDestroy()
{
	CDialog::PostNcDestroy();
	delete this;
}

(参考孙鑫老师《VC++深入详解》)

  • 7
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: MFC对话框创建显示可以通过以下步骤实现:首先,在Visual Studio中创建一个MFC应用程序,然后在资源视图中添加一个对话框资源。接下来,在类向导中添加一个对话框类,并将其关联到对话框资源。最后,在应用程序的初始化函数中创建对话框类的实例,并调用DoModal函数显示对话框。 ### 回答2: MFC(Microsoft Foundation Classes)是为了简化Windows应用程序的开发而提供的一种C++类库。对话框则是MFC中一种常用的用户界面元素,用于显示和接收用户的输入。 MFC对话框创建显示通常需要以下步骤: 1. 在Visual Studio中创建一个新的MFC应用程序项目。 2. 在资源视图中打开资源文件夹,找到对话框文件夹,并双击打开对话框资源编辑器。 3. 在对话框资源编辑器中设计和布局你的对话框,可以添加按钮、文本框、复选框等控件,并设置其属性和事件处理程序。 4. 回到资源视图,双击IDD_DIALOG1资源,将对话框类关联到对话框资源上。 5. 在应用程序的代码中创建对话框对象,并通过DoModal()函数显示对话框,如下所示: ``` CMyDialog dlg; dlg.DoModal(); ``` 6. 通过DoModal()函数,对话框将以模态对话框的形式显示在屏幕上,此时用户无法与其他窗口进行交互,只能与对话框进行交互。 7. 用户与对话框进行交互,例如输入文本、点击按钮等操作。 8. 当用户关闭对话框或执行其他关闭对话框的操作时,对话框将自动销毁,并返回到应用程序的代码继续执行。 总之,通过使用MFC框架,使用对话框资源编辑器设计对话框布局,创建对话框对象并通过DoModal()函数显示对话框,可以方便地创建显示MFC对话框。 ### 回答3: MFC对话框创建显示是指在Microsoft Foundation Classes (MFC)中创建显示对话框界面的过程。 首先,我们需要在MFC应用程序中添加一个对话框资源。对话框资源是一个可视化的窗口模板,您可以使用资源编辑器来创建和设计它。在资源编辑器中,您可以添加控件,定义布局和设置属性等。保存并关闭资源编辑器后,对话框资源将被添加到您的项目中。 接下来,您需要在代码中创建对话框类的实例。您可以通过在代码中调用CDialog类的派生类的构造函数来创建对话框对象。这个派生类是由资源编辑器自动生成的,它包含了与对话框相关的方法和属性。 一旦您创建对话框对象,您可以使用DoModal()方法来显示对话框。这个方法会将控制权从父窗口转移到对话框,并且会阻塞当前线程,直到对话框关闭。在DoModal()方法返回之后,您可以根据用户的操作结果来执行相应的逻辑。 另一种显示对话框的方法是使用Create()方法。通过调用该方法,您可以将对话框作为模态或非模态的方式显示。非模态对话框允许用户在对话框和其他窗口之间切换,而模态对话框则阻塞了父窗口的输入。 通过在对话框类中添加处理响应用户操作的函数,您可以在对话框中添加交互式功能。您可以在这些函数中处理按钮点击、文本框输入、列表选择等用户操作,并根据需要执行相应的操作。 总之,MFC对话框创建显示需要先添加对话框资源,然后在代码中创建对话框类的实例,并使用DoModal()或Create()方法来显示对话框。此外,您还可以通过添加处理功能的函数来实现与用户的交互。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值