ツールバーを作成してみる ACT-2

システム定義イメージのツールバー

今回は、システムで定義されているイメージを使ってツールバーを作成してみましょう。また、ボタンとボタンの間にセパレータ(区切り)を入れてみます。


作成手順は前回とあまり変わりません。ただし、ボタンイメージのリストにビットマップを追加する際に、自分でビットマップを作成する必要はなく、 TBADDBITMAP 構造体の hInst メンバに -1 (HINST_COMMCTRL) を、 nID メンバにシステム定義ビットマップを示す値(今回は 0 (IDB_STD_SMALL_COLOR))を指定してから、ツールバーに TB_ADDBITMAP メッセージを送信します。

ボタンを追加していくときにセパレータ(区切り線)を入れたい場合には、 TBBUTTON 構造体の fsStyle メンバに 0x0001 (TBSTYLE_SEP) を指定します。セパレータは、それ自体が1つのアイテムとして扱われます。ツールバーの操作で、ボタンの位置のインデックスを指定する必要がある場合などには、セパレータも1つとして数えなければなりませんので注意してください。

前回と同様に TB_INSERTBUTTON メッセージを使用することもできますが、今回は TB_ADDBUTTONS メッセージを使って、同時に複数個のボタンを追加することにします。それには、 TBBUTTON 構造体の配列にボタンの情報を格納する必要があります。数値型変数 tbb にとったとき、

tbb.0tbb.4 : 1つ目の TBBUTTON 構造体
tbb.5tbb.9 : 2つ目の TBBUTTON 構造体
tbb.10tbb.14 : 3つ目の TBBUTTON 構造体
…………

となるように格納していきます。あとは、ボタンの数と TBBUTTON 構造体の配列のアドレスを指定して TB_ADDBUTTONS メッセージを送信すればボタンが追加されます。

今回はシステム定義ビットマップの中の、標準ビットマップ(小)を使います。このとき、 TBBUTTON 構造体の iBitmap メンバに指定するイメージのインデックスとして、 TB_ADDBITMAP メッセージを送ったときに戻り値として取得されたイメージのインデックスに、以下の値を足したものが指定できるようになっています。

ボタンイメージ
0 (STD_CUT)切り取り
1 (STD_COPY)コピー
2 (STD_PASTE)貼り付け
3 (STD_UNDO)アンドゥ
4 (STD_REDOW)リドゥ
5 (STD_DELETE)削除
6 (STD_FILENEW)新規作成
7 (STD_FILEOPEN)開く
8 (STD_FILESAVE)保存
9 (STD_PRINTPRE)印刷プレビュー
10 (STD_PROPERTIES)プロパティ
11 (STD_HELP)ヘルプ
12 (STD_FIND)検索
13 (STD_REPLACE)置換
14 (STD_PRINT)印刷

サンプルスクリプト

さて、実際にスクリプトを書いてみます。基本的には前回のスクリプトとほぼ同じです。

    #include "llmod.as"
    #include "hsgetmsg.as"
    ; コモンコントロールライブラリ初期化
    dllproc "InitCommonControls", pm, 0, D_COMCTL

    ; ツールバー作成
    pm = 0, 0, 0, 0         ; 座標・サイズは 0 でよい
    pm.4 = 0x50000001       ; WS_CHILD | WS_VISIBLE | CCS_NORESIZE
    pm.5 = 0, 0
    _makewnd pm, "ToolbarWindow32"
    hTool = pm              ; ツールバーのハンドル

    ; TB_BUTTONSTRUCTSIZE メッセージ送信
    pm = hTool, 0x041E, 20, 0
    sendmsg pm

    ; システム定義イメージをボタンイメージのリストに追加
    ; TBADDBITMAP 構造体
    tbadd.0 = -1            ; HINST_COMMCTRL
    tbadd.1 = 0             ; IDB_STD_SMALL_COLOR

    ;TB_ADDBITMAPメッセージを送信
    pm = hTool, 0x0413
    pm.2 = 0                ; イメージ数(システム定義イメージでは無視)
    getptr pm.3, tbadd      ; TBADDBITMAP 構造体のアドレス
    sendmsg pm
    idxStd = stat           ; ここでは必ず0になるのであえて保存する必要はない

    ; ボタンを追加
    ; TBBUTTON 構造体の配列
    dim tbb, 50             ; 要素数は (ボタンの数 * 5)
    tbb.0  = idxStd+ 6, 1, 0x04, 0, 0  ;「新規作成」ボタン
    tbb.5  = idxStd+ 7, 2, 0x04, 0, 0  ;「開く」ボタン
    tbb.10 = idxStd+ 8, 3, 0x04, 0, 0  ;「保存」ボタン
    tbb.15 =         0, 0, 1<<8, 0, 0  ;「セパレータ」ボタン
    tbb.20 = idxStd+ 0, 4, 0x04, 0, 0  ;「切り取り」ボタン
    tbb.25 = idxStd+ 1, 5, 0x04, 0, 0  ;「コピー」ボタン
    tbb.30 = idxStd+ 2, 6, 0x04, 0, 0  ;「貼り付け」ボタン
    tbb.35 =         0, 0, 1<<8, 0, 0  ;「セパレータ」ボタン
    tbb.40 = idxStd+ 3, 7, 0x04, 0, 0  ;「アンドゥ」ボタン
    tbb.45 = idxStd+12, 8, 0x04, 0, 0  ;「検索」ボタン

    ;TB_ADDBUTTONSメッセージを送信
    pm = hTool, 0x0414
    pm.2 = 10               ; 追加するボタンの数
    getptr pm.3, tbb        ; TBBUTTON 構造体の配列の先頭アドレス
    sendmsg pm

    ; TB_AUTOSIZE メッセージ送信
    pm = hTool, 0x0421, 0, 0
    sendmsg pm

    ; ウィンドウのサブクラス化
    gsel 0
    set_subclass                ; サブクラス化
    hwnd = stat                 ; メインウィンドウのハンドル
    set_message 0x0111          ; WM_COMMAND を取得するように設定
    ; メッセージパラメータ用変数
    dup msg,  msgval.1          ; メッセージが格納される変数
    dup wprm, msgval.2          ; wParamパラメータが格納される変数
    dup lprm, msgval.3          ; lParamパラメータが格納される変数


*mainloop
    get_message msgval
    if msgval == hwnd {
        if msg == 0x0111 : gosub *onCommand
    } else {
        wait 10
    }
    goto *mainloop

*onCommand
    ; WM_COMMANDが送られたとき
    ; ツールバー以外から送られた場合は何もしない
    if lprm != hTool : return

    cmdID = wprm & 0xFFFF       ; 押されたボタンのコマンドID
    if cmdID == 1 : s = "新規作成"
    if cmdID == 2 : s = "開く"
    if cmdID == 3 : s = "保存"
    if cmdID == 4 : s = "切り取り"
    if cmdID == 5 : s = "コピー"
    if cmdID == 6 : s = "貼り付け"
    if cmdID == 7 : s = "アンドゥ"
    if cmdID == 8 : s = "検索"
    dialog "「"+s+"」ボタンが押されました"
    return

今回はシステムビットマップの小さい標準ビットマップを使用しています。他にも、大きいビットマップや、ビュービットマップ(大/小)があるので、いろいろと試してみましょう。