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

时间:2017-06-16 11:54:25

标签: c++11 mfc focus eventhandler setfocus

在包含 2个编辑控件 2个按钮Nt+1对话框中,在这个精彩的answer之后,我现在可以在按钮后发送一个字符被按下了。

但是,我在为两个编辑框 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; }

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

[UPDATE] 在调试中,我可以看到在我按下按钮之前单击该编辑控件时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. 从不被调用。因此,它解释了nullpointer错误。但是,我不明白为什么不调用m_dialog_lastFocused = &m_editControlA;

1 个答案:

答案 0 :(得分:1)

拥有处理程序还不够,还需要将其放入消息映射中。

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()