MFC:在派生的CEdit

时间:2016-01-06 13:15:25

标签: c++ winapi mfc

我看到CEdit的行为非常奇怪。在我的CEdit控件的派生类中,我需要捕获文本更改事件。我是通过ON_CONTROL_REFLECT_EX

来做的
class CSomeDerivedEdit : public CEdit
{
    DECLARE_DYNAMIC(CSomeDerivedEdit )
public:
    CSearchEditCtrl();

protected:
    DECLARE_MESSAGE_MAP()
    afx_msg BOOL OnEnChange();
...
};

in 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);这里也控制创建并且我看到它,但是当我输入编辑控件时on_control_reflect没有调用。

2 个答案:

答案 0 :(得分:3)

如果WM_COMMAND消息的接收者也在MFC中被子类化,则

ON_CONTROL_REFLECT_EX只能工作。如果它是纯粹的Windows控件而不是MFC的子类,那么WM_COMMAND消息永远不会反映给任何孩子。

记住:反射有效,因为MFC首先从父级中的子级处理WM_COMMAND消息,然后将其提供回子控件。如果不处理,WM_COMMAND消息将在父内部处理。标准窗口控件不知道反射,并且总是自己处理WM_COMMAND消息....

因此,如果MFC没有对标题控件进行子类化,则反射将无效。

答案 1 :(得分:0)

我认为您应该阅读MSDN。派生类CEdit时,应将ON_EN_CHANGE消息处理程序放在BEGIN_MESSAGE_MAP()END_MESSAGE_MAP()宏之间。另一方面,OnEnChange函数的声明为:

afx_msg void OnEnChange();

不返回BOOL值。 ON_EN_CHANGE消息处理程序应该是这样的(来自MSDN):

BEGIN_MESSAGE_MAP()
ON_EN_CHANGE(ID_OF_THIS_CONTROL,OnEnChange)
END_MESSAGE_MAP()

希望这会对您有所帮助。