使用MessageBox样式创建FMX窗口

时间:2017-03-28 13:16:41

标签: windows delphi firemonkey messagebox delphi-10.1-berlin

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

ShowMessage(包含移动关闭项目):

enter image description here

FMX窗口:

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

enter image description here

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

1 个答案:

答案 0 :(得分:3)

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

要自定义标准FMX表单的默认系统菜单,您必须下拉到Win32 API层并直接操作系统菜单。这意味着获取表单的HWND(您可以使用FormToHWND()单元中的FMX.Platform.Win函数),然后使用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.