>1
一个控件a里面包含有一个TMonthCalendar控件,我想在TMonthCalendar显示时能够显示在最前端,即能够全部显示,现在的问题是有部分被其他控件挡住了(不是控件a),如何使其能够全部显示出来,我用了bringtofront没有效果>2
如何在鼠标离开TMonthCalendar时TMonthCalendar控件自动隐藏,烦请写句代码

解决方案 »

  1.   

    包含它的容器没有问题,不是控件a,是其他控件子类中处理mouseleave,如何处理?
      

  2.   

    如果经常要使用,从TMonthCalendar继承,重写这个组件,处理需要的消息如果只是偶尔用,用WindowProc或者想复杂了,做钩子(有点扯淡)还可以用一个线程轮询,判断鼠标位置,然后处理下面代码简单演示从TMonthCalendar继承新写一个组件,处理了CM_MOUSELEAVE消息,当鼠标离开后,就隐藏,随便写的,乱
    unit Unit1;interfaceuses
      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.
      

  3.   

    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;
      

  4.   

    显示层次的问题,因为不清楚楼主具体情况,无法说。鼠标移开的时候,想要隐藏这个控件,这个是很容易的。
    用逆向思维,在移开的时候,也就是进入其它控件或者窗体的时候,因此,在这个控件四周之外的控件(一个或多个,视实际情况)里写MOUSEOVER事件,在事件里令这个TMonthCalendar隐藏即可。
      

  5.   

    1.我怎么试都不会出现你所说的被其他控件挡住的情况(当然要bring to front),如果不行,你再试试将挡住的控件Send  to Back?
    2.上面多人说了,隐藏是没问题,不过你要考虑什么条件下恢复