ツールバーの標準ボタン

標準ボタン画像を使う

ツールバーのボタン画像は自分で用意するほか、Windows標準の画像を使用することもできます。
多くのアプリケーションで共通のアイコンを使用することで、機能を分かりやすく示すことができます。

TBADDBITMAP構造体

自前で画像を用意するのと同じく、標準ボタン画像もツールバーに登録してから使用します。
画像の登録はTB_ADDBITMAPメッセージTBADDBITMAP構造体を使用します。
(これらの詳細は上記リンク先を参照してください)

標準ボタン画像はTBADDBITMAP構造体のhInstメンバに定数HINST_COMMCTRLを指定します。
nIDメンバに指定できるものはいくつか種類がありますが、とりあえず定数IDB_STD_SMALL_COLORを指定します。
TB_ADDBITMAPメッセージの送信では、通常は登録する画像の個数をWPARAMに指定しますが、ここでは0を指定します。


TBADDBITMAP tb;
tb.hInst = HINST_COMMCTRL;
tb.nID = IDB_STD_SMALL_COLOR;

SendMessage(hToolbar, TB_ADDBITMAP, 0, (LPARAM)&tb);
//WPARAMは0で良い

これで標準ボタンの画像がツールバーに登録された状態になります。

TBBUTTON構造体

登録した画像はTBBUTTON構造体iBitmapメンバ(先頭のメンバ)に指定することで実際に表示することができます。


TBBUTTON tbb[] = {
	{ STD_FILENEW, IDC_FILENEW, TBSTATE_ENABLED, BTNS_BUTTON },
	{ STD_FILEOPEN, IDC_FILEOPEN, TBSTATE_ENABLED, BTNS_BUTTON },
	{ STD_FILESAVE, IDC_FILESAVE, TBSTATE_ENABLED, BTNS_BUTTON }
};

SendMessage(hToolbar, TB_ADDBUTTONS, (WPARAM)3, (LPARAM)&tbb);

上のコードではSTD_FILENEWSTD_FILEOPENSTD_FILESAVEを指定しています。
名前の通り、「新規作成」「ファイルを開く」「ファイルの保存」に使用されるアイコンです。
標準ボタンの使用

それぞれのボタンにどのような機能を実装するかはプログラマ次第ですが、多くのユーザーの認識とは異なるようなものは避けたほうが良いでしょう。
他の画像についてはページ最後にまとめておきます。

サンプルコード

ツールバー作成関数の全体のコードです。


#define IDC_FILENEW 101
#define IDC_FILEOPEN 102
#define IDC_FILESAVE 103

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));

	//ボタン画像の登録
	TBADDBITMAP tb;
	tb.hInst = HINST_COMMCTRL;
	tb.nID = IDB_STD_SMALL_COLOR;
	SendMessage(hToolbar, TB_ADDBITMAP, 0, (LPARAM)&tb);

	//ボタンの登録
	TBBUTTON tbb[] = {
		{ STD_FILENEW, IDC_FILENEW, TBSTATE_ENABLED, BTNS_BUTTON },
		{ STD_FILEOPEN, IDC_FILEOPEN, TBSTATE_ENABLED, BTNS_BUTTON },
		{ STD_FILESAVE, IDC_FILESAVE, TBSTATE_ENABLED, BTNS_BUTTON }
	};
	SendMessage(hToolbar, TB_ADDBUTTONS, (WPARAM)3, (LPARAM)&tbb);

	return hToolbar;
}

画像やボタンの追加

ツールバーへの画像やボタンの追加は、必要に応じて分割して行うことができます。
例えば標準ボタン画像と自前の画像の両方を使用したい場合は別々に登録することになります。


#define IDC_FILENEW 101
#define IDC_FILEOPEN 102
#define IDC_FILESAVE 103

