15

ドキュメントによると:

「アプリケーションで ComCtl32.dll バージョン 6 を使用する場合は、アプリケーション マニフェストまたはコンパイラ ディレクティブを追加して、使用可能な場合はバージョン 6 を使用するように指定する必要があります。」

上記の論理 OR に注目してください。では、この謎のコンパイラ ディレクティブとは何なのでしょうか?

1 つの .cpp ファイルに完全に含まれているネイティブの Win32 C++ アプリケーションがあります。リソース ファイルやマニフェスト ファイルなどはありません。そのままにしておきたいのですが、ビジュアル スタイルも使用したいと考えています。

4

3 に答える 3

32

かなりハッキーですが、実際にはマニフェストがまったくない3番目の方法があります。

#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;
}
于 2012-05-04T06:57:37.370 に答える
15

Visual Studio を使用している場合は、たとえば次の行を stdafx.cpp に追加できます。

#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
于 2010-11-29T22:02:26.643 に答える
7

もしあなたが読み続けていたら、あなたは答えを見つけたでしょう:

Microsoft Visual C++ 2005 以降を使用している場合は、マニフェストを手動で作成する代わりに、次のコンパイラ ディレクティブをソース コードに追加できます。読みやすくするために、ここではディレクティブを 2 行に分けています。

#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' 
version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
于 2010-11-29T22:04:20.113 に答える