当编辑框在 C++ MFC 应用程序中获得焦点时的处理程序

Handler for when an edit box gains focus in C++ MFC app

在带有 2 个编辑控件2 个按钮 的对话框 MainDialog.cpp 中,跟随这个很棒的 我现在可以在按下按钮后发送字符。

但是,我在为我的两个编辑框 .

实现 EN_SETFOCUS 处理程序时遇到问题

下面是源文件中的代码

#include "afxdialogex.h" 

IMPLEMENT_DYNAMIC(CMainDialog, CDialogEx)

CMainDialog::CMainDialog(CWnd* pParent): CDialogEx(IDD_MAIN_DIALOG, pParent)
{
}

CMainDialog::~CMainDialog()
{
}

void CMainDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);

    DDX_Control(pDX, IDC_EDITCONTROL_A, m_editControlA);
    DDX_Control(pDX, IDC_EDITCONTROL_B, m_editControlB);
    DDX(Control(pDX, IDC_MFCBUTTON_KEY_X, m_buttonKeyX);
    DDX(Control(pDX, IDC_MFCBUTTON_KEY_Y, m_buttonKeyY);
}

BEGIN_MESSAGE_MAP(CMainDialog, CDialogEx)
    ON_EN_CHANGE(IDC_EDITCONTROL, &CMainDialog::OnEnChangeEditA)
    ON_BN_CLICKED(IDC_MFCBUTTON_KEY_X, &CMainDialog::OnBnClickedButtonX)
    ON_BN_CLICKED(IDC_MFCBUTTON_KEY_Y, &CMainDialog::OnBnClickedButtonY)
END_MESSAGE_MAP()

void CMainDialog::OnBnClickedButtonX()
{
    m_dialog_lastFocused ->PostMessageW(WM_CHAR, _T('X'));
}

void CMainDialog::OnBnClickedButtonY()
{
    m_dialog_lastFocused ->PostMessageW(WM_CHAR, _T('Y'));
}

以及头文件中的变量定义:

CWnd* m_dialog_lastFocused = nullptr;
CEdit m_editControlA;
CEdit m_editControlB;
CMFCButton m_buttonKeyX;
CMFCButton m_buttonKeyY;

我尝试了以下方法

void CMainDialog::OnEnSetfocusEditA()
{
    m_dialog_lastFocused = &m_editControlA;
}

但是当 运行 按下按钮时,我得到一个 Exception thrown: read access violation. this->m_dialog_lastFocused was nullptr. If there is a handler for this exception, the program may be safely continued.

有人可以告诉我我缺少什么吗?我有基本的 C++ 知识,需要有关如何设置这些焦点处理程序的帮助。

[更新] 在调试中,当我在按下按钮之前单击该编辑控件时,我可以看到 m_dialog_lastFocused = &m_editControlA;never 调用。因此,它解释了空指针错误。但是,我不明白为什么不调用 OnEnSetfocusEditA()

光有handler还不够,还需要放到message map中

OnEnSetfocusEditA 未被调用,因为与 OnEnChangeEditA 不同,OnEnSetfocusEditA 不在消息映射中。

修改消息映射,如下所示:

BEGIN_MESSAGE_MAP(CMainDialog, CDialogEx)
    ON_EN_SETFOCUS(IDC_EDITCONTROL, &CMainDialog::OnEnSetfocusEditA)     // <<<<< add this
    ON_EN_CHANGE(IDC_EDITCONTROL, &CMainDialog::OnEnChangeEditA)
    ON_BN_CLICKED(IDC_MFCBUTTON_KEY_X, &CMainDialog::OnBnClickedButtonX)
    ON_BN_CLICKED(IDC_MFCBUTTON_KEY_Y, &CMainDialog::OnBnClickedButtonY)
END_MESSAGE_MAP()