main.cpp
// 设置项目属性中的子系统和 MFC 的使用,包含 afxwin.h 头文件
#include <afxwin.h>
#include "CMyDlg.h"
// 实现一个继承自 CWinApp 的子类,重写其中的 InitInstance 函数
class CMyWinAPP : public CWinApp
{
// 该函数会被作为用户编写的代码的入口点,通常在其中弹出对话框
BOOL InitInstance() override
{
// 使用自定义的对话框类弹出一个模态对话框
CMyDlg Dialog;
this->m_pMainWnd = &Dialog;
Dialog.DoModal();
// 如果返回 FALSE,表示对话框已经关闭了,不需要启用默认
// 的消息循环,如果是一个非模态对话框,要返回 TRUE
return FALSE;
}
};
// 创建一个唯一且全局的 CWinAPP 子类的对象
CMyWinAPP theApp;
CMyDlg.h
#pragma once
#include <afxwin.h>
#include <afxdialogex.h>
// 在 MFC 中,每一个窗口想要处理自己的消息,都应该绑定到一个具体的窗口类
// 步骤: 添加对话框资源,在对话框上右键添加类,选中 CDialogEx 进行绑定
class CMyDlg : public CDialogEx
{
public:
// 由于已经进行了绑定,所以构造函数中不需要提供资源ID,只需要给父窗口
CMyDlg(CWnd* pParent = nullptr);
// 让当前的类支持使用类向导进行操作,如果没有这句话,就不能使用完整的类向导功能
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG1 };
#endif
protected:
// 在 MFC 中,控件可以直接绑定到一个变量或对象,绑定的实现依赖于该函数
virtual void DoDataExchange(CDataExchange* pDX);
// 这个宏用于提供 MFC 的消息映射机制,如果一个类想要响应消息,就必须加上
DECLARE_MESSAGE_MAP()
public:
CString m_Edit;
CString m_Edit2;
public:
// 通过 MSDN 找到的 WM_CLOSE 消息对应的消息处理函数是
afx_msg void OnClose();
// 通过类向导直接添加的消息处理函数
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
// 通过鼠标双击产生的按钮点击函数
afx_msg void OnBnClickedButton1();
// 通过对话框资源,选中指定控件右键添加事件处理程序产生的。
afx_msg void OnEnChangeEdit1();
// 通过类向导中的命令,选中指定控件ID添加事件处理程序
afx_msg void OnUpdateEdit2();
};
// 添加消息响应函数的几种方法:
// 1. 自己手动的填写消息映射宏并查找函数原型实现函数
// 2. 使用类向导中的消息窗口,直接添加消息处理函数
// 3. 在对话框资源的指定控件上双击添加单击事件
// 4. 通过对话框资源,选中指定控件右键添加事件处理程序
// 5. 通过类向导中的命令,选中指定控件ID添加事件处理程序
CMyDlg.cpp
// CMyDlg.cpp: 实现文件
//
#include <afxwin.h>
#include "CMyDlg.h"
#include "resource.h"
#include "afxdialogex.h"
// 在子类对象中构造了父类对象,通过固定的 ID 将窗口和资源进行了绑定
CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_DIALOG1, pParent)
, m_Edit(_T(""))
, m_Edit2(_T(""))
{
}
// 在 MFC 中,控件可以直接绑定到一个变量或对象,绑定的实现依赖于该函数
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
// 在对话框中可以选择控件,右键绑定变量将控件和一个值或控件对象进行
// 绑定,绑定成功后该函数会多出一行,一个控件最多能够绑定两个变量
// 分别是值类型和控件类型。对于一些较为复杂的控件,只能绑定控件类型
DDX_Text(pDX, IDC_EDIT1, m_Edit);
DDX_Text(pDX, IDC_EDIT2, m_Edit2);
}
// 定义用于实现消息映射的消息映射表
BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
// 已知 WM_CLOSE 对应的消息映射宏是 ON_WM_CLOSE,通过 MSDN 找到原型
ON_WM_CLOSE()
// 可以使用 ctrl+shift+x 打开类向导,直接添加消息响应函数
ON_WM_LBUTTONDOWN()
// 对于控件,如果想要添加鼠标点击事件,可以在对话框中双击它
ON_BN_CLICKED(IDC_BUTTON1, &CMyDlg::OnBnClickedButton1)
ON_EN_CHANGE(IDC_EDIT1, &CMyDlg::OnEnChangeEdit1)
ON_EN_UPDATE(IDC_EDIT2, &CMyDlg::OnUpdateEdit2)
END_MESSAGE_MAP()
// 通过 MSDN 找到的 WM_CLOSE 消息对应的消息处理函数是
afx_msg void CMyDlg::OnClose()
{
CDialogEx::OnClose();
}
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// 通过 UpdateData(TRUE)可以将控件中的内容传入给绑定的变量
UpdateData(TRUE);
// 只要是 CWnd 类的子类,就可以使用建议版本的 MessageBox
this->MessageBox(m_Edit + m_Edit2);
// 在 MFC 中,基本不会出现使用句柄的情况,如果非要使用句柄,就需要
// 通过类对象指出其中的 m_hWnd 成员,或使用 GetSafeHwnd 获取
::MessageBox(this->m_hWnd, L"原始的对话框", L"标题", MB_OK);
// 通过 UpdateData(FALSE)可以将变量的内容写入到控件中
m_Edit = L"我是第一个编辑框修改后的内容";
m_Edit2 = L"我是第二个编辑框修改后的内容";
UpdateData(FALSE);
CDialogEx::OnLButtonDown(nFlags, point);
}
// 通过鼠标双击产生的按钮点击函数
void CMyDlg::OnBnClickedButton1()
{
MessageBox(L"按钮被点击了");
}
// 通过对话框资源,选中指定控件右键添加事件处理程序产生的。
void CMyDlg::OnEnChangeEdit1()
{
MessageBox(L"编辑框一的内容被更新了");
// TODO: 在此添加控件通知处理程序代码
}
// 通过类向导中的命令,选中指定控件ID添加事件处理程序
void CMyDlg::OnUpdateEdit2()
{
MessageBox(L"编辑框二的内容被更新了");
// TODO: 在此添加控件通知处理程序代码
}