У меня нет опыта работы с 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
тип.
Если вы хотите, чтобы ваша 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
перед возвратом управления приложению.