ツールバーとイメージリスト

ツールバーボタンに使用する画像は、ツールバーに直接登録するほかにイメージリストを使用することもできます。

ツールバーでイメージリストを使用する場合、ツールバーにTB_ADDBITMAPメッセージ送信することは出来ません。
また、CreateToolbarEx関数を使用して作成したツールバーは、内部的にTB_ADDBITMAPメッセージが使用されているため、イメージリストを使用できません。
(このサイトではCreateToolbarEx関数の解説はしていません)

イメージリストの適用

TB_SETIMAGELISTメッセージ

ツールバーにイメージリストを設定するにはTB_SETIMAGELISTメッセージをツールバーに送信します。

WPARAMはイメージリストのインデックス(番号)です。
イメージリストは複数設置することができ、それを識別するためのものです。
イメージリストをひとつだけ設定する場合は0を指定します。

LPARAMは設定するイメージリストのハンドルです。

戻り値は以前に設定されていたイメージリストのハンドルです。
設定されていなかった場合はNULLを返します。

なお、ツールバーに設定されたイメージリストは、ツールバーの破棄時に自動的に破棄されます。

サンプルコード

ツールバーにイメージリストを設定するサンプルコードです。
画像は以下をID「IDB_BITMAP1」でリソースに追加しています。
ツールバーボタンのサンプル画像
ツールバーに関するその他のことはツールバーの項を参照して下さい。


#define IDC_A 101
#define IDC_I 102
#define IDC_U 103
#define IDC_E 104
#define IDC_O 105

//ツールバーを作成
HWND CreateToolbar(HWND hWnd)
{
	//コモンコントロールの初期化
	INITCOMMONCONTROLSEX icc;
	icc.dwSize = sizeof(INITCOMMONCONTROLSEX);
	icc.dwICC = ICC_BAR_CLASSES;
	InitCommonControlsEx(&icc);

	//ツールバーの作成
	HWND hToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
		WS_CHILD | WS_VISIBLE,
		0, 0, 0, 0,
		hWnd, NULL, hInst, NULL);

	//ツールバーを初期化
	SendMessage(hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
	SendMessage(hToolbar, TB_SETBITMAPSIZE, 0, MAKELPARAM(16, 15));

	//イメージリストの作成
	HIMAGELIST hImageList = ImageList_Create(
		16, 15,
		ILC_COLOR8 | ILC_MASK,
		5, 0);
	HBITMAP hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
	ImageList_AddMasked(
		hImageList,
		hBmp,
		RGB(255, 255, 255));
	DeleteObject(hBmp);

	//ツールバーにイメージリストを設定
	SendMessage(hToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);

	//ボタンの定義と登録
	TBBUTTON tbb[] = {
		{ 0, IDC_A, TBSTATE_ENABLED, BTNS_BUTTON },
		{ 1, IDC_I, TBSTATE_ENABLED, BTNS_BUTTON },
		{ 0, 0, 0, BTNS_SEP },
		{ 2, IDC_U, TBSTATE_ENABLED, BTNS_BUTTON },
		{ 3, IDC_E, TBSTATE_ENABLED, BTNS_BUTTON },
		{ 4, IDC_O, TBSTATE_ENABLED, BTNS_BUTTON }
	};
	SendMessage(hToolbar, TB_ADDBUTTONS, (WPARAM)6, (LPARAM)&tbb);

	return hToolbar;
}

標準ボタンの追加

TB_LOADIMAGESメッセージ

イメージリストにツールバーの標準ボタンを登録するにはTB_LOADIMAGESメッセージを使用します。

WPARAMは登録したいビットマップの種類を表す定数を以下のいずれかから指定します。
LARGEは大きいアイコン、SMALLは小さいアイコンです。
画像は標準ボタンビットマップ一覧を参照してください。

