在当前的设计中,您有一个用于最小化窗口的任务栏按钮,该窗口由于模式窗体而被禁用。我不认为你将能够为这个设置制定出一个合理的解决方案,两个表单都没有收到一个
WM_SYSCOMMAND
-模态窗体,因为它没有任务栏按钮和主窗体,因为它是禁用的。
在最小化模式窗体时,请更改策略并切换任务栏按钮。也就是说,您将有一个任务栏按钮用于模式窗体,而不是主窗体。然后,当您收到restore命令时,可以在同一事件处理程序中截获和反转。下面是一个工作示例,但我应该注意到,在创建窗口后更改窗口的所有者是非常不鼓励的,事实上,在相当长的一段时间内没有任何文档记录。
type
TModalDlg = class(TForm)
...
private
FParentWnd: HWND;
protected
procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
end;
...
procedure TModalDlg.WMSysCommand(var Msg: TWMSysCommand);
begin
if (fsModal in FormState) then begin
case Msg.CmdType and $FFF0 of
SC_MINIMIZE:
begin
SetWindowLong(Handle, GWL_EXSTYLE,
(GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW));
FParentWnd := GetWindowLong(Handle, GWL_HWNDPARENT);
if FParentWnd <> 0 then
ShowWindow(FParentWnd, SW_HIDE);
SetWindowLong(Handle, GWL_HWNDPARENT, 0);
end;
SC_RESTORE:
begin
SetWindowLong(Handle, GWL_EXSTYLE,
(GetWindowLong(Handle, GWL_EXSTYLE) and not WS_EX_APPWINDOW));
if FParentWnd <> 0 then begin
SetWindowLong(Handle, GWL_HWNDPARENT, FParentWnd);
ShowWindow(FParentWnd, SW_SHOW);
end;
end;
end;
end;
inherited;
end;