最近的一个疑问,关于BCB中重写窗口的事件解决方法

最近的一个疑问,关于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文件中添加:
C/C++ code
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)