Programming Windows Maniacs - プログラミング ウィンドウズ マニアックス ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて  
ホーム >> OS >> Windows®XP >> Windows XP以降でアプリケーションにThemeを反映させるには(2)

Windows XP以降でアプリケーションにThemeを反映させるには(2)

  Windows XP以降でアプリケーションにThemeを反映させるには、3通りの方法があります。
    (1) manifestファイルを作成し、exeと同一フォルダに配置する。
    (2) manifestファイルを作成し、リソースに追加する。
    (3) APIによりThemeを反映させる。

  上記の中で(1)が一番カンタンですが、(2)が一番安全です。
  Windows Vistaで権限上昇manifestを適用した場合、(1)の方法ではThemeが反映されなくなるためです。詳細についてはWindows Vistaの「管理者権限でアプリケーションを動作させるためには - 注意点」を参照してください。
  ただし、権限上昇manifestを適用しないのであれば、(1)で問題ありません。

  (2)の方法ですが、"exeファイル名と同じファイル名 + manifest"というファイル名で manifest ファイルを作成し、リソースに追加します。
  リソースに追加する場合、rcファイルには、下記のように記載する必要があります(XXXXはexeファイル名です)。

        CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "xxxx.exe.manifest"

  環境によっては、CREATEPROCESS_MANIFEST_RESOURCE_IDやRT_MANIFESTは定義されていません。
  その場合は、下記のように記載してください。
        1    24    "xxxx.exe.manifest"

  以下、サンプルになります。

   manifest ファイルの中身は、UTF-8で保存してください(UTF-8以外でも動きますが、推奨されています)。

 

■■■ themexp プロジェクト
■ main.cpp


#include <windows.h>
#include <tchar.h>

#include "resource.h"

BOOL CALLBACK DialogFunc ( HWND hWnd,
    UINT nMessage,
    WPARAM wParam,
    LPARAM lParam )
{
    switch ( nMessage ) {
    case WM_COMMAND:
        switch ( LOWORD ( wParam ) ) {
        case IDCANCEL:
            EndDialog ( hWnd, 0 );
            return TRUE;
        }
        break;
    }

    return FALSE;
}

// エントリポイント
int WINAPI _tWinMain ( HINSTANCE hThisInstance,
    HINSTANCE,
    _TCHAR *,
    int )
{
    DialogBox ( hThisInstance, MAKEINTRESOURCE ( IDD_MAIN_DIALOG ), NULL, DialogFunc );
    
    return 0;
}

■ themexp.exe.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<description></description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>
■ resource.h

#define IDD_MAIN_DIALOG                 101
#define IDC_SPIN1                       1000
#define IDC_SLIDER1                     1001
#define IDC_EDIT1                       1002
#define IDC_SCROLLBAR1                  1003
#define IDC_COMBO1                      1004

■ resrc.rc

#include <winres.h>
#include "resource.h"

1        24        "themexp.exe.manifest"

IDD_MAIN_DIALOG DIALOG DISCARDABLE  0, 0, 187, 89
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Theme xp"
FONT 9, "MS Pゴシック"
BEGIN
    PUSHBUTTON      "キャンセル",IDCANCEL,130,24,50,14
    CONTROL         "Spin1",IDC_SPIN1,"msctls_updown32",UDS_ARROWKEYS,14,10,
                    10,14
    CONTROL         "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | 
                    TBS_NOTICKS | WS_TABSTOP,14,45,100,15
    EDITTEXT        IDC_EDIT1,114,62,40,14,ES_AUTOHSCROLL
    SCROLLBAR       IDC_SCROLLBAR1,64,11,40,11
    COMBOBOX        IDC_COMBO1,6,68,48,30,CBS_DROPDOWN | CBS_SORT | 
                    WS_VSCROLL | WS_TABSTOP
END


   Themeが反映されるのはオーナードローしていないコントロールだけです。オーナードローしていると、Themeは反映されません。

   APIによりThemeを反映することもできますが、普通行われていません。

  ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて Copyright © 2014 A.Morita