Win32. Включить визуальные стили в dll

У меня нет опыта работы с C ++ и Win API, поэтому извините, если этот вопрос нубийский. У меня есть DLL, где я создаю некоторые компоненты, MessageBox например. Я добавил комментарий прагмы, чтобы включить визуальные стили, и он не работает (и не должен, как я знаю из этого ответа: Windows 7 стиль для combobox на панели инструментов Internet Explorer, как?

Код Dll (без экспорта и т. Д.):

#include "stdafx.h"#include "my-dll.h"#include <Windows.h>
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*'    publicKeyToken='6595b64144ccf1df' language='*'\"")

MYDLL_API int fnmydll(void)
{
MessageBox(NULL, L"Message", NULL, 0);
return 42;
}

Затем я вызываю эту функцию DLL из моего приложения:

#include <iostream>
#include <Windows.h>
#include "my-dll.h"
int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
fnmydll();
return 0;
}

И у меня есть окно сообщения, но без визуальных стилей. Насколько я понимаю, я должен активировать контекст, когда моя DLL вызывается, но MSDN не имеет примеров, как это сделать. Не могли бы вы дать мне такой пример или хотя бы объяснить, что происходит более подробно? Потому что я даже не могу понять, почему функция BOOL GetCurrentActCtx(_Out_ HANDLE *lphActCtx); получает указатель на ACTCTX но имеет подпись с некоторыми HANDLE тип.

2

Решение

Если вы хотите, чтобы ваша DLL использовала элементы управления с визуальным стилем, то есть comctl32 v6, даже если ваше хост-приложение не использует ее, вы должны использовать Activation Context API. Вот пример того, как его использовать:

 HANDLE hActCtx;
ACTCTX actCtx;
ZeroMemory(&actCtx, sizeof(actCtx));
actCtx.cbSize = sizeof(actCtx);
actCtx.hModule = hInst;
actCtx.lpResourceName = MAKEINTRESOURCE(2);
actCtx.dwFlags = ACTCTX_FLAG_HMODULE_VALID | ACTCTX_FLAG_RESOURCE_NAME_VALID;

hActCtx = CreateActCtx(&actCtx);
if (hActCtx != INVALID_HANDLE_VALUE) {
ULONG_PTR cookie;
ActivateActCtx(hActCtx, &cookie);

// Do some UI stuff here; just show a message for example
MessageBox(NULL, TEXT("Styled message box"), NULL, MB_OK);

DeactivateActCtx(0, cookie);
ReleaseActCtx(hActCtx);
}

Вот hInst является дескриптором модуля вашей DLL, вы можете сохранить его в глобальной переменной в DllMain или использовать GetModuleHandle Функция, чтобы получить это. Этот пример подразумевает, что ваша DLL хранит манифест Common Controls версии 6.0 в своих ресурсах с ID 2.

Ты можешь позвонить CreateActCtx только один раз, когда ваша DLL инициализируется, и ReleaseActCtx когда это больше не нужно. Вызов ActivateActCtx перед созданием каких-либо окон и вызова DeactivateActCtx перед возвратом управления приложению.

9

Другие решения