ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MFC中的控件

2021-04-16 07:02:05  阅读:162  来源: 互联网

标签:模态 控件 MFC 单击 对话框 添加 按钮


模态对话框和非模态对话框

快速构建

​ 我们要实现一个窗口,窗口中包含了两个按钮,单击第一个打开的是模态对话框,单击第二个打开非模态对话框。

​ 模态对话框是指打开新的对话框不能对原有的对话框操作,非模态对话框是指打开新的对话框还可以对原来的对话框操作。

主界面如下图所示:

准备工作

  1. 在资源视图中新建出两个对话框资源,分别在其中右击选择添加类,设置好添加类的类名后,就实现了资源对象与类对象产生了关联。

    2.  在主对话框中添加两个按钮与两个对话框产生交互。
    

实现打开模态对话框

  1. 在资源界面中的主Dialog中,双击打开模态对话框的按钮,打开了单击按钮后触发的程序 的 事件函数:

    // 这里要注意,要在本文件中添加相应的头文件才可以用CDialogDla,读者需要注意到这一点
    void CDialogDlg::OnBnClickedButton1()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	dialogEXEC dia;
    	dia.DoModal();
    }
    

添加非模态对话框

  1. 在资源界面中的主Dialog中,双击打开非模态对话框的按钮,打开了单击按钮后触发的程序 的 事件函数:
  2. 添加非模态对话框大致分为三步,先 定义,再Create ,之后 ShowWindow,话句话说就是先创建后显示。

定义:要在类中定义为成员变量

class CDialogDlg : public CDialogEx
{
// 构造
...
...
private:
	CDialogShow dialogShow;
};

Create:

BOOL CDialogDlg::OnInitDialog()
{
    ...
    ...
	dialogShow.Create(IDD_SHOW);
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

ShowWindow:

void CDialogDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	dialogShow.ShowWindow(SW_SHOWNORMAL);
}

运行就行了~

具体说明:

​ 有人可能会问,为什么模态对话框可以定义局部变量,非模态对话框就不行呢?

​ 其实答案是生命周期的问题,局部变量的生命周期是它所在的方法,当这个方法执行完毕时,局部变量的生命周期就结束了,模态对话框调用了DOModel()方法,这个方法会将程序阻塞,让程序不往下面执行,所以在方法中定义局部变量完全没问题。而非模态的创建过程就不行,它所调用的Create和showWindow方法并不会阻塞,因此最好将对话框定义为成员变量。

​ 非模态对话框中,create方法为什么要放到OnInitDialog()中呢?

​ 先说需求,我们是每次单击每次让对话框显示在屏幕上,这个每次单击每次创建一个非模态对话框显然不符合需求,所以我们要讲create放到一个程序只执行一次的地方,因此放在OnInitDIalog()函数中(当然放在构造函数中也行),如果将函数放到单击事件了,第二次单击按钮时因为重复创建,程序就会报错。

下拉对话框

​ 按照图片的操作顺序,首先在资源视图中新建一个下拉对话框。

标签:模态,控件,MFC,单击,对话框,添加,按钮
来源: https://www.cnblogs.com/habit2021/p/14665332.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有