我有一个DLL,可以使用以下MFC代码显示对话框窗口:
void ShowMyDialog()
{
BOOL bInitted = SUCCEEDED(::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE));
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
//InitCommonControls(); //Tried also with just this call
AfxEnableControlContainer();
HMODULE hDll = NULL;
if(GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
(LPCWSTR) ShowMyDialog,
&hDll) &&
hDll)
{
AfxSetResourceHandle(hDll);
CMyDialog dl; //Derived from CDialog
dl.DoModal();
}
if(bInitted)
::CoUninitialize();
}
这样可行,但显示的对话框没有启用视觉样式:
我找到了this article关于如何为DLL启用视觉样式的方法。所以我添加了包含建议清单内容的资源文件:
并给它资源ID为123:
但仍然没有雪茄。我在这里缺少什么?
答案 0 :(得分:0)
我认为这不会起作用。当应用程序向导生成项目时,当它包含公共控件6时,它使用类似于此的编译指示:
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
当你在EXE中嵌入了一个清单时,由于它是由清单加载器默认加载的,它必须有一个ID。你有一些其他的ID,所以你没有机会它的工作
我的简单建议是生成测试MFC App Wizard应用程序并从该项目复制#pragma指令。通常,App Wizard会将其放在stdafx.h文件中,但您通常可以将其放在任何所需的源文件中。
另外,作为旁注,在InitInstance()方法中,调用AfxOleInit()而不是在ShowMyDialog()函数中调用CoInitializeEx()。我也将AfxEnableControlContainer()放在InitInsance()中。当然,必须在调用ShowMyDialog()之前。