使用 MessageBox 样式创建 FMX window
Create FMX window with MessageBox style
我有一个问题:如何创建 FMX window 使其看起来像 ShowMessage window?
ShowMessage(包含 Move 和 Close 项):
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.
我有一个问题:如何创建 FMX window 使其看起来像 ShowMessage window?
ShowMessage(包含 Move 和 Close 项):
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.