繁体   English   中英

“我很忙,请稍候”窗口-没有按钮

[英]“I'm busy please wait” window - no buttons

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

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

我没有使用MFC。

该程序供我自己使用-答案不必看起来很漂亮。

我不仅仅依赖沙漏的原因是,沙漏仅在光标位于应用程序小窗口顶部时显示,并且我在具有四个非常大的监视器的系统上工作,而光标通常不在沙漏窗口中问题..如果我看不到沙漏,那么我的程序看起来像崩溃了。 它相当令人不安。 我一直在从事此程序的工作,并且已经从事了很多年。 耗时较长的操作仅偶尔执行,可能不使用它会花费数月。 因此,如果它锁定执行此任务,我担心我会忘记它只是很忙,并假设存在一些错误,然后继续大肆追赶,尝试解决不存在的问题。

这实际上是比简单对话更为深刻的问题。 如果您从事的工作可能会花费很长时间,那么您不希望它出现在主线程上。 在Vista之前的Windows版本上,Window不会绘制-您最终会遇到“白窗”综合症,这非常丑陋。 创建一个工作线程(非ui线程)好得多,并在完成后将消息发布回主窗口。 显然,您必须进行某种超时,以防它永远不会结束。 如果以这种方式进行操作,那么“对话”问题就变成了一个简单的问题,那就是在线程向您发送其“完成”消息时,简单地设置一个窗口并再次将其拉下。 您可以尝试查看MSDN文档中的“无模式对话框”,该对话框可以随意创建和销毁(记住禁用主窗口)。 在MFC中实现此功能有些困难,但是您没有说是否在使用它。

为什么???

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

更好的解决方案是在另一个线程上执行此长期运行的任务,并让用户继续执行其他操作(但这可能不适用于您的情况)

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

正如其他人所发表的那样,这里有CreateWindowEx函数。 但是,我认为您应该先考虑一下自己的设计

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

看一下CreateWindowEx函数。 您可以将WS_POPUP用作dwStyle来创建弹出窗口。 在此处查看窗口样式列表。

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

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

现在在您的代码中,使用CreateDialog()函数创建对话框,然后使用ShowWindow() 您将必须设置一个消息循环,才能重新绘制对话框。 MSDN中有很多很好的例子

我将添加您需要一个无模式对话框:调用DialogBox()创建和显示模式对话框将一直阻塞,直到该对话框被用户操作关闭为止,因为您的对话框上没有按钮,因此它将永远不会被关闭,因此该调用将无限期封锁。

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

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

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

只要没有对用户的响应就重复一次。 只要计算机处于挂起状态,人们就需要进度指示器来表明计算机正在运行并正在处理。

另一个是心脏跳动:

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

当您将用户的可怜的机器捆绑在一起做其他事情时,为什么浪费资源显示一个新窗口 -没有道理。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM