ツールバー(ToolBar)





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 https://www.dropbox.com/s/tdb2vr5n2t277kz/toolbar_string.exe( 文字つきツールバー ) 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 文字列のポインタ