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