问题
MFC提供了编辑框控件CEdit,可以基本满足我们的一般性编辑需求,但是如果想对CEdit进行定制,例如重新设计其边框,对用户输入做预处理的时候,我们需要扩展CEdit。今天来看看ON_CONTROL_REFLECT和ON_CONTROL_REFLECT_EX这两个反射宏在CEdit扩展中的使用。
ON_CONTROL_REFLECT
从名称上来看,ON_CONTROL_REFLECT是一个反射宏。所谓反射,可以这样理解:通常控件的运行,例如绘制,通知的处理等需要其父窗口来处理,如果希望控件能自己处理一些消息,则需要使用到反射。也即,控件的消息将不会路由到其父窗口,而是直接在控件类里直接得到处理。
以下代码演示了通过ON_CONTROL_REFLECT宏,实现在控件类中直接处理EN_CHANGE消息的过程。
代码解析
1) 我们的CMyEdit继承自CEdit,并通过编写事件处理函数OnEnChange来处理控件的EN_CHANGE消息。通过ON_CONTROL_REFLECT来将EN_CHANGE消息反射至类本身。
2) 注意,在这种情况下,父窗口将不会收到EN_CHANGE通知,也即,你在父窗口中编写如下的代码,将不会工作。