Comment activer les styles visuels sans un manifeste
-
29-09-2019 - |
Question
Selon le docs :
« Si vous voulez que votre application à utiliser la version 6 ComCtl32.dll, vous devez ajouter un manifeste d'application ou directive compilateur pour indiquer que la version 6 doit être utilisée si elle est disponible. »
Notez que le OU logique ci-dessus? Alors, quelle est cette mystérieuse directive du compilateur?
J'ai une application ++ Win32 natif C qui est entièrement contenu dans un seul fichier .cpp. Il n'y a pas les fichiers de ressources, fichiers manifestes, etc. Je voudrais garder cette façon, mais je voudrais aussi utiliser des styles visuels.
La solution
Si vous utilisez Visual Studio, vous pouvez ajouter cette ligne à votre stdafx.cpp par exemple:
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
Autres conseils
Il est en fait une troisième voie avec pas que ce soit manifeste , mais il est plutôt aki:
#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;
}
Si vous aviez gardé la lecture, vous auriez trouvé la réponse :
Si vous utilisez Microsoft Visual C ++ 2005 ou plus tard, vous pouvez ajouter la directive du compilateur suivant à votre code source au lieu de créer manuellement un manifeste. Pour faciliter la lecture, 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='*'\"")