定数 説明
IDB_HIST_LARGE_COLOR
IDB_HIST_SMALL_COLOR
Windowsエクスプローラーアイコン
IDB_STD_LARGE_COLOR
IDB_STD_SMALL_COLOR
標準ボタンアイコン
IDB_VIEW_LARGE_COLOR
IDB_VIEW_SMALL_COLOR
ビューアイコン
IDB_HIST_NORMAL Windowsエクスプローラーの通常状態アイコン
IDB_HIST_HOT Windowsエクスプローラーのホット(アクティブ)状態アイコン
IDB_HIST_PRESSED Windowsエクスプローラーの押下状態アイコン
IDB_HIST_DISABLED Windowsエクスプローラーの無効状態アイコン

LPARAMは定数HINST_COMMCTRLを指定します。

戻り値は登録した画像の先頭のインデックスです。
イメージリストにすでに画像が登録されている場合は末尾に追加されるので、その場合は戻り値をIDに加算する必要があります。

サンプルコード


#define IDC_A		101
#define IDC_I		102
#define IDC_CUT		103
#define IDC_COPY	104
#define IDC_PASTE	105

//ツールバーを作成
HWND CreateToolbar(HWND hWnd)
{
	//コモンコントロールの初期化
	INITCOMMONCONTROLSEX icc;
	icc.dwSize = sizeof(INITCOMMONCONTROLSEX);
	icc.dwICC = ICC_BAR_CLASSES;
	InitCommonControlsEx(&icc);

	//ツールバーの作成
	HWND hToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
		WS_CHILD | WS_VISIBLE,
		0, 0, 0, 0,
		hWnd, NULL, hInst, NULL);

	//ツールバーを初期化
	SendMessage(hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
	SendMessage(hToolbar, TB_SETBITMAPSIZE, 0, MAKELPARAM(16, 15));

	//イメージリストの作成
	HIMAGELIST hImageList = ImageList_Create(
		16, 15,
		ILC_COLOR8 | ILC_MASK,
		5, 0);
	HBITMAP hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
	ImageList_AddMasked(
		hImageList,
		hBmp,
		RGB(255, 255, 255));
	DeleteObject(hBmp);

	//ツールバーにイメージリストを設定
	SendMessage(hToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);

	//標準ボタンを追加
	int index = SendMessage(hToolbar, TB_LOADIMAGES, IDB_STD_SMALL_COLOR, (LPARAM)HINST_COMMCTRL);

	//ボタンの定義と登録
	TBBUTTON tbb[] = {
		{ 0, IDC_A, TBSTATE_ENABLED, BTNS_BUTTON },
		{ 1, IDC_I, TBSTATE_ENABLED, BTNS_BUTTON },
		{ 0, 0, 0, BTNS_SEP },
		//以降は標準ボタン画像
		{ index + STD_CUT , IDC_CUT, TBSTATE_ENABLED, BTNS_BUTTON },
		{ index + STD_COPY, IDC_COPY, TBSTATE_ENABLED, BTNS_BUTTON },
		{ index + STD_PASTE, IDC_PASTE, TBSTATE_ENABLED, BTNS_BUTTON }
	};
	SendMessage(hToolbar, TB_ADDBUTTONS, (WPARAM)6, (LPARAM)&tbb);

	return hToolbar;
}

サンプルコード2の実行結果

複数のイメージリストの設定

ツールバーには複数のイメージリストを同時に設定することができます。

CCM_SETVERSIONメッセージ

コモンコントロールは何度かバージョンアップされており、そのたびに新しい機能が追加されています。
新しい機能はそのままでは有効でない場合があり、使用する前にコントロールに対してCCM_SETVERSIONメッセージを送信して有効なバージョンを通知する必要があります。

WPARAMは有効なバージョン番号を指定します。
ツールバーに複数のイメージリストを設定するには5を指定します。
LPARAMは使用しません。

戻り値はコントロールに対してCCM_SETVERSIONメッセージで以前に設定されていたバージョン番号です。
設定に失敗した場合は-1を返します。

イメージリストのインデックスの指定

次に、TB_SETIMAGELISTメッセージを送信するとき、WPARAMにイメージリストのインデックスを指定します。
これは単純に、各イメージリストを識別する番号です。

