首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MFC:没有在派生的EN_CHANGE CEdit中获得CEdit消息

MFC:没有在派生的EN_CHANGE CEdit中获得CEdit消息
EN

Stack Overflow用户
提问于 2016-01-06 13:15:25
回答 2查看 1.7K关注 0票数 1

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

代码语言:javascript
复制
class CSomeDerivedEdit : public CEdit
{
    DECLARE_DYNAMIC(CSomeDerivedEdit )
public:
    CSearchEditCtrl();

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

在cpp中

代码语言:javascript
复制
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没有调用它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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子类化,则反射将无法工作。

票数 3
EN

Stack Overflow用户

发布于 2019-04-12 18:08:14

我觉得你应该看看MSDN。在派生类CEdit时,应该在BEGIN_MESSAGE_MAP()END_MESSAGE_MAP()宏之间放置ON_EN_CHANGE消息处理程序。另一方面,OnEnChange函数,其声明是:

代码语言:javascript
复制
afx_msg void OnEnChange();

不返回BOOL值。ON_EN_CHANGE消息处理程序应该如下(来自MSDN):

代码语言:javascript
复制
BEGIN_MESSAGE_MAP()
ON_EN_CHANGE(ID_OF_THIS_CONTROL,OnEnChange)
END_MESSAGE_MAP()

希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34634103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档