加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 正确处理模态窗口“最小化”行为

发布时间:2020-12-15 09:51:13 所属栏目:大数据 来源:网络整理
导读:我有以下问题:我们正在构建一个相当大的应用程序(win32,Delphi 6 Enterprise).在应用程序的几个部分中,使用模态窗口,通常包含主窗口选择的细节. 我们包含了对WM_SYSCOMMAND消息处理的修改,这样,如果窗口是模态的,那么SW_SHOWMINNOACTIVE消息将被发送到应用
我有以下问题:我们正在构建一个相当大的应用程序(win32,Delphi 6 Enterprise).在应用程序的几个部分中,使用模态窗口,通常包含主窗口选择的细节.

我们包含了对WM_SYSCOMMAND消息处理的修改,这样,如果窗口是模态的,那么SW_SHOWMINNOACTIVE消息将被发送到应用程序的主窗口.这导致整个应用程序被最小化而不仅仅是模态形式.

但是,在特定情况下会出现问题:如果调用窗口设置为全屏,则在恢复时,模式窗口将显示在(禁用)最大化主窗口下(这似乎发生在Windows 7上)

我的问题有两个问题:

首先,当应用程序恢复时,我似乎没有得到任何syscommand消息,因此我无法引入代码来恢复Z-Order,因为我不知道在哪里放置它.
其次,在我看来,如果整个应用程序被最小化,单击任务栏中的应用程序按钮应该以相同的状态恢复它,而不是在它下面的模式窗口.有办法解决这个问题吗?

编辑:我们做了一些额外的测试,似乎我们实际上可以在WM_ACTIVATE处理程序中检测主窗体的问题.我们还可以在该阶段识别模态窗口.但是,我无法找到将其恢复到Z-Order顶部的方法.

Edit2:这是最小化模态形式时最小化应用程序的代码:

procedure TfmGITForm.WMSysCommand(var Message: TWMSysCommand);
begin
  if (fsModal in FormState) or
      not Application.MainForm.Visible then
  begin
    case Message.CmdType of
      SC_MINIMIZE:
      begin
        ShowWindow(Application.Handle,SW_SHOWMINNOACTIVE);
      end;
      SC_RESTORE:
      begin
        ShowWindow(Application.Handle,SW_SHOWNORMAL);
        inherited;
      end;
    else
      inherited;
    end;    // case
  end
  else
    inherited;
end;

我们所有的形式都来自那个.

解决方法

覆盖对话框的CreateParams函数并将Params.WndParent设置为全屏窗口(如果您正确拥有东西,则设置为Owner.Handle).默认值为Application.Handle,这将导致这些类型的问题.在后面的Delphi版本中引入的PopupParent属性完全相同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读