1

我对CEdit控件 ( CCheckeEdit) 进行了子类化。

我需要捕捉ON_CHANGE这个类并将消息发送到对话框(EN_CHANGE也可以在对话框中捕捉)。

在 subclassedCCheckeEdit中,我遵循了钩子程序:

BEGIN_MESSAGE_MAP(CCheckedEdit, CEdit)
    ON_WM_CHAR()
    ON_WM_CTLCOLOR_REFLECT()
    ON_CONTROL_REFLECT(EN_CHANGE, &CCheckedEdit::OnEnChange)
    ON_WM_TIMER()
    ON_WM_NCMOUSEMOVE()
END_MESSAGE_MAP()
//....
//....

void CCheckedEdit::OnEnChange()
{
    Validing();
    int res = ::SendMessage(GetParent()->m_hWnd, WM_COMMAND, (WPARAM)MAKELONG(3, EN_CHANGE), (LPARAM)GetParent()->m_hWnd);
}

在对话框中我有:

BEGIN_MESSAGE_MAP(CProjMfcDlg, CMjAcDialog)
    ON_EN_CHANGE(IDC_EDIT, &CProjMfcDlg::OnEnChangeEdit)
END_MESSAGE_MAP()

void CProjMfcDlg::OnEnChangeEdit()
{
    CString str;
    GetDlgItemText(str);
    if(str==....)
    // some validating code
    // set some button disable or enable
}

CProjMfcDlg::OnEnChangeEdit()不会处理(我在那里有断点)。

我究竟做错了什么?

OnEnChange上述程序是完整的。是的,我使用 MFC 反射:

BEGIN_MESSAGE_MAP(CCheckedEdit, CEdit)
    ON_WM_CHAR()
    ON_WM_CTLCOLOR_REFLECT()
    ON_CONTROL_REFLECT(EN_CHANGE, &CCheckedEdit::OnEnChange)
    ON_WM_TIMER()
    ON_WM_NCMOUSEMOVE()
END_MESSAGE_MAP()
4

1 回答 1

2

我刚刚解决了。

正确的方法是ON_CONTROL_REFLEX_EX改用ON_CONTROL_REFLEX.

然后消息首先发送到控件,然后根据控件挂钩过程(FALSE)的返回值,也发送到父窗口。

于 2022-01-15T08:51:42.480 回答