Comment activer les styles visuels sans manifeste

Selon les docs :

“Si vous souhaitez que votre application utilise ComCtl32.dll version 6, vous devez append un manifeste d’application ou une directive de compilation pour spécifier que la version 6 doit être utilisée si elle est disponible.”

Notez le OU logique ci-dessus? Alors, quelle est cette directive mystérieuse du compilateur?

J’ai une application Win32 C ++ native entièrement contenue dans un seul fichier .cpp. Il n’y a pas de fichiers de ressources, de fichiers manifestes, etc. J’aimerais le conserver de cette façon, mais j’aimerais également utiliser des styles visuels.

Si vous utilisez Visual Studio, vous pouvez append cette ligne à votre fichier stdafx.cpp, par exemple:

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

Il y a en fait une troisième manière sans aucun manifeste , bien que ce soit plutôt hacky:

 #include  // 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; } 

Si vous aviez continué à lire, vous auriez trouvé la réponse :

Si vous utilisez Microsoft Visual C ++ 2005 ou version ultérieure, vous pouvez append la directive de compilation suivante à votre code source au lieu de créer manuellement un manifeste. Pour des raisons de lisibilité, la directive est divisée en deux lignes ici.

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