在 Windows 上,ShowMessage() 使用 Win32 API MessageBoxIndirect() 函数显示一个系统对话框。
要自定义标准 FMX 表单的默认系统菜单,您必须下拉到 Win32 API 层并直接操作系统菜单。这意味着获取Form的HWND(可以使用FMX.Platform.Win单元中的FormToHWND()函数),然后使用Win32 API GetMenu()和DeleteMenu()函数。
要删除窗体的图标,请使用 Win32 API SendMessage() 函数发送 HWND WM_SETICON 消息,并将 lParam 设置为 0。或者使用 SetWindowLongPtr() 启用 WS_EX_DLGMODALFRAME 窗口样式.
重写Form的虚拟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.