问两个问题200分送给大家

VisualCShapDotNet 2006-12-15 04:27:25
>1
一个控件a里面包含有一个TMonthCalendar控件,我想在TMonthCalendar显示时能够显示在最前端,即能够全部显示,现在的问题是有部分被其他控件挡住了(不是控件a),如何使其能够全部显示出来,我用了bringtofront没有效果

>2
如何在鼠标离开TMonthCalendar时TMonthCalendar控件自动隐藏,烦请写句代码
...全文
195 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu_yq 2006-12-16
  • 打赏
  • 举报
回复
控件按先后的顺序放,后放的总是在最前面.
柯本 2006-12-16
  • 打赏
  • 举报
回复
1.我怎么试都不会出现你所说的被其他控件挡住的情况(当然要bring to front),如果不行,你再试试将挡住的控件Send to Back?
2.上面多人说了,隐藏是没问题,不过你要考虑什么条件下恢复
VisualCShapDotNet 2006-12-16
  • 打赏
  • 举报
回复
写段示例好不好,我试了不行
  • 打赏
  • 举报
回复
显示层次的问题,因为不清楚楼主具体情况,无法说。

鼠标移开的时候,想要隐藏这个控件,这个是很容易的。
用逆向思维,在移开的时候,也就是进入其它控件或者窗体的时候,因此,在这个控件四周之外的控件(一个或多个,视实际情况)里写MOUSEOVER事件,在事件里令这个TMonthCalendar隐藏即可。
cloudtarget 2006-12-15
  • 打赏
  • 举报
回复
type
TForm1 = class(TForm)
ScrollBox1: TScrollBox;
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
OldProc:TWndMethod;
procedure NewProc(var Message:TMessage);
procedure ShowPos(X,Y:Integer);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.NewProc(var Message: TMessage);
var
NX,NY:Integer;
begin
if Assigned(OldProc) then
OldProc(Message);
if Message.Msg = WM_MOUSEMOVE then
begin
NX:=Message.LParamLo;
NY:=Message.LParamHi;
ShowPos(NX,NY);
end;
end;

procedure TForm1.ShowPos(X,Y:Integer);
begin
Label1.Caption:=IntToStr(X);
Label2.Caption:=IntToStr(Y);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
OldProc:=Image1.WindowProc;
Image1.WindowProc:=NewProc;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(OldProc) then
Image1.WindowProc:=OldProc;
end;

cloudtarget 2006-12-15
  • 打赏
  • 举报
回复
WindowProc会好点台
wudi_1982 2006-12-15
  • 打赏
  • 举报
回复
关于你的问题1,不清楚现场情况,不好回答,自己多调试调试
wudi_1982 2006-12-15
  • 打赏
  • 举报
回复
如果经常要使用,从TMonthCalendar继承,重写这个组件,处理需要的消息

如果只是偶尔用,用WindowProc

或者想复杂了,做钩子(有点扯淡)

还可以用一个线程轮询,判断鼠标位置,然后处理

下面代码简单演示从TMonthCalendar继承新写一个组件,处理了CM_MOUSELEAVE消息,当鼠标离开后,就隐藏,随便写的,乱
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, AppEvnts, StdCtrls;

type
tdd=class(TMonthCalendar)
private
procedure MouseLevel(var msg : TMessage);message CM_MOUSELEAVE;
end;
TForm1 = class(TForm)
MonthCalendar1: TMonthCalendar;
Edit1: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
mc : tdd;
{ Private declarations }
public

end;


var
Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
mc := tdd.Create(Self);
mc.Parent := Form1;
mc.Left := 100;
mc.Top := 100;

// Application.OnMessage := Mymessage;
end;



{ tdd }

procedure tdd.MouseLevel(var msg: TMessage);
begin

// if msg.Msg = CM_MOUSELEAVE then
Self.Visible := false;;
inherited;
end;


end.
VisualCShapDotNet 2006-12-15
  • 打赏
  • 举报
回复
包含它的容器没有问题,不是控件a,是其他控件

子类中处理mouseleave,如何处理?
jinjazz 2006-12-15
  • 打赏
  • 举报
回复
在子类中处理mouseleave消息
daboby 2006-12-15
  • 打赏
  • 举报
回复
可能包含它的容器小了

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