自定义 MFC 控件包含另一个控件 - 消息未通过

Posted

技术标签:

【中文标题】自定义 MFC 控件包含另一个控件 - 消息未通过【英文标题】:Custom MFC control contains another control - messages not getting through 【发布时间】:2010-02-23 10:45:17 【问题描述】:

我有一个自定义的 CWnd 派生 MFC 控件,其工作方式如下:

    控件有自己的 OnPaint 和黑色背景 单击控件上的任意位置会导致编辑控件出现在该位置,无边框且具有黑色背景,因此它会融入其中 用户在此框中键入并按回车键,该框消失并且控件的自定义绘制功能在背景的相同位置呈现相同的文本。

所以我们的控件拥有一个 CCustomEdit,当您点击背景时,控件会被创建或移动,并使其可见:

CCustomEdit::Show(Rect &rc,CCustomControl *pParent)

    if ( !::IsWindow( m_hWnd ) )
    
        Create( ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | ES_NOHIDESEL | ES_CENTER | ES_UPPERCASE, rc, pParent, 999 );
    
    else
        MoveWindow( &rc );

主要部分实际上工作正常(我们坚持使用这种方法)。但是一件事不起作用的是CCustomEditEN_CHANGE 事件自行注册等等。当CCustomEdit 被创建为普通对话框控件时(CEdit 在对话框模板上,DDX 绑定到CCustomEdit 变量)这些工作,但在CCustomControl 它们不是。

CCustomEdit::PreSubclassWindow() 调用 SetEventmask() 并且 正在 被调用。并且CCustomEditON_CHAR 处理程序也被调用来处理编辑框中的按键,但是像EN_CHANGE 这样的编辑框消息的处理程序却没有。

是否有任何明显的事情,例如更改样式标志?否则,为什么我的自定义控件会阻止这些事件到达包含的编辑控件?

【问题讨论】:

【参考方案1】:

我不确定我是否理解这种情况,但我有一些控件的工作方式与我认为正在发生的事情大致相同,而且它们都可以工作,这是可能的。

编辑控件的EN_CHANGE 发送到您的CWnd 派生控件。你在反映这些信息吗?如果 EN_CHANGE 进入自定义控件,您是否尝试过?根据您的描述,您期望 EN_CHANGE 自动出现在 CCustomEdit 的消息调度程序宏链中,但事实并非如此;您需要包含窗口的帮助。现在 MFC 在 CDialog 中为您完成大部分工作,但如果您自己滚动,则需要手动完成,或使用消息反射宏。

【讨论】:

【参考方案2】:

我找到了...不知何故,我的 SetEventMask() 被覆盖了。我不知道如何或在哪里,但是当我稍后添加一个额外的调用来测试时,大多数事件处理程序开始被调用。

我只能假设 MFC 中的部分初始化代码负责。

【讨论】:

以上是关于自定义 MFC 控件包含另一个控件 - 消息未通过的主要内容,如果未能解决你的问题,请参考以下文章

无法将自定义消息从一个控件发送到另一个控件

MFC如何添加自定义控件

MFC:如何将自定义控件包含到 Visual Studio 的工具箱中

在执行自定义验证之前,MFC初始化日期时间选择器控件

如何在 MFC 自定义控件类中挂钩控件关闭

在MFC里面添加个自定义控件,为啥程序自动退出,不显示窗口等待用户操作了?