Delphi: окно перекрытия / заголовок формы? - PullRequest
0 голосов
/ 13 марта 2020

Можно ли перекрывать строку заголовка формы другим элементом управления (TPanel)?

Примерно так:

1 Ответ

0 голосов
/ 14 марта 2020

Как Джерри комментирует , может быть, вы могли бы сделать с формой StayOnTop, на которую вы положили свою панель. Предполагая, что вы проектируете эту панель как элемент управления (возможно, выровненный по левому краю) в вашей основной форме, начало такого решения может выглядеть следующим образом:

uses
  Winapi.Windows, Winapi.Messages, System.Classes, Vcl.Controls, Vcl.Forms,
  Vcl.ExtCtrls;

type
  TMainForm = class(TForm)
    Panel1: TPanel;
  private
    FStickIt: TForm;
  protected
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
    procedure WMWindowPosChanged(var Message: TWMWindowPosChanged);
      message WM_WINDOWPOSCHANGED;
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

{$R *.dfm}

constructor TMainForm.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FStickIt := TForm.CreateNew(Self);
  FStickIt.AutoSize := True;
  FStickIt.BorderStyle := bsNone;
  FStickIt.FormStyle := fsStayOnTop;
  FStickIt.Show;
  Panel1.Align := alCustom;
  Panel1.Parent := FStickIt;
end;

procedure TMainForm.WMSysCommand(var Message: TWMSysCommand);
begin
  inherited;
  case Message.CmdType and $FFF0 of
    SC_MINIMIZE: FStickIt.Hide;
    SC_RESTORE: FStickIt.Show;
  end;
end;

procedure TMainForm.WMWindowPosChanged(var Message: TWMWindowPosChanged);
var
  EdgeSize: Integer;
  TitleBarInfoEx: TTitleBarInfoEx;
begin
  inherited;
  if Assigned(FStickIt) then
  begin
    EdgeSize := (Width - ClientWidth) div 2;
    FStickIt.Left := Left + EdgeSize - BorderWidth;
    FStickIt.Top := Top + GetSystemMetrics(SM_CYBORDER);
    Panel1.Height := Height - EdgeSize - GetSystemMetrics(SM_CYBORDER) +
      BorderWidth;
    TitleBarInfoEx.cbSize := SizeOf(TitleBarInfoEx);
    SendMessage(Handle, WM_GETTITLEBARINFOEX, 0, LPARAM(@TitleBarInfoEx));
    Constraints.MinWidth := Panel1.Width + TitleBarInfoEx.rgrect[5].Right -
      TitleBarInfoEx.rgrect[2].Left + 2 * EdgeSize - 2 * BorderWidth;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...