2009-12-18 23 views
0

我想弹出一个窗口来显示某个程序忙于执行特定的耗时任务。但我不想要任何按钮。我只想弹出它,完成任务,然后删除它。我不确定这样的窗口被称为什么,所以不知道在MSDN中搜索什么等等。是否有一些现成的API用于这种事情,还是我需要自己做饭?“我很忙请等待”窗口 - 没有按钮

编辑:在回答一些评论...我不使用MFC

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

我不只是依赖沙漏的原因是沙漏只在光标位于应用程序小窗口顶部时显示,而且我使用四个非常大的监视器工作,并且光标通常不是在问题的窗口..如果我没有看到一个沙漏,那么我的程序看起来像它的崩溃。它非常令人不安。作为我的工作,我一直致力于这个计划,并且已经这么做了很多年。需要很长时间的操作只是偶尔执行,我可能会花数个月不使用它。所以如果它锁定了这个任务,我担心我会忘记它只是忙碌,并假设有一些错误,并试图解决一个不存在的问题。

+0

99.9% 'C',0.1%C++(我是新的)。 – Mick 2009-12-18 11:15:56

+0

我不知道你的程序在做什么,但是你的“工作”对话框不应该至少有一个取消按钮? – 2009-12-18 17:04:16

回答

4

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

1

我认为你正在寻找闪屏

0

实际上,因为它是这样一个平凡的窗口,你可能最好自己创造它的。你可能只能处理WM_PAINT而没有别的。

2

为什么?

接受的窗口习语是使用沙漏光标。

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

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

正如其他人所发布的,还有的CreateWindowEx功能。不过,我觉得你应该考虑一些你们的设计这样

+0

好问题。事情是只有当光标位于应用程序小窗口顶部时,才会显示沙漏,而且我使用四个非常大的监视器工作,并且光标通常不在窗口中。如果我没有看到沙漏然后我的程序看起来像它的坠毁。它非常令人不安。 – Mick 2009-12-18 11:29:04

+0

请参阅编辑原始文章。 – Mick 2009-12-18 11:44:25

-1

为什么浪费资源显示一个新的窗口,当你有用户的穷人机绑做其他的东西? - 没有意义。

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

+1

即使是最好的电脑也可能需要大量的时间来完成某些任务,因为这项任务需要很长时间,所以机器不一定非常“不好”。你也提到“标准的UI约定”,但你指的不是。 – 2009-12-18 13:13:38

0

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

现在在你的代码,使用CreateDialog()函数来创建对话框,然后ShowWindow()。你将不得不为重新设置的对话框设置一个消息循环。有a good set of example in the MSDN

我会添加你需要一个无模式对话:打电话DialogBox()创建和显示一个模式对话框会阻塞,直到对话框通过用户操作被驳回,因为你有你的对话框没有按钮,它永远不会被解雇,所以通话将无限期阻止。

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

0

传统的方法是,以显示一个进度指示器,无论是螺旋桨或沙漏。只要不存在对用户没有响应

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

重复:螺旋桨可被显示在控制台上。只要计算机悬挂起来,人们就想要进度指示器来显示计算机处于活动状态并处理。

另一个是心脏的跳动:

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