如何在从DLL创建的CDialog中的常用控件上启用视觉样式?

时间:2017-01-18 03:17:23

标签: c++ winapi dll mfc common-controls

我有一个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();
}

这样可行,但显示的对话框没有启用视觉样式:

enter image description here

我找到了this article关于如何为DLL启用视觉样式的方法。所以我添加了包含建议清单内容的资源文件:

enter image description here

并给它资源ID为123:

enter image description here

但仍然没有雪茄。我在这里缺少什么?

1 个答案:

答案 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()之前。