我有一个问题:如何创建FMX窗口使其看起来像ShowMessage窗口?
ShowMessage(包含移动和关闭项目):
FMX窗口:
BorderIcons := [TBorderIcon.biSystemMenu];
BorderStyle := TFmxFormBorderStyle.Single;
我需要的是:删除图标并删除已禁用的菜单项
答案 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.