⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 autohide.pas

📁 delphi 源码程序下载是第一个delphi程序
💻 PAS
字号:
unit AutoHide;

interface

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

type
  TAutoHider = class(TObject)
  protected
    procedure DelphiOnMessage(var Msg: TMsg; var Handled: Boolean);
    procedure MyDockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer);
    procedure MyDestroy(Sender: TObject);
  public
    OldDockDrop: TDockDropEvent;
    OldDestroy: TNotifyEvent;

    Delphi: TApplication;
    Bar_Top: TForm;
    Bar_Left: TForm;
    ObjInspector: TForm;
    DockHost: TForm;

    Bar_Top_Rect: TRect;
    Bar_Left_Rect: TRect;

    F_AtTop: Boolean;
    F_AtLeft: Boolean;

    procedure Init_Bar_Left;
    procedure Bar_Left_Visible(val: Boolean);
    procedure Bar_Top_Visible(Value: Boolean);
  end;

var
  AutoHider: TAutoHider;

implementation

{ TAutoHide }

procedure Restore_Bar_Left;
begin
  AutoHider.ObjInspector.OnDockDrop := nil;

  if AutoHider.DockHost <> nil then 
  begin
    AutoHider.DockHost.OnDestroy := nil;
  end;
  AutoHider.Bar_Left.BoundsRect := AutoHider.Bar_Left_Rect;
end;

procedure Restore_Bar_Top;
begin
  AutoHider.Bar_Top.BoundsRect := AutoHider.Bar_Top_Rect;
end;

procedure InitAutoHider(Value: Boolean);
begin
  if Value then 
  begin
    AutoHider.Delphi  := Application;
    AutoHider.Bar_Top := TForm(Application.FindComponent('AppBuilder'));
    if AutoHider.Bar_Top <> nil then 
    begin
      AutoHider.Bar_Top_Rect := AutoHider.Bar_Top.BoundsRect;

      AutoHider.ObjInspector  := AutoHider.Bar_Top.FindComponent('PropertyInspector')
        as TForm;
      AutoHider.Bar_Left_Rect := AutoHider.ObjInspector.BoundsRect;

      AutoHider.OldDockDrop := AutoHider.ObjInspector.OnDockDrop;
      AutoHider.ObjInspector.OnDockDrop := AutoHider.MyDockDrop;

      AutoHider.DockHost := nil;
      AutoHider.Init_Bar_Left;

      AutoHider.F_AtTop          := True;
      AutoHider.F_AtLeft         := True;
      AutoHider.Delphi.OnMessage := AutoHider.DelphiOnMessage;
    end;
  end 
  else 
  begin
    Restore_Bar_Left;
    Restore_Bar_Top;
  end;
end;

procedure TAutoHider.Bar_Top_Visible(Value: Boolean);
begin
  if Value = F_AtTop then Exit;

  if Value then 
  begin
    Bar_Top.Top := 0;
    Bar_Top.Show;
  end 
  else 
  begin
    Bar_Top.Top := -Bar_Top.Height + 3;
  end;

  F_AtTop := Value;
end;

procedure TAutoHider.Bar_Left_Visible(val: Boolean);
begin
  if val = F_AtLeft then Exit;

  if val then 
  begin
    Bar_Left.Left   := 0;
    Bar_Left.Top    := 0;
    Bar_Left.Height := Screen.WorkAreaHeight;
    Bar_Left.Show;
  end 
  else 
  begin
    Bar_Left.Left := -Bar_Left.Width + 3;
  end;

  F_AtLeft := val;
end;

procedure TAutoHider.DelphiOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if not Delphi.Active then Exit;
  if (Msg.message = WM_LBUTTONDOWN) then Exit;

  if (Msg.message = WM_MOUSEMOVE) or (Msg.message = WM_NCMOUSEMOVE) then 
  begin
    if F_AtTop then
      if Mouse.CursorPos.Y > Bar_Top.Height + 50 then 
      begin
        Bar_Top_Visible(False);
      end;
    if not F_AtTop then
      if Mouse.CursorPos.Y < 3 then 
      begin
        Bar_Top_Visible(True);
      end;

    if F_AtLeft then
      if (Mouse.CursorPos.x > Bar_Left.Width + 50) and (not Bar_left.Active) then 
      begin
        Bar_Left_Visible(False);
      end;
    if not F_AtLeft then
      if Mouse.CursorPos.X < 3 then 
      begin
        Bar_Left_Visible(True);
      end;
  end;
end;

procedure TAutoHider.MyDestroy(Sender: TObject);
begin
  if Sender is TApplication then 
  begin
    Bar_Top_Visible(False);
    Bar_Left_Visible(False);
  end 
  else 
  begin
    if Assigned(OldDestroy) then OldDestroy(Sender);
    DockHost := nil;
    Bar_Left := ObjInspector;
  end;
end;

procedure TAutoHider.Init_Bar_Left;
begin
  if (Delphi.FindComponent('TabDockHostForm') as TForm) <> nil then
    DockHost := Delphi.FindComponent('TabDockHostForm') as TForm
  else if (Delphi.FindComponent('JoinDockForm') as TForm) <> nil then
    DockHost := Delphi.FindComponent('JoinDockForm') as TForm;

  if DockHost <> nil then 
  begin
    DockHost.Top       := 0;
    DockHost.Height    := Screen.WorkAreaHeight;
    OldDestroy         := DockHost.OnDestroy;
    DockHost.OnDestroy := MyDestroy;
    Bar_Left           := DockHost;
  end 
  else 
  begin
    Bar_Left := ObjInspector;
  end;
end;

procedure TAutoHider.MyDockDrop(Sender: TObject; Source: TDragDockObject; X,
  Y: Integer);
begin
  if Assigned(OldDockDrop) then  OldDockDrop(Sender, Source, X, Y);
  Init_Bar_Left;
end;

initialization
  AutoHider := TAutoHider.Create;
  InitAutoHider(True);

finalization
  InitAutoHider(False);
  AutoHider.Delphi.OnMessage := nil;
  AutoHider.Free;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -