关于自动隐藏的问题,请高手解答(50分)

  • 主题发起人 主题发起人 lovecs
  • 开始时间 开始时间
L

lovecs

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在窗体上放一个panel控件,然后在panel上放置其它控件,
但我想使panel可以在鼠标移出其区域后可以自动的隐藏起来,
我已使panel可以接受鼠标移出事件,但当鼠标移到panel上的
其它控件上时,也会接收到移出事件。
不知有什么好方法可以解决!
 
不知你是如何使得Panel接受鼠标移出事件的???
 
贴出你的代码看看,
 
不要用Panel,自己画一个
 
我只是使用原panel重新生成了一个控件。
自已画很难吧?我是刚开始学,还不会那么高深的东西。
这是在程序中加入的代码:
property Tform1.PanelOnMouseMove
begin
panel.width:=300;

property Tform1.PanelOnMouseLeave
begin
panel.width:=1;
end;
我只是想,当鼠标移出时,panel的宽度是1,当鼠标移入时设为300。但当鼠标移到
panel上的Toolbar上时也会响应PanelOnMouseLeave事件?

这是panel控件的代码

unit Panel1;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, ExtCtrls;

type
TPanel1 = class(TPanel)
private
FOnMouseLeave:TNotifyEvent;
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
property OnMouseLeave:TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Lovecs', [TPanel1]);
end;

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

end.
 
加个判断不就得了,看看他的Parent是不是你的Panel。
 
是否能给出一点点代码?
小弟先谢了
 
按照你的思路,可能很难实现,因为,WINDOWS为了减少重画的范围,将控件背后的部分,都设置为
剪裁区,所以当你将鼠标移动到PANEL上的控件上是,事实上已经不在PANEL上了。可以换个思路,比如使用X,Y坐标来控制
我也没有这方面的经验,只是提醒你换个思路想想。
 
在From的OnMouseMove里写上如下代码即可
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if (X>panel1.Left+panel1.Width ) or (x< panel1.Left )
or (Y>panel1.Top +panel1.Height ) or (Y<panel1.Top ) then
panel1.Visible :=false
else
panel1.Visible :=true;

end;


 
wbcp2000,就是它了!
 
同意wbcp2000的意见,谢谢了
哈楼啊小人物
 
以上的办法不行的!

因为鼠标在控件上移动的时候根本就不触发Form.MouseMove事件。


VB里好象能用如下代码(此处已转化成Delphi代码及语法):
procedure TFormX.ControlXMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
if ControlX.Tag=1 then
if (X<0) or (Y<0) or (X>ControlX.Width) or (Y>ControlX.height) then
begin
ControlX.tag:=0;
ReleaseCapture();
end
else
begin
ControlX.Tag:=1;
SetCapture(ControlX.Handle);
end;
end;

不过Delphi中好象只能通过消息重载来解决:
TFormX = class(TForm)
...
...
procedure ControlXMouseOut(var msg:TMessage);message CM_MouseLeave;

private
...
public
...
end;

procedure TFormX.ControlXMouseOut(var msg:TMessage);
begin
//Do sth.
end;



至于Delphi中如何通过VB的方式来解决我就不知道了,哪位高手知道的话请告知。
 
不用这么麻烦,
使用ApplicationEvents控件。该控件可接受程序运行中的各种消息,并允许对这些消息进行处理。
运用ApplicationEvents控件的OnMessage事件得到当前鼠标的x,y值,判断鼠标是否在该panel上。如不是,则缩小该控件的宽度。
例如:

procedure TFm_Main.Panel1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
Panel1.Width:=200;
end;
procedure TFm_Main.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);//左右隐藏
begin
if (Msg.pt.y<panel1.top) or (Msg.pt.y>(panel1.top+panel1.height then
Panel_Func.width:=2;
end;

明白?
 
后退
顶部