Vcl Style Utils - 摆脱默认表单图标

Vcl Style Utils - Get rid of default form icon

我已经在 GitHub 上将其作为 an issue on RRUZ's Vcl Style Utils 库发布。不过,我想我也可以在这里得到一些帮助。

我正在使用 VCL 样式创建 Windows 10 用户界面,特别是使用 "Windows 10 Dark" 样式。我还使用 VCL Style Utils 将按钮添加到标题栏中的 non-client 区域。我正试图完全无视表单图标及其默认功能以支持后退按钮,就像大多数新的 Windows 10 应用程序一样。

我正在尝试使用 Vcl.Styles.NC 中的 TNCControls 组件在表单的 upper-left 角落放置一个按钮。但是,当我在窗体的图标上放置一个按钮时,无法在图标区域单击该按钮。虽然我能够重叠图标,但单击标题栏的特定区域总是会打开表单的系统菜单,而不是单击我放置在那里的按钮。

我不希望点击那里时弹出这个菜单:

我目前是如何创建这个按钮的:

procedure TfrmTestMain.SetupTitleBar;
var
  B: TNCButton;
begin
  FNCControls:= TNCControls.Create(Self);
  B:= FNCControls.ButtonsList.Add;
  B.Style := TNCButton.TNCButtonStyle.nsTranparent;
  B.BoundsRect := Rect(0, 0, 45, 32);
  B.UseFontAwesome:= True;
  B.Caption := '';
  B.ImageAlignment:= TImageAlignment.iaCenter;
  B.ImageStyle:= TNCButton.TNCImageStyle.isNormal;
  B.ImageIndex:= fa_chevron_left;
end;

到目前为止我尝试过的:

  1. 用完全空的 .ico 文件替换了表单的图标。

  2. 将表单样式更改为bsSizeToolWin,但标题栏变得太小,我失去了最小化/最大化按钮。

  3. 将表单样式更改为bsDialog,但我得到了与上面#2 相同的效果,而且无法调整表单大小。

  4. 确定按钮样式为nsPushButton,虽然遮住了窗体图标,但点击区域还是点击图标,显示默认系统菜单

  5. 跟随everything in this thread,但结论是Windows强制你有这个图标。

  6. 从表单的BorderIcons属性中删除了biSystemMenu,但这也删除了表单top-right中的默认按钮,迫使我将我自己的系统按钮放在那里。

如何完全消除表单图标及其默认功能以支持我的 Windows 10 样式后退按钮?

TNCControls 组件包括 ShowSystemMenu 属性。如果您将该值设置为 false,则系统菜单将不会显示。

试试这个

uses
 Vcl.Styles.Utils.Graphics;

procedure TfrmTestMain.FormCreate(Sender: TObject);
begin
 SetupTitleBar;
end;

procedure TfrmTestMain.NCClick(Sender: TObject);
begin
  ShowMessage('Hello');
end;

procedure TfrmTestMain.SetupTitleBar;
var
  B: TNCButton;
begin
  FNCControls:= TNCControls.Create(Self);
  FNCControls.ShowSystemMenu := False; //Disable the system menu.

  B := FNCControls.ButtonsList.Add;
  B.Style := TNCButton.TNCButtonStyle.nsTranparent;
  B.BoundsRect := Rect(0, 0, 45, 32);
  B.UseFontAwesome:= True;
  B.Caption := '';
  B.ImageAlignment:= TImageAlignment.iaCenter;
  B.ImageStyle:= TNCButton.TNCImageStyle.isNormal;
  B.ImageIndex:= fa_chevron_left;
  B.OnClick := NCClick;
end;