当编辑框在 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()
在带有 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()