1

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

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

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

我已经检查并摆弄了主窗口和模式弹出窗口的 F ​​ormStylePopupMode属性,这是最初的问题。但这似乎没有帮助。主窗口有

FormStyle: fsNormal
PopupMode: pmNone

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

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

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

4

2 回答 2

0

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

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

于 2012-12-06T10:29:39.217 回答
0

我知道这是一个老问题,但我通过将 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();
    }
}
于 2015-06-15T05:16:14.740 回答