2005/10/29(土)ツールバーモジュール
ちょくとさんとこ参考にママーリ作成。他にもやることたくさんあるのにω
使い方はコメントの通り。
「あらかじめADDするんではなくて1つのボタンを追加するごとにイメージやテキストを設定するアプローチの方がいいんでないかなぁ」などと思ったのだけど、めんどくさ……。
/*
CreateBmpObj(x,y, w,h)
ビットマップ(DDB)オブジェクトを作り、ハンドルを返す。
現在の操作先ウィンドウの x,yからw,hの画像を格納する。
toolbar_Create ウィンドウスタイル, ボタン幅, ボタン高さ
ツールバーを作成し、ハンドルを返す。
スタイルには以下のをor(|)組み合わせで指定できる。
$200 改行可能 / $800 フラット
$1000 ボタンの右に文字列
toolbar_AddString ハンドル, 文字列配列, ボタン数
ボタン文字列を追加
toolbar_AddString ハンドル, hBitmap, ボタン数
ボタンイメージを追加
toolbar_AddButton ハンドル, ボタンindex, state, style
ボタンを追加する。
state = 通常 $4 のみ指定すればよい
$1 押されている(ON/OFF可能ボタン)
$2 押されている / $4 有効である
$8 不可視 / $10 灰色 / $20 直前で改行
style = 通常 0 でよい
$1 区切り線 / $2 ON/OFF可能 / $4 グループトグル
押されると親ウィンドウにWM_COMMANDが送られてくる。
lparam が ツールバーハンドルと一致した場合のみ処理する。
*/
#module
#defcfunc CreateBmpObj int x, int y, int w, int h
#uselib "gdi32.dll"
#cfunc CreateDC "CreateDCA" sptr,nullptr,nullptr,nullptr
#cfunc CreateCompatibleBitmap "CreateCompatibleBitmap" int,int,int
#cfunc CreateCompatibleDC "CreateCompatibleDC" int
#func SelectObject "SelectObject" int,int
#func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int
#func DeleteDC "DeleteDC" int
#func DeleteObject "DeleteObject" int
#cfunc GetStockObject "GetStockObject" int
hDisplayDC = CreateDC("DISPLAY")
hBitMap = CreateCompatibleBitmap(hDisplayDC, w, h)
hCcDc = CreateCompatibleDC(hDisplayDC)
SelectObject hCcDc, hBitMap
BitBlt hCcDc, 0,0, w,h, hDc, x,y, 0x00CC0020
DeleteDC hDisplayDC
DeleteDC hCcDc
return hBitMap
#deffunc DeleteBmpObj int hBmp
DeleteObject hBmp
return stat
#global
#module
#uselib "comctl32.dll"
#func InitCommonControls "InitCommonControls"
#func CreateToolbarEx "CreateToolbarEx" int,int,int,int,int,int,int,int,int,int,int,int,int
#deffunc toolbar_Create int Style, int w, int h
InitCommonControls
winobj "ToolbarWindow32","",0,Style|$50000000
hTb = objinfo(stat,2)
sendmsg hTb, 0x041E, 20, 0 ;// TB_BUTTONSTRUCTSIZE
sendmsg hTb, 0x0420, 0, w | (h << 16) ;// TB_SETBITMAPSIZE
return hTb
#deffunc toolbar_AddBitmap int _hTb, int _hBmp, int _btns,
tbadd = 0,_hBmp : sendmsg _hTb,0x0413,_btns,varptr(tbadd)
return stat
#deffunc toolbar_AddString int _hTb, array Src, int _n
len=1 : repeat _n : len+=strlen(Src.cnt)+1 : loop
sdim Dst,len : len=0 :
repeat _n : poke Dst,len,Src.cnt : len+=strlen(Src.cnt)+1 : loop
sendmsg _hTb,$41C,_btns,varptr(Dst)
return stat
#deffunc toolbar_AddButton int _hTb, int _id, int _stat, int _style
dim tb,5 : tb = _id,_id, _stat|_style<<8, _id, _id
sendmsg _hTb,$414,1,varptr(tb) ;// TB_ADDBUTTON
sendmsg _hTb,$421,0,0 ;// TB_AUTOSIZE
return stat
#global ;// モジュール終わり
Buttons = 6 ;// ボタンの数
ImgW = 16 ;// 画像(1つあたり)の幅
ImgH = 16 ;// 画像の高さ
ImgFn = "ico.bmp" ;// ボタン画像(横一列)
sdim teststr,64,Buttons
teststr = "あいうえお","かきくけこ","さしすせそ"
teststr.3 = "たちつてと","なにぬねの","はひふへほ"
picload ImgFn,1
hBmp = CreateBmpObj(0,0,ImgW*Buttons,ImgH)
toolbar_Create $800|$200,ImgW,ImgH : hToolBar = stat
toolbar_AddString hToolBar, teststr, Buttons
toolbar_AddBitmap hToolBar, hBmp , Buttons
repeat Buttons
toolbar_AddButton hToolBar, cnt, 4, 0
loop
#define WM_COMMAND $111
oncmd gosub *onCommand, WM_COMMAND
stop
*onCommand
if lparam!=hToolbar : return
dialog "ボタン「"+teststr.wparam+"」が押されました。"
return 0