KgTheme Doc

目次

KgTheme概要
クラス説明
クラス一覧
CThemeSet
CThemeButton
CThemeCheckBox
CThemeLabel
CThemeGroupBox
CThemeProgressBar
CThemeComboBox
CThemeDialog
VCプロジェクト設定
インクルードパス
インポートライブラリ
.clwの再作成
サンプルコード
CThemeSet::LoadThemeFromStruct使用例
ライセンスについて

KgTheme概要

KgTheme は、ボタン、ラベル、コンボボックス等のコントロールや、 ダイアログそのものをテーマによって見た目を変更する事のできるライブラリです。

ビットマップテーマ

Aquaテーマ

以下のような特徴を持っています。

クラス説明

クラス一覧

クラス名 基底クラス 説明
CThemeSet なし フォント、背景色、前景色、ビットマップ等のテーマリソースを管理するクラス
CThemeButton CButton テーマ化されたボタンコントロールクラス
CThemeCheckBox CButton テーマ化されたチェックボックスコントロールクラス
CThemeLabel CStatic テーマ化されたラベル(スタティックテキスト)コントロールクラス
CThemeGroupBox CButton テーマ化されたグループボックスコントロールクラス
CThemeProgressBar CProgressCtl テーマ化されたプログレスバーコントロールクラス
CThemeComboBox CComboBox テーマ化されたコンボボックスコントロールクラス
CThemeDialog CDialog テーマ化されたダイアログクラス

CThemeSet

このクラスは1つのTHEMESET構造体を持ち、 ボタンやチェックボックスといったテーマクラスステータス毎にフォント、色、ビットマップ等の ターゲットのテーマリソースを管理します。

テーマクラス
TCID_DEFAULT その他のテーマクラスにテーマリソースが割り当てられていない場合に使用される 一般的なテーマリソースを指定しておく事ができるテーマクラスです。
TCID_BUTTON CThemeButtonが参照するテーマクラスです。
TCID_CHECKBOX CThemeCheckBoxが参照するテーマクラスです。
TCID_LABEL CThemeLabelが参照するテーマクラスです。
TCID_GROUPBOX CThemeGroupBoxが参照するテーマクラスです。
TCID_PROGRESSBAR CThemeProgressBarが参照するテーマクラスです。
TCID_COMBOBOX CThemeComboBoxが参照するテーマクラスです。
TCID_DIALOG CThemeDialogが参照するテーマクラスです。
TCID_END CThemeSet::LoadThemeFromStruct() が構造体配列の最後を判断する為の値です。
ターゲット
TTID_FONT テキスト描画用フォントを表します。
TTID_BGCOLOR 背景色を表します。
TTID_FGCOLOR 前景色を表します。
TTID_BITMAP 背景ビットマップを表します。大抵の場合、背景ビットマップが指定されると 背景色は無視されます。
TTID_CHECKED CThemeCheckBox用のチェック状態を示す ビットマップを表します。
TTID_UNCHECKED CThemeCheckBox用の非チェック状態を示す ビットマップを表します。
TTID_FGBITMAP CThemeProgressBar用の バー部分を描画する為のビットマップを表します。
TTID_DROPBUTTON CThemeComboBox用のドロップダウンボタン のビットマップを表します。
TTID_BGBITMAP CThemeDialog用の背景ビットマップ を表します。
TTID_TITLEBGCOLOR CThemeDialog用のタイトルバー背景色 を表します。
TTID_TITLEFGCOLOR CThemeDialog用のタイトルバー前景色 を表します。
TTID_TITLEBITMAP CThemeDialog用のタイトルバー背景ビットマップ を表します。
TTID_CLOSEBUTTON CThemeDialog用のタイトルバー上に配置される Close(閉じる)ボタンのビットマップを表します。
TTID_MAXBUTTON CThemeDialog用のタイトルバー上に配置される Maximize(最大化)ボタンのビットマップを表します。
TTID_RESTOREBUTTON CThemeDialog用のタイトルバー上に配置される Restore(元のサイズに戻す)ボタンのビットマップを表します。
TTID_MINBUTTON CThemeDialog用のタイトルバー上に配置される Minimize(最小化)ボタンのビットマップを表します。
TTID_HELPBUTTON CThemeDialog用のタイトルバー上に配置される Help(コンテキストヘルプ)ボタンのビットマップを表します。
ステータス
TSID_NORMAL 通常の状態を表します。
TSID_DISABLED 無効化(グレイアウト)状態または非アクティブ状態を表します。
TSID_SELECTED 選択状態を表します。例えばマウスによってクリックされている最中などです。
TSID_FOCUSED 入力フォーカスを持っている状態を表します。

