2005/10/29(Sat)ツールバーモジュール

はてブ数 2005/10/29 6:58 プログラミング::HSP3 つーさ

ちょくとさんとこ参考にママーリ作成。他にもやることたくさんあるのにω

使い方はコメントの通り。
「あらかじめ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