【问题标题】:Main Form on top of modal forms模态表单之上的主表单
【发布时间】:2012-12-03 11:02:43
【问题描述】:

在我面前的 C++ builder 2010 项目中有一个奇怪的场景。每隔一段时间,模态形式似乎就会落后于主要形式。如果我有主窗口,似乎会发生这种情况,使用主窗口上的按钮打开辅助窗口,然后选择主窗口上的一个按钮,该按钮将产生一个模态表单弹出窗口。模态窗体然后在主窗口后面结束,我必须按 Escape 关闭它。

再次打开它会产生所需的结果,模式窗口位于顶部。

一旦完成,主窗口似乎开始将自己置于每个窗口的前面。不仅是它自己的模态窗口或子窗口,甚至还有 Windows Explorer 窗口和其他程序。 更新:每次模态窗口结束在主窗口后面并使用转义关闭时都会发生这种情况。让主窗口再次正常运行的唯一方法是重新启动应用程序。

我已经检查并修改了主窗口和作为初始问题的模式弹出窗口的 FormStylePopupMode 属性。但这似乎没有帮助。 主窗口有

FormStyle: fsNormal
PopupMode: pmNone

由于主窗口开始表现得很奇怪,它感觉好像问题出在主窗口上。我尝试专门告诉模态窗口将主窗口用作其 parent 并尝试 FormStylePopupMode 的所有设置和组合而没有任何更改。

除此之外,据报道所有这些都在 Vista 之前运行(是的,这是一个古老而大型的应用程序......呵呵)

更新: 罪魁祸首似乎是主窗口,它最终位于一切之上。这会导致模态表单最终出现在其后面,并且看起来好像有问题。这只会在第一次发生,重新打开模态窗体会将其绘制在 主窗口 的前面。即使 主窗口 仍然在桌面上的所有其他内容之前。更令人困惑的是,当 主窗口 决定开始这样操作时,感觉非常随意。

【问题讨论】:

    标签: c++ window modal-dialog c++builder


    【解决方案1】:

    问题原来是已知问题与模式形式最终落后于其他形式的组合。谷歌"delphi modal form hidden behind other form"或类似的东西,你会发现很多信息。

    另一个促成因素是已对应用程序进行了解决这些问题的实现。这一点,以及对 Windows 和 VCL 本身的更改都不能很好地发挥作用。所以我去掉了所有“现在”不必要的垃圾,重写了应用程序如何处理它的窗口,问题就解决了。

    【讨论】:

      【解决方案2】:

      我知道这是一个老问题,但我通过将 TApplicationEvent 添加到主窗体并 OnActivate 检查 Screen->ActiveForm 是否有 fsModal 并将其置于前面来解决模态焦点问题:

      void __fastcall TMainForm::ApplicationEvents1Activate(TObject *Sender)
      {
      
         if (Screen->ActiveForm!=NULL)
          {
             TForm *frm=  Screen->ActiveForm;
             if (frm->FormState.Contains(fsModal))
             frm->BringToFront();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多