在包含 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;
。
答案 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()