Delphi无边框和无标题应用程序

Rub*_*der 5 delphi delphi-xe2

我愿意使用以下代码在Delphi XE2中无边界和无标题地设计一个应用程序:

  BorderIcons = []
  BorderStyle = bsNone
Run Code Online (Sandbox Code Playgroud)

但问题是右键单击任务栏上的应用程序没有菜单,就像上图中一样.然后我在FormShow事件上尝试了以下代码,但还有另一个问题.在左侧和左侧B侧创建一个边框.代码是:

procedure TForm1.FormShow(Sender: TObject);
var
  r: TRect;
begin
  r := ClientRect;
  OffsetRect(r, 0, GetSystemMetrics(SM_CYCAPTION));
  OffsetRect(r, GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME));
  SetWindowRgn(Handle,
  CreateRectRgn(
  r.Left, r.Top,
  ClientWidth + r.Left, ClientHeight + r.Top), True);

end;
Run Code Online (Sandbox Code Playgroud)

请帮我.

Dav*_*nan 7

简单的解决方案是不首先删除系统菜单.请注意,系统菜单是应用程序中缺少的菜单的官方名称.

使您的.dfm文件看起来像这样:

BorderIcons = [biSystemMenu]
BorderStyle = bsNone
Run Code Online (Sandbox Code Playgroud)

摆脱那些FormShow代码 - 它不是必需的.

好吧,看起来我的实验中的一些代码混乱让我感到困惑.这是有效的.

完全按照.dfm形式执行的操作:

BorderIcons = []
BorderStyle = bsNone
Run Code Online (Sandbox Code Playgroud)

然后使用CreateParams以下命令添加系统菜单:

TForm1 = class(TForm)
protected
  procedure CreateParams(var Params: TCreateParams); override;
end;
...
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or WS_SYSMENU;
end;
Run Code Online (Sandbox Code Playgroud)


Ser*_*yuz 5

procedure TForm1.FormCreate(Sender: TObject);
begin
  BorderStyle := bsNone;
  SetWindowLong(Handle, GWL_STYLE, 
      WS_POPUP or WS_CLIPSIBLINGS or WS_CLIPCHILDREN or WS_SYSMENU);
  SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_CONTROLPARENT or WS_EX_APPWINDOW);
end;
Run Code Online (Sandbox Code Playgroud)

使用此解决方案,您不需要OnShow处理程序中的代码.

上面的代码可以随时调用OnCreate(不仅仅是在内),它可以用来改变运行表单的行为(例如WS_VISIBLE,如果表单已经可见,则只包括窗口样式).

如果希望行为在表单的生命周期中有效,最好在覆盖中设置标志CreateParams(其中表单样式由VCL应用).这也将考虑到形式的重新创建.不要为此解决方案从OI设置任何表单属性,所有标志都在代码中显式设置:

type
  TForm1 = class(TForm)
    ..
  protected
    procedure CreateParams(var Params: TCreateParams); override;

..

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := WS_POPUP or WS_CLIPSIBLINGS or WS_CLIPCHILDREN or WS_SYSMENU;
  Params.ExStyle := WS_EX_CONTROLPARENT or WS_EX_APPWINDOW;
end;
Run Code Online (Sandbox Code Playgroud)


Mih*_*ela 2

您可以按照David所说的操作和/或查看: SetWindowRgn API。

如果您只使用 SetWindowRgn,则不必删除 TForm 的边框,只需在其下方创建一个矩形即可。