■ ToolBar
POINT
CommonControl なので, 読み込みと初期化必要
Menu より操作が早い
#include < commctrl.h>
#pragma comment(lib,"comctl32.lib")
(
初期化のタイミングでDLLを初期化して、ツールバーを作成
WM_CREATE:
{
INITCOMMONCONTROLSEX cc;
cc.dwSize = sizeof( INITCOMMONCONTROLSEX );
cc.dwICC = ICC_BAR_CLASSES;
// Common Control の初期化
InitCommonControlsEx( &cc );
// 作成するボタンオブジェクトの配列
// ボタンがクリックされると 2 番目で指定した ID が WM_COMMAND に届く。
static TBBUTTON a[] = {
{ 0 , ID_TB_0 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0},
{ 1 , ID_TB_1 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0},
{ 2 , ID_TB_2 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0},
{ 3 , ID_TB_3 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0},
};
// ツールバーを生成
// 32*32 のサイズのボタンを4個作成
HANDLE hToolbar = CreateToolbarEx(
hWnd,
WS_CHILD | WS_VISIBLE,
ID_TOOLBAR_0,
4,
(HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE ),
ID_BITMAP_TOOLBAR ,
a,
4,
32, 32,
32, 32,
sizeof(a)
);
break;
}
ボタンが押されたら WM_COMMAND で処理をする。
WM_COMMAND:
{
if ( LOWORD(wp) == ID_TB_0 ) {
MessageBox( NULL, "ツールバー", "ツールバー", MB_OK );
return 0;
}
break;
}
コモンコントロールの位置を指定する。デフォルトは上部。
CreateToolbarEx( WS_VISIBLE | CCS_BOTTOM )
■ ツールバーに文字を表示する
SAMPLE
文字つきツールバー
DESC
ツールバーボタンに文字を表示するには
TB_ADDSTRING メッセージを送る。
ツールバーは文字のリストを管理している。
次のように \0, \0\0 という形式でツールバーに送る。
TB_ADDSTRING はこのリストへ順番に追加して、新しく追加された最初のインデックスを返す。
各ボタンは iString メンバにこのインデックスを指定する。
ボタン構造体には iString メンバに文字列のポインタを指定する。
ツールバーのスタイルには TBSTYLE_LIST を必ず指定する。
static TBBUTTON tbButton[] = {
{ 0 , 1 , TBSTATE_ENABLED , BTNS_CHECK, 0, 0, 0, (DWORD_PTR)"BOO" },
{ 1 , 2 , TBSTATE_ENABLED , BTNS_CHECK, 0, 0, 0, (DWORD_PTR)"GOO" },
{ 2 , 3 , TBSTATE_ENABLED , BTNS_CHECK, 0, 0, 0, (DWORD_PTR)"TES" },
{ 3 , 4 , TBSTATE_ENABLED , BTNS_CHECK, 0, 0, 0, (DWORD_PTR)"AAA" },
};
HWND hToolbar = CreateToolbarEx(
hWnd,
WS_CHILD | WS_VISIBLE | TBSTYLE_LIST,
ID_TOOLBAR_0,
4,
hInst,
ID_TOOLBAR ,
tbButton,
0, // ボタンの数は0個にしておく。
32, 32, 32, 32, sizeof (TBBUTTON)
);
ボタンに文字を追加するには TB_ADDBUTTONS 経由でボタンを作成する必要がある。
SendMessage( hToolbar , TB_ADDBUTTONS, 4, (LPARAM)tbButton );
別の方法として TB_ADDSTRING で文字列のリストだけをツールバーに設定できる。
// ボタン構造体の iString には文字列リストのインデックスを指定しておく。
static TBBUTTON tbButton[] = {
{ 0 , 1 , TBSTATE_ENABLED , BTNS_CHECK, 0, 0, 0, 0 },
{ 1 , 2 , TBSTATE_ENABLED , BTNS_CHECK, 0, 0, 0, 1 },
{ 2 , 3 , TBSTATE_ENABLED , BTNS_CHECK, 0, 0, 0, 2 },
{ 3 , 4 , TBSTATE_ENABLED , BTNS_CHECK, 0, 0, 0, 3 },
};
HWND hToolbar = CreateToolbarEx(
hWnd,
WS_CHILD | WS_VISIBLE | TBSTYLE_LIST,
ID_TOOLBAR_0,
4,
hInst,
ID_TOOLBAR,
tbButton,
4,
32, 32, 32, 32, sizeof (TBBUTTON)
);
// ツールバー作成後に文字列リストへ登録。
// \0 が区切りで \0\0 が終端記号
char str[] = "aaa\0bbb\0ccc\0ddd\0\0";
SendMessage(hToolbar, TB_ADDSTRING, 0, (LPARAM)str );
■ CreateToolbarEx
SYNTAX
HWND CreateToolbarEx(
HWND hwnd, // ツールバーの親ウィンドウ
DWORD ws, // ツールバーのウィンドウスタイル
UINT wID, // ツールバー のID
int nBitmaps, // ボタンの画像の数
HINSTANCE hBMInst, // インスタンス
UINT wBMID, // ビットマップリソースの識別子
LPCTBBUTTON lpButtons, // ボタン情報
int num, // ボタンの数
int w, h, // ボタンの幅と高さ( Pixel )
int dx, dy, // ボタン画像の幅と高さ ( Pixel )
UINT uStructSize // TBBUTTON 構造体のサイズ
);
RET
N : ツールバーのウィンドウハンドル
NULL : 失敗
DESC
1 つのツールバーウィンドウを作成し
指定されたボタンをツールバーへ追加する
TIP
ボタンの絵を横一列に並べた1つのビットマップ画像を用意する。
すると、関数は1つのボタンのビットマップの横幅 dxBitmap メンバを参考に
nBitmap 分だけ分割して、各ボタンに割り当てる
Toolbar をつくるときのルール
Size は 2 べきでなくても良い。
{ 64*4 , 22 }
WARNING
bmp は index color 形式でないと CreateToolbarEx() で落ちる。
typedef struct _TBBUTTON {
int iBitmap; // ボタンイメージの 0 から数えるインデックスを指定します
// このインデックスは、生成されるボタンとビットマップを関連付けるもので
// ツールバーは、内部でビットマップにインデックスをつけて画像保有している
int idCommand; // ボタンが押されたときの識別ID
BYTE fsState; // 初期状態のフラグ
BYTE fsStyle; // スタイル
DWORD dwData; // アプリケーション用のメモリ領域
int iString;
} TBBUTTON, NEAR* PTBBUTTON, FAR* LPTBBUTTON;
■ TB_ADDSTRING
DESC
ToolBar の String Pool に文字列を追加
wp
String Resource をもつ Instance のハンドル
( lp で 文字列のポインタを指定するなら NULL にしておく )
lp
String Resource の識別子
OR
文字列のポインタ