Как включить визуальные стили без манифеста - PullRequest
11 голосов
/ 30 ноября 2010

Согласно документам :

"Если вы хотите, чтобы ваше приложение использовало ComCtl32.dll версии 6, вы должны добавить манифест приложения или директиву компилятора , чтобы указать, что версию 6 следует использовать, если она доступна."

Обратите внимание на логическое ИЛИ выше? Так что же это за загадочная директива компилятора?

У меня есть собственное приложение Win32 C ++, которое целиком содержится в одном файле .cpp. Нет файлов ресурсов, файлов манифеста и т. Д. Я бы хотел сохранить их в таком виде, но я бы также хотел использовать визуальные стили.

Ответы [ 3 ]

26 голосов
/ 04 мая 2012

На самом деле существует третий путь с без каких-либо проявлений , хотя он довольно хакерский:

#include <windows.h>

// NOTE: It is recommended that you delay-load ComCtl32.dll (/DelayLoad:ComCtl32.dll)
// and that you ensure this code runs before GUI components are loaded.
// Otherwise, you may get weird issues, like black backgrounds in icons in image lists.
ULONG_PTR EnableVisualStyles(VOID)
{
    TCHAR dir[MAX_PATH];
    ULONG_PTR ulpActivationCookie = FALSE;
    ACTCTX actCtx =
    {
        sizeof(actCtx),
        ACTCTX_FLAG_RESOURCE_NAME_VALID
            | ACTCTX_FLAG_SET_PROCESS_DEFAULT
            | ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID,
        TEXT("shell32.dll"), 0, 0, dir, (LPCTSTR)124
    };
    UINT cch = GetSystemDirectory(dir, sizeof(dir) / sizeof(*dir));
    if (cch >= sizeof(dir) / sizeof(*dir)) { return FALSE; /*shouldn't happen*/ }
    dir[cch] = TEXT('\0');
    ActivateActCtx(CreateActCtx(&actCtx), &ulpActivationCookie);
    return ulpActivationCookie;
}
11 голосов
/ 30 ноября 2010

Если вы используете Visual Studio, вы можете добавить эту строку в ваш stdafx.cpp, например:

#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
6 голосов
/ 30 ноября 2010

Если бы вы продолжали читать, вы бы нашли ответ :

Если вы используете Microsoft Visual C ++ 2005 или более позднюю версию, вы можете добавить следующую директиву компилятора в ваш исходный код вместо создания манифеста вручную. Для удобства чтения директива разбита на две строки.

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