画像の指定

画像の指定はMAKELONGマクロを使用してイメージリストのインデックスと画像番号を指定します。


MAKELONG(0/*画像インデックス*/, 0/*イメージリストインデックス*/);

TBBUTTON tbb;
tbb.iBitmap = MAKELONG(0, 0); //イメージリスト0番の0番目の画像
tbb.iBitmap = MAKELONG(1, 0); //イメージリスト0番の1番目の画像
tbb.iBitmap = MAKELONG(0, 1); //イメージリスト1番の0番目の画像
tbb.iBitmap = MAKELONG(1, 1); //イメージリスト1番の1番目の画像

サンプルコード


#define IDC_A		101
#define IDC_I		102
#define IDC_CUT		103
#define IDC_COPY	104
#define IDC_PASTE	105

//ツールバーの作成
HWND CreateToolbar(HWND hWnd)
{
	//コモンコントロールの初期化
	INITCOMMONCONTROLSEX icc;
	icc.dwSize = sizeof(INITCOMMONCONTROLSEX);
	icc.dwICC = ICC_BAR_CLASSES;
	InitCommonControlsEx(&icc);

	//ツールバーの作成
	HWND hToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
		WS_CHILD | WS_VISIBLE,
		0, 0, 0, 0,
		hWnd, NULL, hInst, NULL);

	//コモンコントロールのバージョンに5を指定
	SendMessage(hToolbar, CCM_SETVERSION, 5, 0);

	//ツールバーを初期化
	SendMessage(hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
	SendMessage(hToolbar, TB_SETBITMAPSIZE, 0, MAKELPARAM(16, 15));

	//イメージリストの作成
	HIMAGELIST hImageList = ImageList_Create(
		16, 15,
		ILC_COLOR16 | ILC_MASK,
		3, 0);
	//ツールバーにイメージリストを設定
	//インデックスに0を指定
	SendMessage(hToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
	//標準ボタン画像の読み込み
	SendMessage(hToolbar, TB_LOADIMAGES, IDB_STD_SMALL_COLOR, (LPARAM)HINST_COMMCTRL);

	//新しいイメージリストの作成
	hImageList = ImageList_Create(
		16, 15,
		ILC_COLOR8 | ILC_MASK,
		5, 0);
	HBITMAP hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
	ImageList_AddMasked(
		hImageList,
		hBmp,
		RGB(255, 255, 255));
	DeleteObject(hBmp);

	//ツールバーにイメージリストを設定
	//インデックスに1を指定
	SendMessage(hToolbar, TB_SETIMAGELIST, 1, (LPARAM)hImageList);

	//ボタンの定義と登録
	TBBUTTON tbb[] = {
		{ MAKELONG(0, 1), IDC_A, TBSTATE_ENABLED, BTNS_BUTTON },
		{ MAKELONG(1, 1), IDC_I, TBSTATE_ENABLED, BTNS_BUTTON },
		{ 0, 0, 0, BTNS_SEP },
		{ MAKELONG(STD_CUT, 0), IDC_CUT, TBSTATE_ENABLED, BTNS_BUTTON },
		{ MAKELONG(STD_COPY, 0), IDC_COPY, TBSTATE_ENABLED, BTNS_BUTTON },
		{ MAKELONG(STD_PASTE, 0), IDC_PASTE, TBSTATE_ENABLED, BTNS_BUTTON }
	};
	SendMessage(hToolbar, TB_ADDBUTTONS, (WPARAM)6, (LPARAM)&tbb);

	return hToolbar;
}

実行結果は先ほどと同じです。
サンプルコード2の実行結果

最初にイメージリストを作成し、インデックス「0」でツールバーに登録しています。
このイメージリストには標準ボタンを登録しています。
次に新しくイメージリストを作成し、自作のビットマップ画像を登録しています。
これをインデックス「1」でツールバーに登録しています。

登録したイメージリストからはMAKELONGマクロで「(画像インデックス, イメージリストインデックス)」と言う形式で画像を指定することができます。