首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

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

2012-02-27 
最近的一个疑问,关于BCB中重写窗口的事件发现BCB中重写窗口的事件有两种方法,一种是重写WndProc()函数,然

最近的一个疑问,关于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)









热点排行