我有一个自定义CWnd派生的MFC控件,其工作原理如下:
所以我们的控件拥有一个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
之类的编辑框消息的处理程序不是。
有没有明显的改变样式标志的东西?否则,为什么我的自定义控件会阻止这些事件到达包含的编辑控件?
答案 0 :(得分:1)
我不确定我是否理解这种情况,但是我有一些控制,其工作方式大致与我的想法相同,并且它们都有效,这是可能的。
编辑控件的EN_CHANGE将发送到CWnd派生的控件。你在反映这些消息吗?如果EN_CHANGE进入自定义控件,您是否尝试过?根据您的描述,您期望EN_CHANGE自动结束在CCustomEdit的消息调度程序宏链中,但它不会;你需要包含窗口的帮助。现在MFC在CDialog中为你做了大部分工作,但是如果你自己动手,你需要手动完成,或者使用消息反射宏。
答案 1 :(得分:0)
我找到了......不知何故,我的SetEventMask()被覆盖了。我不知道怎么回事,但是当我稍后再加一个额外的电话进行测试时,大多数事件处理程序都开始被调用。
我只能假设MFC中的某些部分初始代码负责。