一个捕捉消息的问题,对面的高手看过来!(50分)

  • 主题发起人 主题发起人 blizzard
  • 开始时间 开始时间
B

blizzard

Unregistered / Unconfirmed
GUEST, unregistred user!
[:)]代码如下:
protected[:)]
procedure WndProc(var Message : TMessage); override;
..............

procedure TForm1.WndProc(var Message : TMessage);
begin
inherited wndproc(message);
if Message.LParam = Longint(label1) then
begin
if (Message.Msg = CM_MOUSELEAVE) then
label1.Caption:='left';
if (Message.Msg = CM_MOUSEENTER) then
label1.Caption:='entered';
end;
end;
现在的问题是:如果label1的parent为Tpanel而不是Tform,则无法捕获该消息,请问如何处理?
 
如果label1的parent为panel的话,应该是要在tpanel.wndproc 里拦截消息的吧:P[:D]
 
兄弟,把你的代码放到这个 过程里面

//在应用级处理
procedure TForm1.OnAppMessage(var Msg:TMsg;var Handle:Boolean);
begin
[red] //你的代码 [/red]
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:=OnAppMessage;
end;
 
是啊,
对于TLabel这样的TGraphicControl,它的消息是由Parent(TWinControl)的控件来处理的.
 
to iamfly
请问向你说的那样该怎么写呀?能给出详细的代码吗?谢谢!
 
沧海兄说的应该也是可以的:)
我说的很简单啊,把你那个事件改为
procedure Tpanel1.WndProc(var Message : TMessage);
就可以的了:)
不过我没试过,只是理论上应该可以[8D]
 
Why?
TLabel自己带了OnMouseLeave 和 OnMouseEnter居然不够用啊

procedure TCustomLabel.CMMouseEnter(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);
end;

procedure TCustomLabel.CMMouseLeave(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
end;

procedure TControl.CMMouseEnter(var Message: TMessage);
begin
if FParent <> nil then
FParent.Perform(CM_MOUSEENTER, 0, Longint(Self));
end;

从上面的代码我们可以看到,我们截获消息处理,LPARENT一定是其子控件而不能是其孙子,
因为ENTER了孙子就会由其儿子发送给自己是ENTER了儿子.
 
另外可以用局部挂勾(Hook)

在d5中间好象没有procedure TCustomLabel.CMMouseEnter(var Message: TMessage);
procedure TCustomLabel.CMMouseLeave(var Message: TMessage);

当然自己派生一个也比较简单
 
好象沧海 的方法不行,截不到啊
 
接受答案了.
 

Similar threads

后退
顶部