ツールバーとイメージリスト
ツールバーボタンに使用する画像は、ツールバーに直接登録するほかにイメージリストを使用することもできます。
ツールバーでイメージリストを使用する場合、ツールバーに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;
}
複数のイメージリストの設定
ツールバーには複数のイメージリストを同時に設定することができます。
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;
}
実行結果は先ほどと同じです。
最初にイメージリストを作成し、インデックス「0」でツールバーに登録しています。
このイメージリストには標準ボタンを登録しています。
次に新しくイメージリストを作成し、自作のビットマップ画像を登録しています。
これをインデックス「1」でツールバーに登録しています。
登録したイメージリストからはMAKELONGマクロで「(画像インデックス, イメージリストインデックス)」と言う形式で画像を指定することができます。