【问题标题】:"I'm busy please wait" window - no buttons“我很忙,请稍候”窗口 - 没有按钮
【发布时间】:2009-12-18 11:08:56
【问题描述】:

我想弹出一个窗口来显示一个程序正忙于一个特定的耗时任务。但我不想要任何按钮。我只想弹出它,执行任务,然后将其删除。我不确定这样的窗口叫什么,所以不知道在 MSDN 等中搜索什么。是否有一些现成的 API 用于这种事情,或者我需要自己做饭吗?

编辑:回答一些 cmets...

我没有使用 MFC。

这个程序是我自己使用的——答案不必看起来很漂亮。

我不只依赖沙漏的原因是沙漏仅在光标位于应用程序小窗口顶部时显示,并且我在具有四个非常大的显示器的系统上工作并且光标通常不在有问题的窗口.. 如果我没有看到沙漏,那么我的程序看起来像是崩溃了。它相当令人不安。我一直在做这个项目作为我的工作,并且已经这样做了很多年。需要很长时间的操作只是偶尔进行,我可能会几个月不使用它。因此,如果它锁定了执行此任务,我担心我会忘记它只是很忙,并假设存在一些错误并继续疯狂追逐试图解决不存在的问题。

【问题讨论】:

  • 99.9% 'C',0.1% C++(我是新手)。
  • 我不知道你的程序正在做什么,但你的“工作”对话框不应该至少有一个取消按钮吗?

标签: c++ visual-studio winapi


【解决方案1】:

这实际上是一个比简单的对话更深刻的问题。如果您正在从事可能需要很长时间的工作,那么您不希望它出现在主线程上。在 Vista 之前的 Windows 版本上,Window 不会绘制 - 您最终会出现“白窗”综合症,这非常难看。最好创建一个工作线程(非 ui)线程并让它在完成后将消息发回主窗口。显然你必须有某种超时,以防它永远不会完成。如果你这样做,那么“对话框”问题就变成了一个简单的问题,当线程向你发送它的“完成”消息时,只需打开一个窗口并再次将其拉下。您可以尝试查看“无模式对话框”的 MSDN 文档,这是一个您可以随意创建和销毁的对话框(请记住禁用主窗口)。在 MFC 中实现这个有一些缺点,但你没有说你是否在使用它。

【讨论】:

    【解决方案2】:

    为什么???

    公认的 windows 习惯用法是使用沙漏光标。

    一个更好的解决方案是在不同的线程上执行这个长时间运行的任务,让用户继续做其他事情(虽然这可能不适用于你的情况)

    您可以创建一个进度条来向用户显示正在发生的事情,但这些几乎总是有一个取消按钮。用户喜欢能够取消长时间运行的任务。

    正如其他人所发布的,有 CreateWindowEx 函数。但是,我认为您应该在这样做之前多考虑一下您的设计

    【讨论】:

    • 好问题。问题是沙漏仅在光标位于应用程序小窗口顶部时显示,并且我在具有四个非常大的显示器的系统上工作,并且光标通常不在相关窗口上。如果我没有看到沙漏然后我的程序看起来像它崩溃了。这很令人不安。
    【解决方案3】:

    我认为您正在寻找启动画面

    【讨论】:

      【解决方案4】:

      看看CreateWindowEx 函数。您可以使用WS_POPUP 作为dwStyle 来创建一个弹出窗口。 Look here 获取窗口样式列表。

      【讨论】:

        【解决方案5】:

        实际上,由于它是一个微不足道的窗口,您最好自己创建它。您可能只需要处理 WM_PAINT 就可以逃脱惩罚。

        【讨论】:

          【解决方案6】:

          如果您使用 Visual Studio 进行开发,您可以向您的项目添加一个对话框资源。该对话框将仅包含您在问题中指定的文本,没有按钮。不要忘记为对话框分配一个有意义的 ID。如果你不使用 Visual Studio,你仍然可以编写对话框模板(毕竟它只是一个文本文件)并使用在网上随处可见的资源编译器进行编译。

          现在在您的代码中,使用CreateDialog() 函数创建您的对话框,然后使用ShowWindow()。您必须为要重新绘制的对话框设置一个消息循环。有a good set of example in the MSDN

          我要补充一点,您需要一个 modeless 对话框:调用DialogBox() 来创建和显示一个模态对话框将被阻塞,直到该对话框被用户操作关闭,因为您没有按钮对话框它永远不会被关闭,因此调用将无限期阻塞。

          不幸的是,这意味着要编写自己的message loop,并且在处理窗口消息时,您不会运行长时间的计算。所以基本上,我担心您需要在新线程中创建对话框才能获得您描述的行为。

          【讨论】:

            【解决方案7】:

            传统的方法是显示进度指示器,无论是螺旋桨还是沙漏。控制台上可以显示螺旋桨:

            "|"
            "\b/"
            "\b-"
            "\b\\"
            

            只要用户没有响应,就重复。只要计算机一直处于挂起状态,人们就需要进度指示器来显示计算机处于活动状态并且正在处理。

            另一个是心跳:

            "*"
            "\b "
            "\b*"
            

            【讨论】:

              【解决方案8】:

              当您让用户的糟糕机器被占用做其他事情时,为什么要浪费资源显示一个新窗口? - 没有意义。

              坚持更标准的 UI 约定,您的用户会感谢您(嗯,他们不会,但他们可能不会抱怨)。

              【讨论】:

              • 即使是最好的计算机也可能需要大量时间来完成某些任务,但机器不必因为任务花费很多时间而“差”。您还提到了“标准 UI 约定”,但您没有指出任何内容。
              猜你喜欢
              • 2011-08-10
              • 1970-01-01
              • 2013-12-05
              • 1970-01-01
              • 2018-11-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多