我看到了CEdit非常奇怪的行为。在来自CEdit控件的派生类中,我需要捕获文本更改事件。我是通过ON_CONTROL_REFLECT_EX做的
class CSomeDerivedEdit : public CEdit
{
DECLARE_DYNAMIC(CSomeDerivedEdit )
public:
CSearchEditCtrl();
protected:
DECLARE_MESSAGE_MAP()
afx_msg BOOL OnEnChange();
...
};在cpp中
IMPLEMENT_DYNAMIC(CSomeDerivedEdit , CEdit)
BEGIN_MESSAGE_MAP(CSomeDerivedEdit , CEdit)
ON_CONTROL_REFLECT_EX(EN_CHANGE, &CSomeDerivedEdit::OnEnChange)
END_MESSAGE_MAP()这个控件在某些列表控件中创建为子窗口,当我创建它并作为父窗口指针传递列表控制一切时,我得到了EN_CHANGE事件,但是当我作为父窗口头控件传递列表控制事件时,没有反应。
m_someEdit.Create( WS_CHILDWINDOW|WS_VISIBLE, rcRect, this, IDC_EDIT);这里一切都很好
这里的m_someEdit.Create( WS_CHILDWINDOW|WS_VISIBLE, rcRect, GetHeaderCtrl(), IDC_EDIT);也控制create,我看到了,但是当我输入编辑控件时,on_control_reflect没有调用它。
发布于 2016-01-06 14:08:54
只有在MFC中ON_CONTROL_REFLECT_EX消息的接收方也被子类时,WM_COMMAND才能工作。如果它是一个纯windows控件,而不是MFC子类,则WM_COMMAND消息永远不会反映给任何子控件。
记住:反射工作,因为MFC首先处理父控件中的一个子WM_COMMAND消息,并将它提供给子控件。如果不处理,则在父级内部处理WM_COMMAND消息。标准窗口控件不知道反射,总是自己处理WM_COMMAND消息.
因此,如果标头控件未被MFC子类化,则反射将无法工作。
发布于 2019-04-12 18:08:14
我觉得你应该看看MSDN。在派生类CEdit时,应该在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏之间放置ON_EN_CHANGE消息处理程序。另一方面,OnEnChange函数,其声明是:
afx_msg void OnEnChange();不返回BOOL值。ON_EN_CHANGE消息处理程序应该如下(来自MSDN):
BEGIN_MESSAGE_MAP()
ON_EN_CHANGE(ID_OF_THIS_CONTROL,OnEnChange)
END_MESSAGE_MAP()希望这能帮到你。
https://stackoverflow.com/questions/34634103
复制相似问题