以下に、コントロールクラス毎の有効値の組み合わせを示します。

コントロールクラス毎の有効値
クラス名 テーマクラス値 ターゲット値 ステータス値
- TCID_DEFAULT TTID_FONT
TTID_BGCOLOR
TTID_FGCOLOR
TTID_BITMAP
TSID_NORMAL
TSID_DISABLED
TSID_SELECTED
TSID_FOCUSED
CThemeButton TCID_BUTTON TTID_FONT
TTID_BGCOLOR
TTID_FGCOLOR
TTID_BITMAP
TSID_NORMAL
TSID_DISABLED
TSID_SELECTED
TSID_FOCUSED
CThemeCheckBox TCID_CHECKBOX TTID_FONT
TTID_BGCOLOR
TTID_FGCOLOR
TTID_BITMAP
TSID_NORMAL
TSID_DISABLED
TSID_SELECTED
TSID_FOCUSED
TTID_CHECKED
TTID_UNCHECKED
TSID_NORMAL
CThemeLabel TCID_LABEL TTID_FONT
TTID_BGCOLOR
TTID_FGCOLOR
TTID_BITMAP
TSID_NORMAL
TSID_DISABLED
TSID_SELECTED
TSID_FOCUSED
CThemeGroupBox TCID_GROUPBOX TTID_FONT
TTID_BGCOLOR
TTID_FGCOLOR
TTID_BITMAP
TSID_NORMAL
TSID_DISABLED
TSID_SELECTED
TSID_FOCUSED
CThemeProgressBar TCID_PROGRESSBAR TTID_FONT
TTID_BGCOLOR
TTID_FGCOLOR
TTID_BITMAP
TSID_NORMAL
TSID_DISABLED
TSID_SELECTED
TSID_FOCUSED
TTID_FGBITMAP TSID_NORMAL
CThemeComboBox TCID_COMBOBOX TTID_FONT
TTID_BGCOLOR
TTID_FGCOLOR
TTID_BITMAP
TSID_NORMAL
TSID_DISABLED
TSID_SELECTED
TSID_FOCUSED
TTID_DROPBUTTON TSID_NORMAL
CThemeDialog TCID_DIALOG TTID_BGCOLOR
TTID_BGBITMAP
TSID_NORMAL
TTID_TITLEBGCOLOR
TTID_TITLEFGCOLOR
TTID_TITLEBITMAP
TSID_NORMAL
TSID_DISABLED

構造体

LOADABLE_THEME_FONT
テーマとしてフォントをロードする為に使用される構造体です。 LOADABLE_THEME構造体の target_id フィールドが TTID_FONT の場合に data フィールトに指定します。
typedef struct {
    WORD point;		// フォントサイズ(ポイント単位)
    LPCTSTR face_name;	// フォント名("MS ゴシック" 等)
} LOADABLE_THEME_FONT;
LOADABLE_THEME_BITMAP
テーマとしてビットマップをロードする為に使用される構造体です。 LOADABLE_THEME構造体の target_id フィールドが TTID_BITMAP, TTID_FGBITMAP, TTID_BGBITMAP, TTID_TITLEBITMAP, TTID_CHECKED, TTID_UNCHECKED の場合に data フィールドに指定します。
typedef struct {
    UINT resource_id;		// ビットマップリソースID
    UINT resource_id_mask;	// マスク用ビットマップリソースID
    UINT border_width;		// 左右のビットマップ固定化幅
    UINT border_height;		// 上下のビットマップ固定化高さ
    WORD flags;			// 伸縮モードフラグ
} LOADABLE_THEME_BITMAP;
border_width, border_height には、 ビットマップの端からの固定化する(伸縮しない)幅を0以上の値で指定します。
ビットマップは以下のように伸縮されます。
ビットマップ伸縮について

resource_id_maskには、有効なビットを0(黒)とし、 それ以外を1(白)とした白黒(1bit)ビットマップのリソースIDを指定します。
flagsには以下の伸縮モードを指定します。
TBF_TILE 元画像を並べて伸縮領域を描画します。
TBF_VSTRETCH 元画像を縦方向に拡大縮小し、横方向には並べて伸縮領域を描画します。
TBF_HSTRETCH 元画像を横方向に拡大縮小し、縦方向には並べて伸縮領域を描画します。
TBF_STRETCH 元画像を拡大縮小して伸縮領域を描画します。

