2010-02-23 69 views
1

我有一个自CWnd派生的MFC控制,它的工作原理是这样的:定制MFC控件包含其他控件 - 没有得到消息通过

  1. 控制有其自身的OnPaint,和黑色的背景
  2. 点击控件上的任何位置都会导致编辑控件出现在该位置,无边框和黑色背景,因此它会混合在此框中的用户类型并点击输入,框消失并且控件的自定义绘画功能呈现相同文字在背景上的相同位置。

因此,我们的控制拥有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); 
} 

主要部件的实际工作OK(我们就完蛋了与方法)。但有一件事情不起作用,CCustomEdit自行注册EN_CHANGE事件等等。当CCustomEdit被创建为普通对话框控件(对话框模板上的CEdit,DDX绑定到CCustomEdit变量)这些工作,但在CCustomControl他们不是。

CCustomEdit::PreSubclassWindow()调用SetEventmask()被调用。 CCustomEditON_CHAR处理程序也被称为编辑框中的按键,但编辑框消息如EN_CHANGE的处理程序不是。

是否有任何明显的事情,如改变风格标志?否则,为什么我的自定义控件停止这些事件到达包含的编辑控件?

回答

0

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

我只能假设MFC中某些部分的init代码是负责任的。

1

我不确定我是否了解情况,但我有一些控制工作方式与我认为正在发生的工作方式大致相同,都是可行的,这是可能的。

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

相关问题