【MFC】学习MFC day3 vs2019 基于对话框的MFC应用程序
今天目标:
编写一个基于对话框的类似网页表单的MFC程序
需要3个界面(主界面,信息填写界面(非模态对话框),信息提交确认界面(模态对话框))
本章源代码的GitHub链接会放在底部
主界面:显示信息汇总
信息填写界面:填写信息
信息提交确认界面:确认提交信息
模态对话框与非模态对话框
模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。一般来说,Windows应用程序中,对话框分为模态对话框和非模态对话框两种。二者的区别在于当对话框打开时,是否允许用户进行其他对象的操作。
好的,开始。
1、应用程序类型选择基于对话框
2、选择Dlg类
3、点击插入对话框,插入2个
4、右击窗体,点击添加类,需要用到的窗体都需要添加好
5、设置好界面
(略)
之后就是代码了,但是再写之前需要知道:
1、右击控件,选择属性,可以设置控件的属性,以及绑定事件函数
2、双击控件,会有一个绑定一个默认的事件,比如按钮的默认事件是 按钮点击事件,会自动绑定OnBnClickedButton函数
void CMFCDialogDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
MsgDlg->ShowWindow(1);//SW_NORMAL==1
}
3、在设计界面,右击控件,可为控件添加变量,存放数据或者需要操控的控件一般就需要添加
4、Staitc Text 控件添加变量,需要将控件ID(ID在控件属性里面改)后的STATIC改为其他的,列如将(IDC_STATIC 改为 IDC_LABEL1)
5、控件变量是与控件对应,我们可以认为操控控件变量就是在操控控件本身,之前我们为窗体添加的类也可以这样理解
6、Edit控件(文本框控件)有一个特性就是回车会关闭对话框,所以需要设置属性
设置属性为:
Multiline=True
Want Enter=True
如何打开另一个对话框呢?
主界面的类中添加一个MsgDialog(信息填写界面的类)类型的成员变量,并且进行实列化
public:
MsgDialog *MsgDlg = new MsgDialog();
在CMFCDialogDlg(主界面的类)的初始化函数中,调用MsgDlg的Create(IDD_DIALOG1);函数
BOOL CMFCDialogDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
MsgDlg->Create(IDD_DIALOG1);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
再在点击事件中调用MsgDlg的ShowWindow(1)函数即可以非模态方式打开一个对话框(信息填写界面)
void CMFCDialogDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
MsgDlg->ShowWindow(1);//SW_NORMAL==1
}
总结:非模态对话框的打开步骤为 对话框类实列化=》调用Create成员函数=》调用ShowWindow成员函数
以此类推,模态对话框的打开步骤为 对话框类实列化=》调用DoModal成员函数
知道这些内容后今天的目标就很容易就能完成了,我就不再详细介绍其他的代码。
我会把完整的源代码文件的GitHub的链接放在最后。
最后
感谢大家的翻阅。