ビットマップマスク機能は未作成です。 resource_id_mask メンバは無視されます。
LOADABLE_THEME
CThemeSet::LoadThemeFromStruct() 関数を使用する際に使用します。
typedef struct {
    WORD class_id;
    WORD target_id;
    WORD state_id;
    void *data;
} LOADABLE_THEME;
class_idにはテーマクラス を指定します。
target_idにはターゲット を指定します。
state_idにはステータス を指定します。
dataにはtarget_idにより以下のように 指定します。
target_id値 dataフィールド指定値 cast用マクロ
TTID_FONT LOADABLE_THEME_FONTポインタ THEME_DATA_FONT()
TTID_BITMAP
TTID_FGBITMAP
TTID_BGBITMAP
TTID_TITLEBITMAP
TTID_CHECKED
TTID_UNCHECKED
LOADABLE_THEME_BITMAPポインタ THEME_DATA_BITMAP()
TTID_BGCOLOR
TTID_FGCOLOR
TTID_TITLEBGCOLOR
TTID_TITLEFGCOLOR
COLORREFポインタ THEME_DATA_COLOR()
使用方法については LoadThemeFromStruct()使用例 を参照してください。
THEMESET
テーマリソースの全てを参照する事ができる構造体です。 詳細はソースコードを参照してください。

メンバ関数

void InitializeTheme()
ロード済のテーマリソースを破棄して初期化します。
BOOL LoadThemeFromStruct(const LOADABLE_THEME *theme)
LOADABLE_THEME構造体の配列で 指定されたテーマリソースをロードします。 エラーが発生すると FALSE が返ります。
BOOL LoadThemeFromFile(LPCTSTR filename)
テーマファイルからテーマリソースをロードします。 この関数は未作成です。
THEMESET *GetThemeSet()
このクラスで管理しているTHEMESET構造体 そのものを取得します。
CFont *GetThemeFont(WORD class_id, WORD target_id, WORD state_id)
テーマクラスが class_id で、状態が state_id のターゲットが target_id の フォントを取得します。

CThemeButton

CButton の派生クラスで、通常のプッシュボタンとして使用します。

メンバ関数

void SetTheme(CThemeSet *pThemeClass)
テーマがロードされたCThemeSetクラスを指定します。

使用方法

  1. リソースエディタでダイアログにボタンを配置します。
  2. ClassWizardを開き、配置したボタンに対して以下のようにメンバ変数を追加します。
    カテゴリ: コントロール
    変数のタイプ: CThemeButton
    (変数のタイプが指定できない場合は .clwの再作成方法を参照してください。)
  3. テーマを割り付けるには、ダイアログの OnInitDialog() 関数で 追加したメンバ変数を使って CThemeButton::SetTheme() を呼び出します。

CThemeCheckBox

CButton の派生クラスで、チェックボックスとして使用します。

メンバ関数

void SetTheme(CThemeSet *pThemeClass)
テーマがロードされたCThemeSetクラスを指定します。
BOOL GetCheckState()
チェック状態を取得します。

使用方法

  1. リソースエディタでダイアログにチェックボックスを配置します。
  2. ClassWizardを開き、配置したチェックボックスに対して 以下のようにメンバ変数を追加します。
    カテゴリ: コントロール
    変数のタイプ: CThemeCheckBox
    (変数のタイプが指定できない場合は .clwの再作成方法を参照してください。)
  3. テーマを割り付けるには、ダイアログの OnInitDialog() 関数で 追加したメンバ変数を使って CThemeCheckBox::SetTheme() を呼び出します。

CThemeLabel

CStatic の派生クラスで、ラベル(スタティックテキスト)として使用します。

メンバ関数

void SetTheme(CThemeSet *pThemeClass)
テーマがロードされたCThemeSetクラスを指定します。

使用方法

  1. リソースエディタでダイアログにスタティックテキストを配置します。
  2. ClassWizardを開き、配置したスタティックテキストに対して 以下のようにメンバ変数を追加します。
    カテゴリ: コントロール
    変数のタイプ: CThemeLabel
    (変数のタイプが指定できない場合は .clwの再作成方法を参照してください。)
  3. テーマを割り付けるには、ダイアログの OnInitDialog() 関数で 追加したメンバ変数を使って CThemeLabel::SetTheme() を呼び出します。

CThemeGroupBox

CButton の派生クラスで、グループボックスとして使用します。

メンバ関数

void SetTheme(CThemeSet *pThemeClass)
テーマがロードされたCThemeSetクラスを指定します。

使用方法

  1. リソースエディタでダイアログにグループボックスを配置します。
  2. ClassWizardを開き、配置したグループボックスに対して 以下のようにメンバ変数を追加します。
    カテゴリ: コントロール
    変数のタイプ: CThemeGroupBox
    (変数のタイプが指定できない場合は .clwの再作成方法を参照してください。)
  3. テーマを割り付けるには、ダイアログの OnInitDialog() 関数で 追加したメンバ変数を使って CThemeGroupBox::SetTheme() を呼び出します。

