C++11 当编辑框在C++;MFC应用程序

C++11 当编辑框在C++;MFC应用程序,c++11,mfc,focus,eventhandler,setfocus,C++11,Mfc,Focus,Eventhandler,Setfocus,在带有2个编辑控件和2个按钮的对话框main dialog.cpp中,按下按钮后,我现在可以发送一个字符 但是,我在为我的两个编辑框实现EN_SETFOCUS的处理程序时遇到问题 下面是源文件中的代码 #include "afxdialogex.h" IMPLEMENT_DYNAMIC(CMainDialog, CDialogEx) CMainDialog::CMainDialog(CWnd* pParent): CDialogEx(IDD_MAIN_DIALOG, pParent) {

在带有2个编辑控件和2个按钮的对话框
main dialog.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;
}
但当我运行并按下一个按钮时,抛出了一个
异常:读取访问冲突。此->m_对话框上次聚焦为空PTR。如果存在此异常的处理程序,则可以安全地继续该程序。

有人能告诉我我错过了什么吗?我有基本的C++知识,需要帮助如何设置这些焦点处理程序。 [更新]
在调试中,我可以看到
m_对话框\u lastFocused=&m_editControlA从未被调用。因此,它解释了空指针错误。但是,我不明白为什么没有调用
onesetfocusedita()

只有一个处理程序是不够的,还需要将它放入消息映射中

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

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

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()
BEGIN\u MESSAGE\u MAP(CMindialog、CDialogEx)

在_EN_SETFOCUS(IDC_EDITCONTROL,&cmindialog::OnEnSetfocusEditA)//上,仅拥有一个处理程序是不够的,还需要将其放入消息映射中

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

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

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()
BEGIN\u MESSAGE\u MAP(CMindialog、CDialogEx)

在_EN_SETFOCUS(IDC_EDITCONTROL,&cmindialog::onesetfocusedita)//您需要找出为什么
m_dialog\u lastFocused
实际上是
nullptr
@MichaelWalz。在调试中,我可以看到
m_对话框\u lastFocused=&m_editControlA。因此,它解释了空指针错误。但是,我不明白为什么没有调用
onesetfocusedita()
。您需要找出
m\u dialog\u lastFocused
确实是
nullptr
@MichaelWalz的原因。在调试中,我可以看到
m_对话框\u lastFocused=&m_editControlA。因此,它解释了空指针错误。但是,我不明白为什么没有调用
onesetfocusedita()
。在消息映射中没有包含它是一个令人尴尬的错误。。谢谢你指出这一点。没有把它放在信息地图上是一个令人尴尬的错误。。谢谢你指出这一点。