最近的一个疑问,关于BCB中重写窗口的事件
发现BCB中重写窗口的事件有两种方法,一种是重写WndProc()函数,然后判断Msg参数来截获重写某事件;
还有一种是用消息映射宏,
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(msg,type,meth)
END_MESSAGE
然后在自定义的函数中重写某事件。
我现在疑惑的是,究竟这两种方法有什么本质的区别?因为我发现有些时候用第一种方法好用,有些时候用第二种方法好用,比如我在BCB6中想截获CM_MOUSEENTER消息,用第一种方法就行,用第二种就不行,这是为什么呀?
[解决办法]
BEGIN_MESSAGE_MAP这三种宏展开代码你就会发现,其实只是Dispatch函数的实现而已。
[解决办法]
另外需要补充一下,用消息映射一样可以截获CM_MOUSEENTER和CM_MOUSELEAVE,如下:
.h文件中添加:
private: // User declarations void __fastcall OnMouseEnter(TMessage &Msg); void __fastcall OnMouseLeave(TMessage &Msg); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, OnMouseEnter); MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, OnMouseLeave); END_MESSAGE_MAP(TForm)
[解决办法]
//-----------------------------------
究竟这两种方法有什么本质的区别?因为我发现有些时候用第一种方法好用,有些时候用第二种方法好用,
//------------------------------------
没有本质的区别,只不过用WndProc不小心的话会破坏vcl的消息处理。
//-------------------------------------------
比如我在BCB6中想截获CM_MOUSEENTER消息,用第一种方法就行,用第二种就不行,这是为什么呀?
//-------------------------------------------
帮你试了一下,没有问题:
void __fastcall OnMouseEnter(TMessage &Message)
{
ShowMessage("OnMouseEnter occured");
}
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(CM_MOUSEENTER,TMessage,OnMouseEnter);
END_MESSAGE_MAP(TForm)