2010-06-22 52 views
2

我有一个winforms应用程序,它没有真正的主窗体 - 它只是一个简单的文件处理工具,所以它并不真正需要它。没有主窗体的Winforms应用程序 - 对话框顶部没有显示

当应用程序启动时,首先使用OpenFileDialog选择文件。然后,使用Showdialog()显示一个对话框,其中包含一些关于如何处理选定文件的选项。最后,在操作文件时显示进度条表单,并退出应用程序。

问题是,当我从Visual Studio进行调试时,中间窗体不会显示在其他打开的窗口(如Visual Studio本身)之上。当我运行编译的可执行文件,但它似乎工作正常。

通常,当ShowDialog导致后面出现一个对话框时,解决方法是使用Showdialog(所有者)调用,除非我没有主表单来说明我没有所有者组。

那么,如何使对话框在OpenFileDialog自动执行的同样方式下出现在其他窗口之上呢?

+0

“不会显示在其他窗口之上” 您的应用程序或桌面的其他窗口? – 2010-06-22 08:41:13

+0

我的应用程序没有其他窗口。 ShowDialog调用导致出现在Visual Studio后面的对话框 – 2010-06-22 08:53:25

回答

3

我完全知道你在说什么,问题在于你的应用程序的设计与Windows处理焦点的方式不一致。自win31以来,Windows已经完成了这种类型的事情。这就像抢地盘;如果你从你的应用程序中显示一个窗口,然后隐藏/禁用它,你打盹,根据比尔你输了。修复:你需要一个主窗口!或切换操作系统。仅仅因为它在EXE中起作用并不意味着当你的一个用户从批处理文件或其他浏览器中启动它时它就会工作。

你可以拼凑出你的出路 - 运行3个单独的exes;尝试在你的sub Main中的3个Application.Run线程上运行;使用SetTopMost,AppActivate自己。

或查看如何使您的应用程序使用SDK调用来获取输入焦点 - 为了减轻使用它的讨厌应用程序,哪些后续版本的Windows变得困难(因此,可以在w98中执行此操作的应用程序将闪烁任务栏xp中的橙色) - 然后程序员已经解决了这个问题。你可以做到这一点。

但你会做错了。重构是有序的,并为未来的应用程序改变策略。这不是我做出的决定;窗户的工作方式是坚如磐石的,加上用户期望它的工作方式是在数百万的大脑中设置的,这些大脑比石头更硬 - 与水流共同游泳!

易于重构,没有真正的影响:

  • 备份您的项目(或在TFS搁置复印件)
  • 在选项对话框,切断所有控件。放入名为pnlOpts的表单大小的面板。粘贴回来。
  • 使其成为您的主要形式。
  • 在form_shown,设置pnlOpts.Visible = false,或者只是默认这种方式(可以显示其他面板瓦特/应用程序名称或背景图片,如果你想成为一个有点没用;-)
  • 呼叫该设置代码还显示该区域的文件dlg
  • 设置您的文件dlg,将父表格的起始位置设置为中心父级(我的意思是所有者不是父级)。请记住取消此设置=关闭设置表
  • 完成后,显示pnlOpts。
  • 在确定按钮中,调用进度条的代码。您可以再次隐藏或禁用pnlOpts。
  • 在任何时候,你都不能在整个窗口中隐藏,设置Visible = false或enabled = false,否则你将调用窗口的聚焦愤怒(这是你痛苦的原因)。

这里真正的关键,单行答案:离开主窗口可见并启用在任何时候,如果你想禁用它的功能,只是灰色或隐藏所有的控制。这是最容易做的面板。如果需要,您可以向用户显示其他面板或图像以招待他们(特别是如果灰色[.enabled = false]内容无意义)。

你不会喜欢那种看起来那样的方式,或者你已经像这样开始构建它,但是数百万行windows代码和数百万windows用户的大脑现在对你的消极态度不以为然!

+0

另一种方式是将其作为控制台应用程序,并将控制台用于其他对象的父级。这会更容易,但更不令人讨厌。您可能已经想到可能会有一个小的主窗口总是挂在背景中的概念。另一个添加到列表中的黑客应该这样做,并将其从屏幕外移到:>)但是Windows 8会检查并惩罚你。 – FastAl 2010-06-22 13:58:29

+0

感叹。重构。 – 2010-06-22 16:36:03

+0

我知道,我知道......我曾多次被窗户打过浆。现在我的表现就像一个很好的小球,然后一起玩。叹。 – FastAl 2010-06-22 16:38:06