MFC:手写一个模态对话框程序

我们知道,在MFC中,要生成一个模态对话框程序,只要按着VS的提示,拖拖拽拽就能生成一个这样的程序,效率非常高。这里,我们反其道而行之,自己写一个这样的程序,这个程序与自动生成的程序大同小异,目的是通过自己写程序的过程,提高阅读理解MFC自动生成程序的能力。

具体步骤及相关代码如下:

0.创建一个win32空项目,并加载对话框等资源。

添加对话框等资源步骤:

a.右键资源文件->添加->资源->Dialog->新建(右键对话框->属性 可看到对话框默认ID是 IDD_DIALOG1);

b.视图->工具箱 拖入一个编辑框(Edit Control),右键编辑框->属性 可看到编辑框默认ID是

IDC_EDIT1);

c.工具箱 拖入一个按钮(Button),右键按钮->属性 将描述文字改为"控件->变量",同时可看到按钮的默认ID是IDC_BUTTON1;

d.按照上一步相同的方法,再拖入一个按钮,描述文字为"变量->控件",默认ID是IDC_BUTTON2。

上面,各个ID是该资源的唯一代码,后边要用到。为简单计,把"确认"、"取消"两个按钮删除。

1.设定环境

项目->属性->配置属性->高级 选用多字符集 选用静态MFC库

项目->属性->配置属性->链接器->系统 选用窗口

2.解决方案资源管理器->右键源文件->添加一个cpp源文件,命名mdlDlg.cpp。后面的所有代码,都写到这个文件中。

在mdlDlg.cpp中,先包含头文件 <afxwin.h>和 "resource.h",resource.h是由于我们添加对话框等资源生成的。代码:

cpp 复制代码
#include<afxwin.h>
#include"resource.h"

3.公开继承CDialog类声明子类CMyDlg(自定义对话框类)

a.类内声明消息处理宏并在类外实现

b.构造函数(显示调用父类构造函数并将对话框资源ID作为父类构造参数传入)

c.需要的数据成员变量在此声明,这里声明了两个对象:

CString m_strEdit; //数据类型对象,即"变量"

CEdit m_ctrlEdit; //控件类型对象 ,即"控件"

d.声明父类虚函数DoDataExchange并在类外重写实现,函数参数CDataExchange* pDX是一个结构体。

e.类内声明消息处理函数( 两个按钮被点击的消息处理程序 )并在类外实现;

相关的一个函数:UpdateData(BOOL bool); 参数=TRUE:控件传到变量;参数= FALSE:相反。这个函数内部调用DoDataExchange。

这部分的代码及注释如下:

cpp 复制代码
class CMyDlg :public CDialog {
public:
	DECLARE_MESSAGE_MAP() //类内声明消息处理宏
	enum { IDD = IDD_DIALOG1 };
public:
	CMyDlg() :CDialog(IDD) {};//
public:
	CString m_strEdit;//数据类型对象
	CEdit m_ctrlEdit;//控件类型对象 
	virtual void DoDataExchange(CDataExchange* pDX);//父类成员虚函数DoDataExchange重写
public:
	afx_msg void OnBtn1(); //按钮1被点击处理程序
	afx_msg void OnBtn2(); //按钮2被点击处理程序
};
void CMyDlg::OnBtn1() {
	UpdateData(TRUE);//调用DoDataExchange函数,将编辑框控件
	                 //中的内容传到变量m_strEdit中
	AfxMessageBox(m_strEdit);
}
void CMyDlg::OnBtn2() {
	m_strEdit = "变量初始值";
	UpdateData(FALSE);//调用DoDataExchange函数,将变量中的内容
	                  //显示到编辑框中
}

void CMyDlg::DoDataExchange(CDataExchange* pDX) {//程序一旦启动,即会调用本函数
	DDX_Text(pDX, IDC_EDIT1, m_strEdit);//自动生成式类向导课自动加载函数
	DDX_Control(pDX, IDC_EDIT1, m_ctrlEdit);
}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog) //实现消息处理宏
	ON_BN_CLICKED(IDC_BUTTON1, OnBtn1) 
	ON_BN_CLICKED(IDC_BUTTON2, OnBtn2) 
END_MESSAGE_MAP()

4.公开继承CWinApp方式声明CMyWinApp(自定义运行类)

类内声明InitInstance虚函数,类外实现:

<1>.声明自定义对话框类对象

<2>.将对话框对象地址赋值给m_pMainWnd

<3>.调用对话框类的成员函数DoModal(),无参,用来显示一个模态对话框。模态对话框必须回答,否则程序不能继续,非模态对话框处理不处理,程序都可继续。

<4>.return FALSE

5.声明自建运行类对象。

以上部分代码及注释如下:

cpp 复制代码
class CMyWinApp :public CWinApp {
public:
	virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance() { //重写初始化函数
	CMyDlg dlg;
	m_pMainWnd = &dlg;
	dlg.DoModal(); //显示对话框
	return FALSE;
}
CMyWinApp theApp; //声明全局运行类对象,main函数在其中

6.运行结果:

当运行额不能程序是,会出现下面的界面:

当我们在编辑框中输入文字然后点击"控件->变量"按钮时,会出现一个显示变量内容的消息框,显示内容正是我们在编辑框输入的内容;当点击"变量->控件"按钮时,编辑框的内容会恢复到默认值。

相关推荐
小飞猪Jay1 分钟前
C++面试速通宝典——13
jvm·c++·面试
rjszcb1 小时前
一文说完c++全部基础知识,IO流(二)
c++
小字节,大梦想2 小时前
【C++】二叉搜索树
数据结构·c++
吾名招财2 小时前
yolov5-7.0模型DNN加载函数及参数详解(重要)
c++·人工智能·yolo·dnn
我是哈哈hh2 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
憧憬成为原神糕手2 小时前
c++_ 多态
开发语言·c++
郭二哈2 小时前
C++——模板进阶、继承
java·服务器·c++
挥剑决浮云 -3 小时前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记
丶Darling.3 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo5203 小时前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法