【问题标题】:Delphi resizable form completely remove caption barDelphi 可调整大小的表单完全删除标题栏
【发布时间】:2019-08-06 06:46:34
【问题描述】:

我从仍然需要通过设置调整大小的 VCL 表单中删除标题栏

borderStyle := bsNone;

并覆盖 createParams:

procedure TfrmMain.createParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or WS_THICKFRAME;
end;

这在窗口最大化时工作正常,但在窗口处于正常状态时在客户区上方添加一个小标题栏(在 Windows 10/1903 中)。使用 WS_SIZEBOX 而不是 WS_THICKFRAME 不会改变这一点。

当我省略创建参数覆盖时,附加栏消失了,但表单不再可调整大小。

我使用的是 Delphi 10.3.2 Enterprise。

【问题讨论】:

  • 在这个问题 (stackoverflow.com/a/7677568/3636228) 中接受的答案实际上指向了两个 Delphi 示例,说明如何实现您的愿望,即使最初的问题是针对 C++ 应用程序提出的。我想阅读这些文章可能对你有用。

标签: delphi windows-10


【解决方案1】:

一种可能的解决方案是完全删除边框,然后告诉 Windows 窗口的边缘将被视为调整边框大小。

为此,请将BorderStyle 设置为bsNone 并回复WM_NCHITTEST 消息:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
  private
  protected
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm5 }

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
var
  D: Integer;
  P: TPoint;
begin

  D := GetSystemMetrics(SM_CXSIZEFRAME);

  P := Self.ScreenToClient(Message.Pos);

  if P.Y < D then
  begin
    if P.X < D then
      Message.Result := HTTOPLEFT
    else if P.X > ClientWidth - D then
      Message.Result := HTTOPRIGHT
    else
      Message.Result := HTTOP;
  end
  else if P.Y > ClientHeight - D then
  begin
    if P.X < D then
      Message.Result := HTBOTTOMLEFT
    else if P.X > ClientWidth - D then
      Message.Result := HTBOTTOMRIGHT
    else
      Message.Result := HTBOTTOM;
  end
  else
  begin
    if P.X < D then
      Message.Result := HTLEFT
    else if P.X > ClientWidth - D then
      Message.Result := HTRIGHT
  end;

end;

end.

但是,我不确定这是否可以被视为“最佳做法”。除了明显的副作用之外,我也不确信没有任何不需要的副作用。

和往常一样,当你做“不寻常”的事情时,你应该非常小心。

【讨论】:

    猜你喜欢
    • 2017-12-11
    • 2010-12-22
    • 2011-06-07
    • 2021-12-14
    • 1970-01-01
    • 2012-05-20
    • 2014-04-20
    • 1970-01-01
    • 2016-12-27
    相关资源
    最近更新 更多