我有一个使用来自两个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 中没有图标,此外,将主窗口放在前面会将对话框 A 带到前面(反之亦然(,而对话框 B 的行为是独立的。
我想使对话框 B 的行为类似于对话框 A。谁能告诉我为什么存在这种行为差异以及如何修复它以使对话框 B 的行为与 A 相同?
我知道你会喜欢示例代码,但这需要一些时间(我没有(来制作。现有的代码都是公司商业代码,也是一个巨大的应用程序,从中提取关键部分确实非常困难。
**更新** 如果我在调用AFX_MANAGE_STATE()
之前在对话框 B 的委托人中调用::AfxGetMainWnd()
,我可以得到一个指向主窗口指针的指针。耶!当我把它传递给Create()
时,程序崩溃了。喝倒彩!
看起来我无法将主窗口设置为对话框 B 的所有者,我认为这可以解决我的问题,大概是因为对话框 B 在 DLL 中。我不明白的是为什么这适用于对话框 A。
实现对话框 A 的 DLL 实例化 CWinApp 的实例。实现对话框 B 的 DLL 没有。
要解决此问题,只需将以下行添加到 CPP 文件,可能是独立的"the_app.cpp"文件:
CWinApp dummy;
即"the_app.cpp":
#include "stdafx.h"
CWinApp dummy;