如何制作可以映射其他外部控件消息的控件?(100分)

  • 主题发起人 主题发起人 wangxd
  • 开始时间 开始时间
W

wangxd

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个组件,要求当这个组件放到一个form上后,可以对form上的其他控件的消息进行截取或映射。
一般消息映射这样实现:procedure aaa(var msg:message);message wm_xxxxxx;
但这样是对aaa过程所在的组件本身进行消息映射。怎样写aaa过程能够实现对其他组件实现消息映射?
其实我就是想做一个这样的组件,当这个组件放到form上后,就可以对form上所有的edit,memo,button等组件(或我指定的组件)的CM_MOUSEENTER,CM_MOUSELEAVE消息进行截取映射,给他们加上鼠标移入移出事件。
我不想从edit,memo,button组件挨个派生新的组件来对CM_MOUSEENTER,CM_MOUSELEAVE进行截取,如果这样我原来的程序就都要重写了。
估计要用到hook,不知道有没有别的什么办法?
 
大家帮帮忙啊
 
可以研究 TXpMenu VCL 控件。
在此听课。
 
刚才看了 TXpMenu 的实现。简单地说,大致的原理是这样:
1. 设置表单上所有 TControl 对象的 WindowProc 为 XPMenu 自己的消息处理过程。
2. 在 XPMenu 的消息处理过程中跟踪鼠标移动的消息,保存鼠标是否在控件中这一状态。
3. 在 WM_PAINT 消息中处理自己的绘制动作。
你自己看源码吧,不难,只是很麻烦。
 
下个xpmenu看看。
不知道xpmenu在设置表单上的所有 TControl 对象的 WindowProc 后,按理说应该先将原来的每个有 TControl 对象的 WindowProc 保存,以便不破坏原来的WindowProc ,不知道它是怎么保存并恢复的?
 
WindowProc 就是一个 TWndMethod 变量,直接赋值就可以保存了。
 
接受答案了.
 

Similar threads

后退
顶部