在VCL组件中如何响应消息?(100分)

  • 主题发起人 主题发起人 xwings
  • 开始时间 开始时间
X

xwings

Unregistered / Unconfirmed
GUEST, unregistred user!
我在写一个组件. 封装一些特定的功能.其中需要获取部分消息. 但是我不知道如何响应.
我知道如何在form中做. 就像 procedure MOVEWMD(var msg:TMEssage) message WM_MOVE;
但是我自己写一个组件如何实现这个功能?
从 tControl继承.还是从TObject继承. 我的组件是非可视的.想响应这个. procedure DisplayChange(var Msg: TMessage); message WM_DISPLAYCHANGE;
我看了vCL的消息机制.还是不太懂.
 
这是一样的,当控件受到WM_DISPLAYCHANGE消息时,自动执行
DisplayChange;
 
黄鱼兄,说的没错!
 
如果你想要windows给你的控件分配一个句柄的话,就从TControl继承。
直接定义你的消息处理函数就行了,也可以覆盖winproc。
 
简单声明一下.
TCallBackWin = class(TwinControl)
private
procedure Paintwin(var Msg:TMessage);message WM_MOVE;
protected
procedure WndProc(var Message: TMessage); override;
end;
------------------------------------------------------------------
在主窗体单元中我室这样用的.
var cb : TCallBackWin;
cb:=TCallBackWin.CreateParented(Self.Handle);
cb.visible:=False;

结果是cb没有受到消息. 奇怪了.无论是winproc 和 Paintwin

但是我直接 postmessage(cb.handle, ...) 就可以的.
请指点一下.
 
在主form中写 procedure werewr(var Msg:TMessage); message WM_DISPLAYCHANGE;
当系统改变的时候可以受到消息.
在我的组件中( 我这次从 TCustomControl 继承的.) 写这个就没有用..
直接向我写的组件句柄postMessage 是可以的.

呜呜...怎么回事.........不懂啊. 有没有人指点一下??
 
WM_MOVE 消息只有在你的控件移动后才会收到
主form移动时, 你的cb并未移动, 当然收不到消息啦。
如果想在你的控件中截取主form的消息, 可以替换主form.windowproc属性。 类型为TWndMethod.
这样主form收到任何消息都会调用你的处理程序了(记得在你程序里要调用主form原来的windowproc哦)
 
基本上懂了. 谢谢.
 
后退
顶部