模态形式之上的主形式
Main Form on top of modal forms
在我面前的C++builder 2010项目中,我遇到了一个奇怪的场景。每隔一段时间,模态表单似乎都会出现在主表单后面。如果我有主窗口,使用主窗口上的按钮打开一个辅助窗口,然后选择主窗口上会产生模态表单弹出窗口的按钮,就会出现这种情况。模态表单最后出现在主窗口后面,我必须按下escape来关闭它
再次打开它会产生所需的结果,模态窗口位于顶部。
有时,一旦完成了这项工作,主窗口似乎开始将自己放在每个窗口的前面。不仅是它自己的模态或子窗口,甚至是windows资源管理器窗口和其他程序Update:每当模式窗口出现在主窗口后面并使用escape关闭时,就会发生这种情况。让主窗口恢复正常运行的唯一方法是重新启动应用程序
我检查并篡改了主窗口和模式弹出窗口的FormStyle和PopupMode属性,这是最初的问题。但这似乎没有帮助。主窗口有
FormStyle: fsNormal
PopupMode: pmNone
由于主窗口开始表现得很奇怪,感觉好像问题出在主窗口上。我试着特别告诉模式窗口使用主窗口作为其父窗口,并尝试FormStyle和PopupMode的所有设置和组合,但没有任何更改。
除此之外,据报道,所有这些都在Vista之前工作过(是的,这是一个旧的大型应用程序…呵呵)
更新:罪魁祸首似乎是最终位于所有内容之上的主窗口。这导致模态形式最终落在它后面,看起来好像有什么问题。这种情况只发生在第一次,重新打开模态窗体会将其绘制在主窗口的前面。即使主窗口仍然位于桌面上的所有其他窗口之前。更令人困惑的是,当主窗口决定开始这样做时,感觉非常随机。
这个问题是已知问题的组合,模态形式最终落后于其他形式。谷歌"delphi modal form hidden behind other form"
或类似的东西,你会发现很多信息。
另一个促成因素是,已经对申请进行了抵消这些问题的实施。这一点,加上Windows和VCL本身的变化,并没有很好地发挥作用。因此,我去掉了所有"现在"不必要的垃圾,并重写了应用程序如何处理窗口,问题得到了解决。
我知道这是一个老问题,但我通过将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();
}
}
- 如何在QT中制作模态QProgressDialog?
- 如何让 QInputDialog 更少模态?
- cdhtmldialog-使其模态
- Qt - 创建主窗口前的非模态对话框
- 如何正确使用异常处理IWTH模态对话框
- 如何使用Ifileopendialog打开 *模态 *文件对话框
- 模态qprogressdialog :: setValue()导致嵌套事件循环崩溃
- 捕获新创建的模态对话框的窗口句柄
- 模态形式之上的主形式
- QT在菜单项上显示模态对话框(.UI)单击
- 如何将QMainWindow设置为模态
- Qt中的多模态窗口
- 正在从Script/osx 10.7+/safari/automatior/objective-c中删除模态
- 自动对焦QLineEdit在QDialog与弹出标志和模态在主窗口
- VC6中的多模态对话框
- 当用户尝试激活主窗口时引发模态QDialog
- 如何使非模态对话框始终在应用程序的顶部
- 非模态对话框窗口的良好设计是什么?
- 从通过模态WinForms调用的C++调用IConnectionPointImpl接口时出现问题
- MFC模态对话框的怪异行为