“我很忙,请等待”窗口 - 没有按钮

时间:2009-12-18 11:08:56

标签: c++ visual-studio winapi

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

编辑:回答一些评论......

我没有使用MFC。

该程序仅供我自己使用 - 答案不一定非常漂亮。

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

8 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

为什么???

接受的Windows惯用法是使用沙漏光标。

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

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

正如其他人发布的那样,有CreateWindowEx功能。但是,我认为在做这个之前你应该多考虑一下你的设计

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

实际上,由于它是一个如此微不足道的窗口,你可能最好自己创建它。你可能只需要处理WM_PAINT就可以了。没法别的。

答案 5 :(得分:0)

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

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

我将补充说你需要一个无模式对话框:调用DialogBox()创建并显示一个模态对话框将被阻止,直到用户操作解除对话框,因为你没有按钮在你的对话框中,它永远不会被解雇,因此呼叫将无限期地阻止。

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

答案 6 :(得分:0)

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

"|"
"\b/"
"\b-"
"\b\\"
只要没有对用户的回复,

重复。只要计算机悬而未决,人们就希望进度指示器显示计算机处于活动状态并进行处理。

另一个是心脏跳动:

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

答案 7 :(得分:-1)

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

坚持更多标准用户界面会议,您的用户会感谢您(好吧,他们不会,但他们可能不会抱怨)。