CThemeProgressBar

CProgressCtl の派生クラスで、プログレスバーとして使用します。

メンバ関数

void SetTheme(CThemeSet *pThemeClass)
テーマがロードされたCThemeSetクラスを指定します。
int SetPosAnim(int nPos)
CProgressCtl::SetPos() と同様の関数ですが、なめらかに進捗を伸ばせます。

使用方法

  1. リソースエディタでダイアログにプログレスバーを配置します。
  2. ClassWizardを開き、配置したプログレスバーに対して 以下のようにメンバ変数を追加します。
    カテゴリ: コントロール
    変数のタイプ: CThemeProgressBar
    (変数のタイプが指定できない場合は .clwの再作成方法を参照してください。)
  3. テーマを割り付けるには、ダイアログの OnInitDialog() 関数で 追加したメンバ変数を使って CThemeProgressBar::SetTheme() を呼び出します。

CThemeComboBox

CComboBox の派生クラスで、コンボボックスとして使用します。

メンバ関数

void SetTheme(CThemeSet *pThemeClass)
テーマがロードされたCThemeSetクラスを指定します。

使用方法

  1. リソースエディタでダイアログにコンボボックスを配置します。
  2. ClassWizardを開き、配置したコンボボックスに対して 以下のようにメンバ変数を追加します。
    カテゴリ: コントロール
    変数のタイプ: CThemeComboBox
    (変数のタイプが指定できない場合は .clwの再作成方法を参照してください。)
  3. テーマを割り付けるには、ダイアログの OnInitDialog() 関数で 追加したメンバ変数を使って CThemeComboBox::SetTheme() を呼び出します。

CThemeDialog

CDialog の派生クラスで、ダイアログとして使用します。

メンバ関数

CThemeDialog(UINT nIDTemplate, CWnd* pParentWnd)
コンストラクタです。
void SetTheme(CThemeSet *pThemeClass)
テーマがロードされたCThemeSetクラスを指定します。
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
ウィンドウメッセージ処理関数です。この関数が呼ばれないと、このクラスで拡張された 機能が動作しません。
BOOL ShadeWindow(BOOL bCloseUp)
ウィンドウをその場でタイトルバーのサイズにたたんだり、元に戻したりします。 引数 bCloseUp に TRUE を指定するとたたんで、FALSE を指定すると元に戻せます。 関数が成功すると TRUE が返ります。
BOOL IsWindowClosedUp()
ウィンドウがタイトルバーのサイズにたたまれているかどうかを取得します。
void SetResizingLayout(CWnd *pWnd, UINT nFlags)
ウィンドウリサイズ時の各種コントロールの再配置方法を設定します。
引数 pWnd にはコントロールのポインタを指定します。
引数 nFlags には以下の再配置方法をOR結合して指定します。
SRL_FIXALL 全ての辺を固定します。
SRL_FIXLEFTFROMLEFT 左辺をダイアログの左辺からの距離で固定します。
SRL_FIXRIGHTFROMLEFT 右辺をダイアログの左辺からの距離で固定します。
SRL_FIXLEFTFROMRIGHT 左辺をダイアログの右辺からの距離で固定します。
SRL_FIXRIGHTFROMRIGHT 右辺をダイアログの右辺からの距離で固定します。
SRL_FIXTOPFROMTOP 上辺をダイアログの上辺からの距離で固定します。
SRL_FIXBOTTOMFROMTOP 下辺をダイアログの上辺からの距離で固定します。
SRL_FIXTOPFROMBOTTOM 上辺をダイアログの下辺からの距離で固定します。
SRL_FIXBOTTOMFROMBOTTOM 下辺をダイアログの下辺からの距離で固定します。
上記をOR結合してある以下の定義を使用することで大抵の事はできます。
SRL_FIXALLFROMLEFT 左右の辺をダイアログの左辺からの距離で固定します。
SRL_FIXALLFROMRIGHT 左右の辺をダイアログの右辺からの距離で固定します。
SRL_FIXALLFROMTOP 上下の辺をダイアログの上辺からの距離で固定します。
SRL_FIXALLFROMBOTTOM 上下の辺をダイアログの下辺からの距離で固定します。
SRL_STRETCHWIDTH 左右の辺をそれぞれダイアログからの左右の辺からの距離で固定して 横方向に伸縮します。
SRL_STRETCHHEIGHT 上下の辺をそれぞれダイアログからの上下の辺からの距離で固定して 縦方向に伸縮します。

