使用 MessageBox 样式创建 FMX window

Create FMX window with MessageBox style

我有一个问题:如何创建 FMX window 使其看起来像 ShowMessage window?

ShowMessage(包含 MoveClose 项):

FMXwindow:

BorderIcons := [TBorderIcon.biSystemMenu];
BorderStyle := TFmxFormBorderStyle.Single;

我需要的是:删除图标并删除禁用的菜单项

在 Windows 上,ShowMessage() 使用 Win32 API MessageBoxIndirect() 函数显示系统对话框。

要自定义标准FMX窗体的默认系统菜单,必须下拉到Win32 API层,直接操作系统菜单。这意味着获取表单的 HWND(您可以使用 FormToHWND() function in the FMX.Platform.Win unit) and then use the Win32 API GetMenu() and DeleteMenu() 函数。

要删除窗体的图标,请使用 Win32 API SendMessage() function to send the HWND a WM_SETICON 消息并将 lParam 设置为 0。或者使用 SetWindowLongPtr() 启用 WS_EX_DLGMODALFRAME window风格。

覆盖窗体的虚拟CreateHandle()方法来执行这些操作,例如:

interface

...

type
  TForm1 = class(TForm)
    ...
  {$IFDEF MSWINDOWS}
  protected
    procedure CreateHandle; override;
  {$ENDIF}
    ...
  end;

implementation

{$IFDEF MSWINDOWS}
uses
  Windows;
{$ENDIF}

...

{$IFDEF MSWINDOWS}
procedure TForm1.CreateHandle;
var
  Wnd: HWND;     
  Menu: HMENU;
  ExStyle: LONG_PTR;
begin
  inherited;
  Wnd := FormToHWND(Self);

  Menu := GetMenu(Wnd);
  DeleteMenu(Menu, SC_TASKLIST, MF_BYCOMMAND);
  DeleteMenu(Menu, 7, MF_BYPOSITION);
  DeleteMenu(Menu, 5, MF_BYPOSITION);
  DeleteMenu(Menu, SC_MAXIMIZE, MF_BYCOMMAND);
  DeleteMenu(Menu, SC_MINIMIZE, MF_BYCOMMAND);
  DeleteMenu(Menu, SC_SIZE, MF_BYCOMMAND);
  DeleteMenu(Menu, SC_RESTORE, MF_BYCOMMAND);

  SendMessage(Wnd, WM_SETICON, ICON_SMALL, 0);
  SendMessage(Wnd, WM_SETICON, ICON_BIG, 0);

  ExStyle := GetWindowLongPtr(Wnd, GWL_EXSTYLE);
  SetWindowLong(Wnd, GWL_EXSTYLE, ExStyle or WS_EX_DLGMODALFRAME);
  SetWindowPos(Wnd, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER or SWP_FRAMECHANGED);
end;
{$ENDIF}

...

end.