main.cpp

    1. // 设置项目属性中的子系统和 MFC 的使用,包含 afxwin.h 头文件
    2. #include <afxwin.h>
    3. #include "CMyDlg.h"
    4. // 实现一个继承自 CWinApp 的子类,重写其中的 InitInstance 函数
    5. class CMyWinAPP : public CWinApp
    6. {
    7. // 该函数会被作为用户编写的代码的入口点,通常在其中弹出对话框
    8. BOOL InitInstance() override
    9. {
    10. // 使用自定义的对话框类弹出一个模态对话框
    11. CMyDlg Dialog;
    12. this->m_pMainWnd = &Dialog;
    13. Dialog.DoModal();
    14. // 如果返回 FALSE,表示对话框已经关闭了,不需要启用默认
    15. // 的消息循环,如果是一个非模态对话框,要返回 TRUE
    16. return FALSE;
    17. }
    18. };
    19. // 创建一个唯一且全局的 CWinAPP 子类的对象
    20. 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:  在此添加控件通知处理程序代码
    }