
今回は、システムで定義されているイメージを使ってツールバーを作成してみましょう。また、ボタンとボタンの間にセパレータ(区切り)を入れてみます。
作成手順は前回とあまり変わりません。ただし、ボタンイメージのリストにビットマップを追加する際に、自分でビットマップを作成する必要はなく、 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 にとったとき、
となるように格納していきます。あとは、ボタンの数と 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
今回はシステムビットマップの小さい標準ビットマップを使用しています。他にも、大きいビットマップや、ビュービットマップ(大/小)があるので、いろいろと試してみましょう。