2

我有一个实际上没有主窗体的 winforms 应用程序 - 它只是一个简单的文件处理工具,因此它并不真正需要它。

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

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

通常,当 ShowDialog 导致出现后面的对话框时,解决方案是使用 Showdialog(owner) 调用,除非我没有主窗体可言,我没有要设置的所有者。

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

4

1 回答 1

3

我确切地知道您在说什么,问题实际上在于您的应用程序的设计与 Windows 处理焦点的方式不一致。自 win31 以来,Windows 一直在做这种事情。这就像一场土地掠夺;如果你从你的应用程序中显示一个窗口,然后隐藏/禁用它,你会打盹,根据比尔,你输了。修复:你需要一个主窗口!或切换操作系统。仅仅因为它可以在 EXE 中运行并不意味着当您的一个用户从批处理文件或资源管理器之外的其他文件中启动它时它会起作用。

您可以解决这个问题 - 运行 3 个单独的 exe;尝试在您的子 Main 中运行 3 个 Application.Run 线程;使用 SetTopMost,AppActivate 自己。

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

但是你做错了。重构是有序的,并且会改变未来应用程序的策略。这不是我做出的决定;windows 的工作方式是一成不变的,而用户期望它的工作方式是由数百万个大脑决定的,这比石头还难——顺其自然!

没有实际影响的简单重构:

  • 备份您的项目(或搁置 TFS 中的副本)
  • 在您的选项对话框中,剪切所有控件。放入一个名为 pnlOpts 的表单大小的面板。将它们粘贴回去。
  • 使该表格成为您的主要表格。
  • 在 form_shown 中,设置 pnlOpts.Visible=false,或者只是默认设置(如果你想有点垃圾,你可以显示另一个带有应用程序名称或背景图像的面板;-)
  • 调用也显示该区域的文件 dlg 的设置代码
  • 将您的文件 dlg 设置为将该表单作为父级,将启动位置设置为中心父级(我的意思是所有者而不是父级)。记住从此取消=关闭设置表单
  • 完成后,显示 pnlOpts。
  • 在 OK 按钮中,调用执行进度条的代码。您可以再次在此处隐藏或禁用 pnlOpts。
  • 您在任何时候都不能在整个窗口上隐藏、设置 Visible=false 或 enabled=false,否则您将引发窗口的聚焦愤怒(这是您在这里痛苦的原因)。

这里真正的关键是单行答案:让主窗口始终可见并启用,如果您想禁用其功能,只需灰色或隐藏其所有控件。这是最简单的面板。如果需要,您可以向用户显示其他面板或图像以娱乐他们(特别是如果将 [.enabled=false] 内容变灰没有意义)。

你不会喜欢那样的外观,或者你一开始就会这样构建它,但是数百万行 Windows 代码和数百万 Windows 用户的大脑现在正在被动地积极反对你!

于 2010-06-22T13:54:09.180 回答