使用 ExStyle=WS_EX_APPWINDOW 最小化模态形式



该程序具有主窗体和N个其他窗体,这些窗体是从主窗体创建为模态的。

工作人员同时使用 2 或 3 个显示器(屏幕),因此如果将模态表单放置在另一个屏幕上,他们不希望看到停用的主窗体。

我将 ExStyle=WS_EX_APPWINDOW 添加到所有模态表单,并在创建新模态时隐藏主表单

ActiveModalForm:=TComponentClass(AClass).Create(Application) as TCustomForm;
Hide(); //hides main form
ActiveModalForm.ShowModal; //show new modal window
FreeAndNil(ActiveModalForm); // destroy modal window
Show(); //shows main form

模态形式 CreateParams:

procedure TfrmNewModal.CreateParams(var Params: TCreateParams); 
begin
  inherited CreateParams(Params);
  with Params do
  begin
    WndParent := 0;
    ExStyle := ExStyle OR WS_EX_APPWINDOW;
  end;
end;

问题是,如果用户想要最小化该模态形式,它将最小化并再次显示。

我正在尝试通过以下方式将其最小化:

procedure TfrmNewModal.WMSysCommand(var Msg: TWMSysCommand);
begin
  case (msg.cmdtype and $FFF0) of
    SC_MINIMIZE:
    ShowWindow( handle, SW_MINIMIZE );
    SC_RESTORE:
    ShowWindow( handle, SW_RESTORE )
  else
    inherited;
  end;
end;

我认为问题出在WS_EX_APPWINDOW,但目前我无法想象另一种方式如何在任务栏上显示模态窗口并将其最小化。

有人可以帮忙吗?

谢谢。

Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        Dim _CreateParams As CreateParams = MyBase.CreateParams
        ' WS_EX_COMPOSITED
        ' WS_EX_LAYERED
        _CreateParams.ExStyle = _CreateParams.ExStyle Or &H2000000
        _CreateParams.ExStyle = _CreateParams.ExStyle Or &H80000
        Return _CreateParams
    End Get
End Property
public class VisualBasicClass
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams _CreateParams = base.CreateParams;
            // WS_EX_COMPOSITED
            // WS_EX_LAYERED
            _CreateParams.ExStyle = _CreateParams.ExStyle | 0x2000000;
            _CreateParams.ExStyle = _CreateParams.ExStyle | 0x80000;
            return _CreateParams;
        }
    }
}

最新更新