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

自定义MFC控件包含另一个控件-消息无法通过,mfc,winapi,Mfc,Winapi,我有一个自定义CWnd派生的MFC控件,其工作原理如下: 控件有自己的OnPaint和黑色背景 单击控件上的任何位置都会使编辑控件显示在该位置,无边框且背景为黑色,因此它会融入其中 用户在此框中键入并单击enter键,该框将消失,控件的自定义绘制功能将在背景的相同位置渲染相同的文本 因此,我们的控件拥有一个CCustomEdit,当您单击背景时,该控件将被创建或移动,并可见: CCustomEdit::Show(Rect &rc,CCustomControl *pParent) {

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

  • 控件有自己的OnPaint和黑色背景
  • 单击控件上的任何位置都会使编辑控件显示在该位置,无边框且背景为黑色,因此它会融入其中
  • 用户在此框中键入并单击enter键,该框将消失,控件的自定义绘制功能将在背景的相同位置渲染相同的文本
  • 因此,我们的控件拥有一个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 );
    }
    
    主要部分实际上工作正常(我们仍然坚持这种方法)。但有一件事不起作用,那就是
    CCustomEdit
    EN_CHANGE
    事件进行自我注册等等。当
    CCustomEdit
    被创建为普通对话框控件时(对话框模板上的
    CEdit
    ,DDX绑定到
    CCustomEdit
    变量),这些控件可以工作,但在
    CCustomControl
    中它们不能工作

    CCustomEdit::PreSubclassWindow()
    调用
    SetEventmask()
    并正在调用。编辑框中的按键操作也会调用
    CCustomEdit
    上的
    处理程序,但编辑框消息(如
    EN\u CHANGE
    )的处理程序不会被调用


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

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


    编辑控件的EN_更改将发送到CWnd派生控件。你在反映这些信息吗?如果EN_更改到达自定义控件,您是否尝试过?从您所描述的内容来看,您希望EN_更改会自动结束在CCustomEdit的message dispatcher宏链中,但事实并非如此;您需要包含窗口的帮助。现在MFC在CDDialog中为您完成了大部分工作,但是如果您自己滚动,您需要手动执行,或者使用message reflection宏。

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


    编辑控件的EN_更改将发送到CWnd派生控件。你在反映这些信息吗?如果EN_更改到达自定义控件,您是否尝试过?从您所描述的内容来看,您希望EN_更改会自动结束在CCustomEdit的message dispatcher宏链中,但事实并非如此;您需要包含窗口的帮助。现在MFC在CDDialog中为您完成了大部分功能,但是如果您自己滚动,则需要手动执行,或者使用消息反射宏。

    我找到了它。。。不知怎的,我的SetEventMask()被重写了。我不知道如何或在何处进行测试,但当我后来添加了一个额外的调用以进行测试时,大多数事件处理程序都开始被调用


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

    我发现了它。。。不知怎的,我的SetEventMask()被重写了。我不知道如何或在何处进行测试,但当我后来添加了一个额外的调用以进行测试时,大多数事件处理程序都开始被调用

    我只能假设MFC中的init代码的一部分是负责的