使用方法

  1. リソースエディタでダイアログリソース作成した後、 ClassWizard等でダイアログクラスを新規作成します。
  2. 作成したダイアログクラスのヘッダーファイルを開き、 基底クラスを CDialog から CThemeDialog に書き換えます。
    class Cxxxxxx : public CThemeDialog
    {
  3. 作成したダイアログクラスのソースファイルを開き、 コンストラクタに記述されている CDialog を CThemeDialog に書き換えます。
    Cxxxxxx::Cxxxxxx(CWnd* pParent /*=NULL*/)
    	: CThemeDialog(Cxxxxxx::IDD, pParent)
    {
  4. テーマを割り付けるには、ダイアログの OnInitDialog() 関数で this->SetTheme() を呼び出します。

VCプロジェクト設定

ここでは、KgThemeライブラリを使用する為のVCプロジェクト設定を説明します。

インクルードパス

プロジェクトの設定画面を開き、C/C++タブのカテゴリは プリプロセッサを選択すると次のような画面が開きます。

IncludePath設定画面例

この例のように、KgThemeライブラリのヘッダーファイルのあるディレクトリを 指定します。

インポートライブラリ

プロジェクトの設定画面を開き、リンクタブのカテゴリは 一般を選択すると次のような画面が開きます。

ImportLib設定画面例

この例のように、KgThemeライブラリのインポートライブラリ(KgTheme.lib)のあるディレクトリを 指定します。

.clwの再作成

リソースエディタでダイアログに追加したボタン等のコントロールを KgThemeライブラリの CThemeButton 等に割り当てるには ClassWizard を使用して メンバ変数の追加を行います。 この作業を初めて行う場合は、メンバ変数のタイプ(型)のリストに目的のクラスが 存在しません。本当の所はどのようにすべきか分かりませんが、次のように .clw ファイルを再作成してやる事で、KgThemeライブラリ内のクラスが選択できる ようになします。

  1. エクスプローラ等から .clw ファイルを削除またはリネームする。
  2. VisualStudioからClassWizardを起動する。
  3. ソースファイルからビルドしますか? に はい と答える。
  4. ソースファイル選択画面で KgThemeライブラリのヘッダーファイルとソースファイルを追加する。
  5. OKボタンを押して .clw を作成する。

サンプルコード

CThemeSet::LoadThemeFromStruct使用例

LOADABLE_THEME_FONT default_font = { 10, "MS 明朝" };
LOADABLE_THEME_BITMAP ltbButtonBG = { IDB_BUTTONBG, 0, 4, 4, TBF_STRETCH };
LOADABLE_THEME_BITMAP ltbButtonBGDisable = { IDB_BUTTONBG_DISABLE, 0, 4, 4, TBF_STRETCH };
LOADABLE_THEME_BITMAP ltbButtonBGFocus = { IDB_BUTTONBG_FOCUS, 0, 4, 4, TBF_STRETCH };

LOADABLE_THEME my_theme[] = {
    { TCID_DEFAULT, TTID_FONT, TSID_NORMAL, THEME_DATA_FONT(&default_font) },
    { TCID_DEFAULT, TTID_FGCOLOR, TSID_NORMAL, THEME_DATA_COLOR(RGB(255,255,255)) },
    { TCID_BUTTON, TTID_BITMAP, TSID_NORMAL, THEME_DATA_BITMAP(<bButtonBG) },
    { TCID_BUTTON, TTID_BITMAP, TSID_DISABLED, THEME_DATA_BITMAP(<bButtonBGDisable) },
    { TCID_BUTTON, TTID_BITMAP, TSID_FOCUSED, THEME_DATA_BITMAP(<bButtonBGFocus) },
    { TCID_END, 0, 0, NULL }	// 終わりを示す
};

/*
 * CThemeSet型のメンバ変数 m_ThemeClass にテーマをロードします。
 * 引数の LOADABLE_THEME 構造体配列の最後には、TCID_END が必要です。
 * 無い場合は、おそらく不正な処理が行われアプリケーションは強制終了されます。
 */
m_ThemeClass.LoadThemeFromStruct(my_theme);

/*
 * CThemeButton型のボタンにロード済テーマクラス m_ThemeClass を割り当てます。
 */
m_BtnOK.SetTheme(&m_ThemeClass);
m_BtnCancel.SetTheme(&m_ThemeClass);

ライセンスについて

このライブラリを使用する為には VisualStudio が必要です。 その時点で自由とは言えないような気がしますが、 このライブラリ自体は GPL とさせて頂きます。 GPLについては、COPYINGファイルを参照するか、 GNUのWEBサイトを参照してください。