C++11 当编辑框在C++;MFC应用程序
在带有2个编辑控件和2个按钮的对话框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) {
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当我在按下按钮之前单击编辑控件时,code>从未被调用。因此,它解释了空指针错误。但是,我不明白为什么没有调用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即使在按下按钮之前单击编辑控件,也不会调用code>。因此,它解释了空指针错误。但是,我不明白为什么没有调用onesetfocusedita()
。您需要找出m\u dialog\u lastFocused
确实是nullptr
@MichaelWalz的原因。在调试中,我可以看到m_对话框\u lastFocused=&m_editControlA即使在按下按钮之前单击编辑控件,也不会调用code>。因此,它解释了空指针错误。但是,我不明白为什么没有调用onesetfocusedita()
。在消息映射中没有包含它是一个令人尴尬的错误。。谢谢你指出这一点。没有把它放在信息地图上是一个令人尴尬的错误。。谢谢你指出这一点。