У меня есть DLL, которая может отображать диалоговое окно с помощью следующего кода MFC:Как включить визуальные стили для общих элементов управления в CDialog, созданных из DLL?
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();
}
Это работает, но диалоговое окно, показанное не визуальные стили включен:
I найдено this article о том, как включить визуальные стили для библиотеки DLL. Поэтому я добавил файл ресурсов с предложенным манифеста содержания:
и дал ему идентификатор ресурса 123:
Но до сих пор нет сигару. Что мне здесь не хватает?
Идентификатор ресурса 123 относится к разделу «Использование ComCtl32 версии 6 в панели управления или DLL, выполняемая RunDll32.exe». Является ли эта DLL страницей на панели управления? Если это так, то 123 необходимо, а что-то еще не так. Если это DLL, запущенная rundll32.dll, [она должна быть преобразована в обычную обычную программу) (https://blogs.msdn.microsoft.com/oldnewthing/20130104-00/?p=5643). Если ни одна из двух не верна, вы смотрите на неправильный раздел. Вероятно, вам понадобится «Добавление поддержки визуального стиля к расширению, подключаемому модулю, оснастке MMC или DLL, которая подключена к процессу». – andlabs
Да, я согласен, что имена этих разделов не очень хорошие. – andlabs
@DavisHeffernan: Спасибо, что указали это. Вау. Кто мог подумать, что нужно использовать эти API-интерфейсы «CreateActCtx»? – c00000fd