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

时间:2010-02-23 10:45:18

标签: mfc winapi

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

  1. 控件有自己的OnPaint和黑色背景
  2. 点击控件上的任意位置会导致编辑控件显示在该位置,无边框且带有黑色背景,因此它会混合使用
  3. 用户在此框中键入并按Enter键,该框消失,控件的自定义绘图功能在背景上的相同位置呈现相同的文本。
  4. 所以我们的控件拥有一个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的{​​{1}}处理程序进行按键操作,但是ON_CHAR之类的编辑框消息的处理程序不是。

    有没有明显的改变样式标志的东西?否则,为什么我的自定义控件会阻止这些事件到达包含的编辑控件?

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解这种情况,但是我有一些控制,其工作方式大致与我的想法相同,并且它们都有效,这是可能的。

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

答案 1 :(得分:0)

我找到了......不知何故,我的SetEventMask()被覆盖了。我不知道怎么回事,但是当我稍后再加一个额外的电话进行测试时,大多数事件处理程序都开始被调用。

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