#define IDC_A 111
#define IDC_I 112
#define IDC_U 113
#define IDC_E 114
#define IDC_O 115

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));

	//標準ボタン画像の登録
	TBADDBITMAP tb;
	tb.hInst = HINST_COMMCTRL;
	tb.nID = IDB_STD_SMALL_COLOR;
	SendMessage(hToolbar, TB_ADDBITMAP, 0, (LPARAM)&tb);

	//ボタンの登録
	TBBUTTON tbb[] = {
		{ STD_FILENEW, IDC_FILENEW, TBSTATE_ENABLED, BTNS_BUTTON },
		{ STD_FILEOPEN, IDC_FILEOPEN, TBSTATE_ENABLED, BTNS_BUTTON },
		{ STD_FILESAVE, IDC_FILESAVE, TBSTATE_ENABLED, BTNS_BUTTON }
	};
	SendMessage(hToolbar, TB_ADDBUTTONS, (WPARAM)3, (LPARAM)&tbb);

	//自前のボタン画像の登録
	//(ビットマップ画像の加工)
	COLORMAP colorMap;
	colorMap.from = RGB(255, 255, 255);
	colorMap.to = GetSysColor(COLOR_BTNFACE);
	HBITMAP hbm = CreateMappedBitmap(hInst, IDB_BITMAP1, 0, &colorMap, 1);

	TBADDBITMAP tb2;
	tb2.hInst = NULL;
	tb2.nID = (UINT_PTR)hbm;
	int index = SendMessage(hToolbar, TB_ADDBITMAP, (WPARAM)5, (LPARAM)&tb2);

	//ボタンの登録
	TBBUTTON tbb2[] = {
		{ 0, 0, 0, BTNS_SEP}, //セパレーター
		{ index++, IDC_A, TBSTATE_ENABLED, BTNS_BUTTON },
		{ index++, IDC_I, TBSTATE_ENABLED, BTNS_BUTTON },
		{ index++, IDC_U, TBSTATE_ENABLED, BTNS_BUTTON },
		{ index++, IDC_E, TBSTATE_ENABLED, BTNS_BUTTON },
		{ index++, IDC_O, TBSTATE_ENABLED, BTNS_BUTTON }
	};
	SendMessage(hToolbar, TB_ADDBUTTONS, (WPARAM)6, (LPARAM)&tbb2);
}

標準ボタン画像と自前画像を使用したボタンをツールバーに追加したところです。
画像やボタンの分割追加

注意すべきは、TBBUTTON構造体のiBitmapメンバの指定です。
以前は0から順に番号を振っていましたが、今回はTB_ADDBITMAPメッセージの戻り値を基準にしています。


TBADDBITMAP tb2;
tb2.hInst = NULL;
tb2.nID = (UINT_PTR)hbm;
int index = SendMessage(hToolbar, TB_ADDBITMAP, (WPARAM)5, (LPARAM)&tb2);

TBBUTTON tbb2[] = {
	{ 0, 0, 0, BTNS_SEP}, //セパレーター
	{ index++, IDC_A, TBSTATE_ENABLED, BTNS_BUTTON },
	{ index++, IDC_I, TBSTATE_ENABLED, BTNS_BUTTON },
	{ index++, IDC_U, TBSTATE_ENABLED, BTNS_BUTTON },
	{ index++, IDC_E, TBSTATE_ENABLED, BTNS_BUTTON },
	{ index++, IDC_O, TBSTATE_ENABLED, BTNS_BUTTON }
};

TB_ADDBITMAPメッセージの戻り値は、今登録した画像の先頭ボタン画像のインデックス(番号)です。
先にツールバーに登録した画像がある場合、新しく追加した画像のインデックスは登録済みの画像末尾の次の番号からになります。
例えば先にボタン5つ分の画像を登録している場合、0~4番がすでに使用されており、新しく追加する画像のインデックス(SendMessage関数の戻り値)は「5」となります。

これは標準ボタンでも同様です。
標準ボタン画像は定数で指定しますが(STD_FILENEWなど)、複数回画像を登録した場合は定数にTB_ADDBITMAPメッセージの戻り値を加算する必要があります。


