如何为简单的win32对话框在任务栏上添加图标?

4
我有一个非常简单的应用程序,它有几个按钮和文本框。 我想为它添加一个图标,因为当它在其他窗口后面运行时,你无法看到它。做到这一点最简单的方法是什么?
我尝试创建了一个隐藏的窗口,但这种方法有些问题,当你点击任务栏图标时,在另一个窗口中会闪烁,并且我似乎无法使其聚焦于对话框。

默认情况下,顶级未拥有的窗口将具有关联的任务栏按钮。您在应用程序中采取了什么措施来阻止这种情况发生? - David Heffernan
我所拥有的是一个基本的WinMain,它调用RegisterClassEx/CreateWindowEx。一旦创建了这个窗口,我就会显示使用VS资源编辑器创建的对话框。我可以让它显示图标,但是单击图标不会最小化/最大化对话框,而是在使用CreateWindowEx创建的窗口上执行该操作。 - allanmb
你需要做的是使用 CreateWindowEx 创建的窗口作为你的应用程序的主窗口。为什么要使用对话框作为主窗口呢?这似乎是问题所在。 - David Heffernan
我只想使用资源编辑器来创建我的GUI。我可以在CreateWindowEx中使用这个窗口吗? - allanmb
我已经添加了一个答案,解释了我对如何解决这个问题的理解。本质上,你需要让对话框成为你应用程序中唯一的顶级窗口。 - David Heffernan
2个回答

6
我认为根本问题在于您有一个隐藏的顶层窗口拥有您的对话框。该对话框作为主窗口运行,但任务栏显示与隐藏窗口相关联的按钮。
因此,我猜您需要完全删除隐藏窗口。这意味着要摆脱“RegisterClass”和“CreateWindow”调用。
我假设您以模式下显示对话框。这种情况下,您使用CreateDialog和ShowWindow来显示它。请特别注意文档中的以下部分:
“CreateDialog返回后,应用程序通过使用ShowWindow函数显示对话框框(如果尚未显示)。应用程序通过使用DestroyWindow函数销毁对话框。为了支持键盘导航和其他对话框功能,对话框的消息循环必须调用IsDialogMessage函数。”
当然,如果您正在以模态方式显示对话框,则可以继续执行该操作。在这种情况下,您的WinMain函数非常简单。只需调用DialogBox即可。不需要消息循环,因为模态对话框的消息循环处理消息。

1
非常感谢,真是太好了!不知为何我一直以为需要使用CreateWindowEx来获取消息循环。我仅仅删除了RegsiterClassEx/CreateWindowEx的代码,并将IsDialogMessage添加到消息循环中,现在全部都正常运行了。我的播放列表创建器现在已经完成了,拥有一个单独的线程,这样GUI始终能保持响应性 :) - allanmb
我很高兴这对您有所帮助。 - David Heffernan
1
@allanmb:如果这个答案解决了你的问题,请考虑接受并点赞,这样其他查看此帖子的人就能更轻松地找到它并受益。最好的问候。 - AlwaysLearningNewStuff

2

您可以将WS_EX_APPWINDOW扩展窗口样式添加到您的对话框中。在这种情况下,即使对话框的所有者/父窗口被隐藏,任务栏应用程序按钮也会显示出来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接