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

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

概述我有以下问题:我们正在构建一个相当大的应用程序(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属性完全相同. 总结

以上是内存溢出为你收集整理的delphi – 正确处理模态窗口“最小化”行为全部内容,希望文章能够帮你解决delphi – 正确处理模态窗口“最小化”行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1273451.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存