TBADDBITMAP tb;
tb.hInst = HINST_COMMCTRL;
tb.nID = IDB_STD_SMALL_COLOR;
SendMessage(hToolbar, TB_ADDBITMAP, 0, (LPARAM)&tb);

TBBUTTON tbb[] = {
	{ STD_FILENEW, IDC_FILENEW, TBSTATE_ENABLED, BTNS_BUTTON },
	{ STD_FILEOPEN, IDC_FILEOPEN, TBSTATE_ENABLED, BTNS_BUTTON },
	{ STD_FILESAVE, IDC_FILESAVE, TBSTATE_ENABLED, BTNS_BUTTON }
};
SendMessage(hToolbar, TB_ADDBUTTONS, (WPARAM)3, (LPARAM)&tbb);

//別の標準ボタンの登録
TBADDBITMAP tb2;
tb2.hInst = HINST_COMMCTRL;
tb2.nID = IDB_HIST_SMALL_COLOR;
int index = SendMessage(hToolbar, TB_ADDBITMAP, 0, (LPARAM)&tb2);

//定数にindexを加算する
TBBUTTON tbb2[] = {
	{ HIST_BACK + index, IDC_BACK, TBSTATE_ENABLED, BTNS_BUTTON },
	{ HIST_FORWARD + index, IDC_FORWARD, TBSTATE_ENABLED, BTNS_BUTTON }
};
SendMessage(hToolbar, TB_ADDBUTTONS, (WPARAM)2, (LPARAM)&tbb2);

標準ボタンビットマップ一覧

標準ボタンのビットマップ一覧です。
画像はTBADDBITMAP構造体のnIDメンバに指定する定数により使用できる種類が異なります。
「○○_LARGE_○○」と「○○_SMALL_○○」という二種類があり、それぞれ画像は同じですがサイズが異なります。

IDB_HIST_LARGE_COLOR/IDB_HIST_SMALL_COLOR

IDB_HIST_LARGE_COLORIDB_HIST_SMALL_COLORで使用できる画像の定数です。
IDB_HIST_LARGE_COLOR

定数 説明
HIST_BACK 戻る(左矢印)
HIST_FORWARD 進む(右矢印)
HIST_FAVORITES お気に入り
HIST_ADDTOFAVORITES お気に入りに追加
HIST_VIEWTREE ビューツリー

IDB_STD_LARGE_COLOR/IDB_STD_SMALL_COLOR

IDB_STD_LARGE_COLORIDB_STD_SMALL_COLORで使用できる画像の定数です。
IDB_STD_LARGE_COLOR

定数 説明
STD_CUT 切り取り
STD_COPY コピー
STD_PASTE 貼り付け
STD_UNDO 元に戻す
STD_REDOW やり直し
STD_DELETE 削除
STD_FILENEW 新規作成
STD_FILEOPEN ファイルを開く
STD_FILESAVE 保存
STD_PRINTPRE 印刷プレビュー
STD_PROPERTIES プロパティ
STD_HELP ヘルプ
STD_FIND 検索
STD_REPLACE 置き換え
STD_PRINT 印刷

IDB_VIEW_LARGE_COLOR/IDB_VIEW_SMALL_COLOR

IDB_VIEW_LARGE_COLORIDB_VIEW_SMALL_COLORで使用できる画像の定数です。
IDB_VIEW_LARGE_COLOR

定数 説明
VIEW_LARGEICONS 大きいアイコン
VIEW_SMALLICONS 小さいアイコン
VIEW_LIST リスト
VIEW_DETAILS 詳細
VIEW_SORTNAME 名前順で並び替え
VIEW_SORTSIZE サイズ順で並び替え
VIEW_SORTDATE 日付で並び替え
VIEW_SORTTYPE ファイル種類で並び替え
VIEW_PARENTFOLDER ひとつ上のフォルダ
VIEW_NETCONNECT ネットワークドライブに接続
VIEW_NETDISCONNECT ネットワークドライブから切断
VIEW_NEWFOLDER 新しいフォルダ