MFC 对话框显示在任务栏中
Posted
技术标签:
【中文标题】MFC 对话框显示在任务栏中【英文标题】:MFC dialog shows in task bar 【发布时间】:2018-08-20 13:28:15 【问题描述】:我有一个使用来自两个 DLL 的对话框的应用程序。两个 DLL 中的对话框代码几乎相同:
-
两个对话框在 RC 文件中具有相同的样式:
DS_SETFONT |
DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
。
两个对话框都使用ShowWindow(SW_SHOW)
显示。
这两个对话框都是按需创建的,而不是在应用程序启动时创建的。
两个对话框都有一个 NULL 父级。
两个对话框都继承自 CDialog。
唯一的区别是:
-
在对话框 A 中,
AFX_MANAGE_STATE()
在对话框构造函数之前调用,而对话框 B 在构造函数的开头调用。
我认为这些差异中的任何一个都不会产生任何影响,但是,当我显示对话框时,对话框 A 在任务栏和对话框 B 中没有图标,此外,将主窗口带到front 将对话框 A 置于最前面(反之亦然),而对话框 B 则独立运行。
我想让对话框 B 的行为类似于对话框 A。谁能告诉我为什么存在这种行为差异以及如何解决它以使对话框 B 的行为与 A 相同?
我知道您会喜欢示例代码,但这需要一些时间(我没有)来制作。现有的代码都是公司商业的,也是一个巨大的应用程序,从中提取关键部分确实非常困难。
** 更新 **
如果我在调用AFX_MANAGE_STATE()
之前在对话框B 的委托人中调用::AfxGetMainWnd()
,我可以获得指向主窗口指针的指针。耶!当我将它传递给Create()
时,程序崩溃了。嘘!
看起来我无法将主窗口设置为对话框 B 的所有者,我认为这可以解决我的问题,大概是因为对话框 B 在 DLL 中。我不明白为什么这适用于对话 A。
【问题讨论】:
要诊断您的问题,您需要了解什么是“模块”以及MFC module state implementation 的工作原理。您提出的答案没有解决真正的问题。 如果将此评论附加到我的答案而不是问题可能会更好。我读了那篇文章,现在并不比以前聪明。它没有说明任何类型的窗口,也没有说明为什么需要有一个 CWinApp 实例才能使主应用程序正确拥有 DLL 对话框。我猜当您在 DLL 中实例化 CWinApp 时,它会识别属于主应用程序进程的单例应用程序对象并将其自身连接到该对象,然后创建的所有对话框在创建时在当前模块中查找 CWinApp 并将其设置为所有者。 因此对话框不需要任务栏图标,当您将主应用程序窗口置于最前面时,对话框窗口也会出现在最前面。您认为我的回答没有解决的“真正”问题是什么?据我从调查中可以看出,对话框在当前模块上下文中没有任何父级,并且根据我的回答添加一个 CWinApp 实例可以解决这个问题。 【参考方案1】:实现对话框 A 的 DLL 实例化了 CWinApp 的一个实例。实现对话框 B 的 DLL 没有。
要解决此问题,只需将以下行添加到 CPP 文件,可能是独立的“the_app.cpp”文件:
CWinApp dummy;
即“the_app.cpp”:
#include "stdafx.h"
CWinApp dummy;
【讨论】:
能否请您发布一个“正确”的答案以及否决票,拜托。我很欣赏你上面的评论(期待它在这里 TBH 并没有;一开始没看到)。 最简单的解决方案是调用AfxGetMainWnd 并将其作为所有者传递给您的对话框。CWinApp
是一个单身人士。在单个应用程序中创建它的多个副本会导致不可预知的破坏。
没有 遗憾的是,我超出了允许我纠正错别字的五分钟时间范围。
谢谢,IInspectable。可悲的是我试过了。在当前模块上下文中调用它会返回一个 NULL 指针,并且如问题中所述,在 AFX_MANAGE_STATE()
之前调用它以获取非空指针,然后在上下文中使用它(以便对话框的 ID 与 DLL 的资源文件匹配) 导致崩溃。
您需要创建一个extension DLL。请参阅kinds of DLLs 了解概述和指南以决定您需要哪种 DLL。以上是关于MFC 对话框显示在任务栏中的主要内容,如果未能解决你的问题,请参考以下文章
如图,VS2017新建MFC对话框之后,工具箱控件不可用怎么办?