HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1130
Richツールバーのカスタマイズ [TB_CUSTOMIZE]13解決


Rich

リンク

2015/11/30(Mon) 16:50:42|NO.73346

ツールバーを本格的に作ろうと、ツールバーのカスタマイズ機能をいれようと試みました。
しかし、ツールバーのカスタマイズ画面が表示しません。
どなたか教えてくれませんか?

#uselib "comctl32.dll" #func InitCommonControls "InitCommonControls" #define WM_COMMAND 0x0111 #define WM_NOTIFY 0x004E #define TBN_DROPDOWN -710 #define TB_BUTTONSTRUCTSIZE 0x041E #define TB_ADDBITMAP 0x0413 #define TB_AUTOSIZE 0x0421 #define TB_ADDBUTTONS 0x0414 #define TB_SETEXTENDEDSTYLE 0x0454 #define TB_GETRECT 0x0433 #define TB_CUSTOMIZE 0x0427 #define TBSTYLE_EX_DRAWDDARROWS 1 screen 0, 300, 200 oncmd gosub *OnCommand, WM_COMMAND onexit gosub *OnClose InitCommonControls winobj "ToolbarWindow32","",0,$50000801,0,0 hTool = objinfo_hwnd(stat) sendmsg hTool, TB_BUTTONSTRUCTSIZE, 20, 0 sendmsg hTool, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS tbadd(0) = -1 ; HINST_COMMCTRL tbadd(1) = 0 ; IDB_STD_SMALL_COLOR sendmsg hTool, TB_ADDBITMAP, 0, varptr(tbadd) tbb( 0) = 6, 1, 0x04, 0, 0 ;「新規作成」ボタン tbb( 5) = 7, 2, 0x04, 0, 0 ;「開く」ボタン tbb(10) = 8, 3, 0x04, 0, 0 ;「保存」ボタン tbb(15) = 0, 0, 1<<8, 0, 0 ;「セパレータ」ボタン tbb(20) = 0, 4, 0x04, 0, 0 ;「切り取り」ボタン tbb(25) = 1, 5, 0x04, 0, 0 ;「コピー」ボタン tbb(30) = 2, 6, 0x04, 0, 0 ;「貼り付け」ボタン tbb(35) = 0, 0, 1<<8, 0, 0 ;「セパレータ」ボタン tbb(40) = 3, 7, 0x04, 0, 0 ;「アンドゥ」ボタン tbb(45) = 12, 8, 0x04, 0, 0 ;「検索」ボタン sendmsg hTool, TB_ADDBUTTONS, 10, varptr(tbb) sendmsg hTool, TB_AUTOSIZE, 0, 0 button gosub "カスタマイズ...",*ToolCustomize stop *OnCommand if lparam!hTool:return itemId = wParam & $FFFF dialog "コマンドID:"+itemId return *OnClose end *ToolCustomize;カスタマイズ sendmsg hTool,TB_CUSTOMIZE,0,0;←問題点 return



この記事に返信する


MIZUSHIKI

リンク

2015/12/1(Tue) 01:24:04|NO.73357

どうやら TB_CUSTOMIZE の定数が違うみたいです。
正しくは

#define TB_CUSTOMIZE 0x041B
だそうです。
ただ、私も修正して試してみましたがウィンドウが一瞬表示されるだけで消えちゃいますね。
・・・?

ちょっとそれ以上は調べてないのですが、とりあえず取っ掛かりにはなるかもと思い、
コメントさせて頂きました。



暇人

リンク

2015/12/2(Wed) 21:26:23|NO.73373

NO.73357の修正を加えて
oncmdにWM_NOTIFYを設定して割り込みさせて
割り込み来たらlparamをNMHDR構造体ポインタとしてdupptrして
hwndFromを確認してcodeが

#const global TBN_QUERYDELETE -707 #const global TBN_QUERYINSERT -706
なら

return 1
で、閉じるまで消えなくなる

でもこれだけじゃ削除は出来るが追加が・・・
後で追加出来るようにしたのを書き込むかも



kanamaru

リンク

2015/12/2(Wed) 23:00:33|NO.73374

どうやら、調べてみたところ、
TBN_GETBUTTONINFO
TBN_RESET
TBN_CUSTHELP
TBN_BEGINADJUST
TBN_BEGINDRAGTBN_ENDDRAG
TBN_ENDADJUST
TBN_TOOLBARCHANGE
などを処理する必要もあるらしいです。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_142.htm



暇人

リンク

2015/12/3(Thu) 00:08:06|NO.73376

とりあえず問題なく動いてるが正しいのかは不明

ボタンを削除してからツールバー変更ウィンドウを閉じて
再度ツールバー変更ウィンドウを表示しても
利用できるツールバーボタンには出てこない(何か方法あるんだろう)
リセット押すと初期設定に戻る


#uselib "comctl32.dll" #func InitCommonControls "InitCommonControls" #define WM_COMMAND 0x0111 #define WM_NOTIFY 0x004E #define TBN_DROPDOWN -710 #define TB_BUTTONSTRUCTSIZE 0x041E #define TB_ADDBITMAP 0x0413 #define TB_AUTOSIZE 0x0421 #define TB_ADDBUTTONS 0x0414 #define TB_SETEXTENDEDSTYLE 0x0454 #define TB_GETRECT 0x0433 #const TB_BUTTONCOUNT 0x0418 #const TB_DELETEBUTTON 0x0416 #define TB_CUSTOMIZE 0x041B #define TBSTYLE_EX_DRAWDDARROWS 1 screen 0, 300, 200 oncmd gosub *OnCommand, WM_COMMAND oncmd gosub *OnNotify, WM_NOTIFY onexit gosub *OnClose InitCommonControls winobj "ToolbarWindow32","",0,$50000801,0,0 hTool = objinfo_hwnd(stat) sendmsg hTool, TB_BUTTONSTRUCTSIZE, 20, 0 sendmsg hTool, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS tbadd(0) = -1 ; HINST_COMMCTRL tbadd(1) = 0 ; IDB_STD_SMALL_COLOR sendmsg hTool, TB_ADDBITMAP, 0, varptr(tbadd) //コマンドID順ボタンデータリスト toolbardat(0) = 0, 0, 1<<8, 0, 0 ;「セパレータ」ボタン toolbardat(5) = 6, 1, 0x04, 0, 0 ;「新規作成」ボタン toolbardat(10) = 7, 2, 0x04, 0, 0 ;「開く」ボタン toolbardat(15) = 8, 3, 0x04, 0, 0 ;「保存」ボタン toolbardat(20) = 0, 4, 0x04, 0, 0 ;「切り取り」ボタン toolbardat(25) = 1, 5, 0x04, 0, 0 ;「コピー」ボタン toolbardat(30) = 2, 6, 0x04, 0, 0 ;「貼り付け」ボタン toolbardat(35) = 3, 7, 0x04, 0, 0 ;「アンドゥ」ボタン toolbardat(40) = 12, 8, 0x04, 0, 0 ;「検索」ボタン tbdarmax=length(toolbardat)/5 //配置順リスト tblist=1,2,3,0,4,5,6,0,7,8 tbmax=length(tblist) //配置順リストに従ってボタンデータをコピー dim tbb,tbmax*5 repeat tbmax tbbid=tblist(cnt) memcpy tbb(cnt*5),toolbardat(tbbid*5),4*5 loop sendmsg hTool, TB_ADDBUTTONS, tbmax, varptr(tbb) sendmsg hTool, TB_AUTOSIZE, 0, 0 dellist="0\n"//削除リスト初期設定(セパレータは最初から削除された側にあるので) button gosub "カスタマイズ...",*ToolCustomize stop *OnCommand if lparam!hTool:return itemId = wParam & $FFFF dialog "コマンドID:"+itemId return /* 通知コード */ #const TBN_BEGINADJUST -703 #const TBN_BEGINDRAG -701 #const TBN_CUSTHELP -709 #const TBN_ENDADJUST -704 #const TBN_ENDDRAG -702 #const TBN_GETBUTTONINFOW -720 #const TBN_GETBUTTONINFOA -700 #const TBN_QUERYDELETE -707 #const TBN_QUERYINSERT -706 #const TBN_RESET -705 #const TBN_TOOLBARCHANGE -708 #const TBN_DELETINGBUTTON -715 *OnNotify dupptr NMHDR_dup,lParam,4*10,4 if NMHDR_dup=hTool {//hwndFrom switch NMHDR_dup(2) //code case TBN_QUERYINSERT return 1 case TBN_QUERYDELETE return 1 case TBN_DELETINGBUTTON //削除された if NMHDR_dup(3) ! 0 {//コマンドID0以外 notesel dellist noteadd str(NMHDR_dup(3)),1,0 //削除されたIDをリスト化 noteunsel } swbreak case TBN_RESET sendmsg hTool,TB_BUTTONCOUNT,0,0 BUTTONCOUNT=stat repeat BUTTONCOUNT sendmsg hTool,TB_DELETEBUTTON,0,0 loop sendmsg hTool, TB_ADDBUTTONS, tbmax, varptr(tbb) dellist="0\n" //削除リスト初期設定 swbreak case TBN_GETBUTTONINFOA index = NMHDR_dup(4) //追加時(?)に選択されてるインデックス notesel dellist if index < notemax { noteget addid_str,index addid=int(addid_str) if addid ! 0 { //コマンドIDが0以外ならボタンデータをコピー notedel index //追加されたコマンドIDを削除されたIDリストから削除 memcpy NMHDR_dup(4),toolbardat(5*addid),5*4 } noteunsel return 1 } noteunsel return 0 default swbreak swend } return *OnClose end *ToolCustomize;カスタマイズ sendmsg hTool,TB_CUSTOMIZE,0,0 return



Rich

リンク

2015/12/3(Thu) 17:56:03|NO.73382

皆さんありがとうございます!
よくできています。
自分のスクリプトに取り入れようと思います。



暇人

リンク

2015/12/3(Thu) 20:29:27|NO.73386

削除、追加ボタンでの変更は問題ないが
上へ、下へは区切り以外問題あり。

利用できるボタン側のウィンドウからWM_NOTIFYが来ないのが問題っぽい
コールバック内でやる必要がある?



kanamaru

リンク

2015/12/3(Thu) 20:38:36|NO.73387

僕が示したURLを見た感じだと、
・TB_SAVERESTOREが処理されてない
・ウィンドウプロシージャが定義されてない。
らへんに原因がありそうです。
にしてもレジストリいじらない方法ないかな?



暇人

リンク

2015/12/4(Fri) 19:30:57|NO.73407

TBN_GETBUTTONINFOAが飛んできたときのNMHDR_dupの内容が
>85135264 0 -700 0 0 385 0 43323770 4510136 128

85135264 ツールバーハンドル 0 コントロールID -700 通知コード 0 ? 0 リストボックスのインデックス 385 ? 0 ? 43323770 現在のツールバーボタン側のリストボックスハンドル 4510136 ? 128 ?
利用できるツールバーボタン側のリストボックスハンドルも来てくれれば楽なんだけどな・・・


>・TB_SAVERESTOREが処理されてない
これは意図的に対応しなかった
(ファイルに保存は付けるかも)

>・ウィンドウプロシージャが定義されてない。
コールバックモジュールつかってツールバーの変更ダイアログのプロシージャ差し替えて
やってみたら工夫すれば、左右どちらのインデックスなのか場合別け出来そう
これが出来るなら削除時にコマンドID保持する必要も無くなる・・・


自己レス
>利用できるツールバーボタンには出てこない(何か方法あるんだろう)
方法は分かった(正しい方法かは不明)



暇人

リンク

2015/12/5(Sat) 10:02:31|NO.73422

とりあえずコールバックモジュール使えば追加削除上下ボタンドラックドロップの対応は出来た
でもテキスト有りだと左から右のリストボックスに入れるとツールバー側のボタンが文字化けする
リストボックス側は普通に表示されてる(半角1文字なら大丈夫だが・・・)

削除したのを再度ツールバーの変更開いたときに左側に削除済みボタンを表示するのも出来た
上のバグが取れたら書き込む



暇人

リンク

2015/12/5(Sat) 11:32:11|NO.73424

TBBUTTON構造体のiStringに文字列バッファのアドレスじゃなく
TB_ADDSTRINGで設定したインデックスにすれば問題無い様子・・・
空白にしたい場合はインデックスを-1とかインデックス外にする



暇人

リンク

2015/12/7(Mon) 18:35:14|NO.73490

>でもテキスト有りだと左から右のリストボックスに入れるとツールバー側のボタンが文字化けする
これは自分の勘違いだった・・・
ツールバー変更ダイアログ上で追加は新しくボタン作るんだから
文字列入れてる変数に何かしてたらそりゃ文字化けもするな・・・



暇人

リンク

2015/12/30(Wed) 04:57:19|NO.73855

複数のツールバー使うときにモジュールにしといた方が便利そうだなと色々やってたら・・・

基本的な流れ

SetTBButtonData でボタンデータIDを指定してボタンデータを登録
ToolBarAddPic で画像ファイル名やウィンドイバッファIDか-1 (HINST_COMMCTRL)を指定して画像登録
ToolBarAddButtons でツールバーハンドルとボタンデータIDを指定してコマンドIDリストを渡してボタン設置(必ず一回は実行)
(後から挿入はToolBarInsertButton)
全部のツールバー配置が終ったら
ToolBarLoad で復元処理
ToolBarReset で画像の大きさやテキストの表示方法の変更が出来る

終了時に
ToolBarSave で保存(ツールバーの座標サイズは保存してない)

ツールバー右クリックメニューからかダブルクリックで変更ダイアログが開く
おまけでテキスト表示切替や画像の大きさ変更のコンボボックスも付けた

#module "mod_tbCustomize" noInsButList,noDelButList,ButtonOnList,ButtonOnMax,TBBD_ID,HTB_List,HTBNumber,BitmapIndex,CommandID,StateStyle,Data,StringIndex,StringList,ButtonOn,ButtonDef,ButtonIDList_str,InitialNumber,BTF,SmallLarge,LeftLBHWND,RightLBHWND #define global TOOLBAR_FIRSTID 256 //最初にToolBarAddButtons実行した時に設定されるコントロールID #define global TOOLBAR_LASTID TOOLBAR_LASTID@mod_tbCustomize //最後にToolBarAddButtons実行した時に設定されるコントロールID #uselib "user32.dll" #func SetWindowLong "SetWindowLongA" int,int,int #cfunc GetWindowLong "GetWindowLongA" int,int #cfunc GetDC "GetDC" int #func GetWindowText "GetWindowTextA" int,var,int #cfunc GetWindow "GetWindow" int, int #func GetClassName "GetClassNameA" int, var,int #cfunc GetAncestor "GetAncestor" int,int #cfunc IsWindow "IsWindow" int #func ReleaseDC "ReleaseDC" int,int #func MoveWindow "MoveWindow" int,int,int,int,int,int #func GetClientRect "GetClientRect" int,var #func GetWindowRect "GetWindowRect" int,var #func ScreenToClient "ScreenToClient" int,int #uselib "gdi32.dll" #func GetTextExtentPoint32 "GetTextExtentPoint32A" int,sptr,int,var #cfunc CreateDIBitmap "CreateDIBitmap" int,int,int,int,int,int #func DeleteDC "DeleteDC" int #func DeleteObject "DeleteObject" int #enum TBHEAD_SIZE = 0 //ヘッダ要素数 #enum TBHEAD_INDEX //ツールバーハンドルリストインデックス #enum TBHEAD_NB //設置ボタン数 #enum TBHEAD_FTB //テキスト表示設定 #enum TBHEAD_SL //画像大小設定 #enum TBHEAD_STYLE //ツールバースタイル #enum HEADSIZE //ツールバー設定情報等を保存するヘッダ要素数(これを変更すると変更前に保存した物は読み込めない) ////---------------ツールバー情報をファイルから読み込みボタンを復元する //[ ToolBarSave name, nbh, htblist ] // name : ロードファイル名 // htblist : ロードして復元するツールバーのハンドルが入った配列「セーブしたときと同じ順序,数でハンドルが入ってる必要がある」 // stf : 復元時にボタンステータスも復元するかの設定(省略時0)「0なら復元する」 // shidx : 復元するツールバーのハンドルが入ってる要素数(省略時0)「0なら最初から復元」 // ntbh : 復元するツールバーの数(省略時0)「shidxから何個復元するか、0なら残り全て」 //戻り値1:statが0ならファイルがあった、-1なら無かった //戻り値2:refstrに復元したボタンのコマンドIDが返る「","で区切られてツールバー毎に改行されてる」 #deffunc ToolBarLoad str name,array htblist,int stf,int shidx,int ntbh,local index,local total_savesize,local chksum exist name if strsize<0 {return -1} total_savesize=strsize-4 //チェックサム分の4バイトを除く dim slist,strsize/4 bload name,slist repeat total_savesize/4 chksum+lpeek(slist,cnt*4)+HEADSIZE loop if chksum ! lpeek(slist,total_savesize) {dialog name+" が壊れてる可能性があります":return -1} tbbid_list_refstr="" _ntbh=ntbh repeat sdim tbbid_list_str hidx=slist(index+TBHEAD_INDEX) if length(htblist)<=hidx {break} h_tb=htblist(hidx) _nb=slist(index+TBHEAD_NB) if hidx>=shidx {_ntbh--} TBLOCALID=GetWindowLong(h_tb,-12)-TOOLBAR_FIRSTID if TBLOCALID>=0 and hidx>=shidx { sendmsg h_tb,0x0418,0,0//TB_BUTTONCOUNT if stat>0{ repeat stat sendmsg h_tb,0x0416,0,0 //TB_DELETEBUTTON loop } repeat _nb _index=index+HEADSIZE+cnt*5 tbbid_list_str+=str(slist(_index+1)) if (cnt+1)>=_nb{break} tbbid_list_str+"," loop MVI=MODINDEX(TBLOCALID) set_bttexonoff _TBBUTTON(MVI),slist(index+TBHEAD_FTB) _ftb=stat set_SmallLarge _TBBUTTON(MVI),slist(index+TBHEAD_SL) _SL=stat sendmsg h_tb, 0x0438, 0,(slist(index+TBHEAD_STYLE)|4)^4//TB_SETSTYLE ToolBarAddButtons h_tb,get_tbbdid(_TBBUTTON(MVI)),_nb,tbbid_list_str,_ftb,_SL index+HEADSIZE repeat _nb*(stf=0) sendmsg h_tb,0x0411,slist(index+cnt*5+1),slist(index+cnt*5+2)&$ff //TB_SETSTATE loop tbbid_list_refstr+tbbid_list_str }else{index+HEADSIZE} index+=_nb*5 if index*4>=total_savesize or (_ntbh=0 and ntbh!0) {break} tbbid_list_refstr+"\n" loop mref _stat,64 _stat=0 return tbbid_list_refstr ////---------------ツールバー情報をファイルに保存 //[ ToolBarSave name, nbh, htblist ] // name : セーブファイル名 // ntbh : 保存するツールバーの数 // htblist : 保存するツールバーのハンドルが入った配列 #deffunc ToolBarSave str name,int ntbh,array htblist,local total_savesize,local chksum //セーブデータ構造(HEADSIZEはヘッダ要素数) //save_tbdat(0)=HEADSIZE,ツールバーハンドルリストインデックス,設置ボタン数,テキスト表示設定,画像大小設定 //save_tbdat(HEADSIZE〜)=TBBUTTON構造体が設置ボタン数分続く //二つ目のツールバーはヘッダ要素数から始める //最後に簡単なチェックサムを4バイト追加して保存 dim GETBUTTON,5 sdim slist,1024 sdim save_tbdat repeat ntbh h_tb=htblist(cnt) TBLOCALID=GetWindowLong(h_tb,-12)-TOOLBAR_FIRSTID if TBLOCALID<0 { continue } sendmsg h_tb,0x0418,0,0//TB_BUTTONCOUNT bcnt(cnt)=stat memexpand save_tbdat,bcnt(cnt)*20+HEADSIZE*4 dupptr save_tbdat_dup,varptr(save_tbdat),bcnt(cnt)*20+HEADSIZE*4,4 MVI=MODINDEX(TBLOCALID) set_bttexonoff _TBBUTTON(MVI),-1 _ftb=stat set_SmallLarge _TBBUTTON(MVI),-1 _SL=stat _tbbdid=get_tbbdid(_TBBUTTON(MVI)) sendmsg h_tb, 0x0439, 0, 0//TB_GETSTYLE save_tbdat_dup=HEADSIZE,cnt,bcnt(cnt),_ftb,_SL,stat //一つのツールバーの基本情報 if bcnt(cnt)>0 { repeat bcnt(cnt) sendmsg h_tb,0x0417,cnt,varptr(save_tbdat_dup(cnt*5+HEADSIZE))//TB_GETBUTTON loop } savesize=bcnt(cnt)*20+HEADSIZE*4 memexpand slist,total_savesize+savesize+4 memcpy slist,save_tbdat_dup,savesize,total_savesize total_savesize+savesize loop if total_savesize>0 { repeat total_savesize/4 chksum+lpeek(slist,cnt*4)+HEADSIZE loop lpoke slist,total_savesize,chksum bsave name,slist,total_savesize+4 } return ////---------------IDを指定してTBBUTTON構造体を登録する //[ SetTBButtonData tbbdid, ntbb, tbbdat, bmSI, bmLI, bmSS, bmLS } // tbbdid : ボタンデータID「任意で0以上を指定」 // ntbb : 登録するTBBUTTONの数 // tbbdat : 登録するTBBUTTON構造体 // bmSI : 小さい画像のBITMAPインデックス「通常0か省略してください」( 同じボタンデータIDの場合bmSI, bmLI, bmSS, bmLSは初回のみ有効) // bmLI : 大きい画像のBITMAPインデックス「最初に大きい画像をTB_ADDBITMAPした時の戻り値を指定」(サイズが一種類なら0か省略) // bmSS : 小さい画像のサイズ(規定値16)「0の場合16を設定」 // bmLS : 大きい画像のサイズ(規定値24)「0の場合24を設定、但しbmLIが0の場合bmSSと同じにして大小の設定の影響を無くす」 #deffunc SetTBButtonData int tbbdid, int ntbb,var tbbdat,int bmSI,int bmLI,int bmSS,int bmLS tbbindexon(tbbdid) | 0 if tbbindexon(tbbdid)=0 { newmod _TBBUTTON,mod_tbCustomize,tbbdid,ntbb tbbindex(tbbdid)=stat tbbindexon(tbbdid)=1 bitmapstartindex(tbbdid*2)=bmSI,bmLI bitmapsize(tbbdid*2)=bmSS+(bmSS=0)*16 bitmapsize(tbbdid*2+1)=bmLS+((bmLI=0) and (bmLS=0))*bitmapsize(tbbdid*2)+((bmLI>0) and (bmLS=0))*24 bitmapstartindex(tbbdid*2+1)=(bitmapstartindex(tbbdid*2+1)*bitmapsize(tbbdid*2))/bitmapsize(tbbdid*2+1) } dupptr tbbdat_dup, varptr(tbbdat),ntbb*20,4 repeat ntbb set_modbt _TBBUTTON(tbbindex(tbbdid)),tbbdat_dup,cnt loop return ////---------------ボタンデータIDとコマンドIDリストを渡してツールバーにボタンを追加する //[ ToolBarAddButtons htb, tbbdid, nb, tbbid_list, tbbtexf, SL ](ツールバーを作った後に必ず一回は実行する必要がある) // htb : ツールバーハンドル // tbbdid : ボタンデータID「SetTBButtonDataで指定したID」(同じツールバーハンドルに違うボタンデータIDを使用しても無視されます) // nb : 追加するボタンの数「0の場合もツールバーのサイズ調整とモジュール内設定が行われるので必ず実行してください」 // tbbid_list : 追加するボタンのIDリスト「int型配列か "1,2,0,3,4" 形式が入ったstr型変数での指定も出来る」 // tbbtexf : テキストの表示有無指定「0=下にテキスト表示、1=右にテキスト表示、2=TBSTYLE_LISTを設定しBTNS_SHOWTEXTが指定される物のみテキスト表示、3=TBSTYLE_LISTを設定しBTNS_SHOWTEXTを削除してテキスト非表示」 // SL : 画像の大きい小さい指定「0=小さい、1=大きい 」 #deffunc ToolBarAddButtons int htb,int tbbdid, int nb,var tbbid_list, int tbbtexf,int SL dim GETBUTTON,5 dim rows,4 dim rect,4 if nb { if vartype(tbbid_list)=2 { dup temp_dup, tbbid_list split temp_dup,",",tbidlist_str dim tbidlist,nb repeat nb tbidlist(cnt)=int(tbidlist_str(cnt)) loop dupptr tbidlist_dup,varptr(tbidlist),nb*4,4 }else{ dupptr tbidlist_dup, varptr(tbbid_list),nb*4,4 } } if GetWindowLong(htb,-12)>=TOOLBAR_FIRSTID {//GWL_ID TBLOCALID=stat-TOOLBAR_FIRSTID MVI=MODINDEX(TBLOCALID) set_bttexonoff _TBBUTTON(MVI),-1 : _ftb=stat set_SmallLarge _TBBUTTON(MVI),-1 : _SL=stat }else{ TBLOCALID=ADDTBID MVI=tbbindex(tbbdid) MODINDEX(TBLOCALID)=MVI TOOLBAR_LASTID=TOOLBAR_FIRSTID+TBLOCALID ADDTBID++ SetWindowLong htb,-12,TOOLBAR_FIRSTID+TBLOCALID Initial_ToolBar _TBBUTTON(MVI),htb,nb,tbidlist_dup,tbbtexf,SL,_ftb,_SL VertWidthLiset(TBLOCALID) | 0 if VertWidthLiset(TBLOCALID)=0 {VertWidthLiset(TBLOCALID)=48} sendmsg htb, 0x0439, 0, 0//TB_GETSTYLE style_def(TBLOCALID)=stat } _tbbdid=get_tbbdid(_TBBUTTON(MVI)) sendmsg htb, 0x0439, 0, 0//TB_GETSTYLE style_temp=stat VERT=style_temp&$80 if _ftb=0 {style_temp=((stat| 0x1000)^0x1000)| (((style_temp&$88)>0)*(stat&$1)*4) }else{style_temp=((stat| 0x1000) )| (((style_temp&$88)>0)*(stat&$1)*4) } if (style_def(TBLOCALID)&4)=0 and VERT=0{ if ((style_temp&4)=4) and ((style_temp&8)=0) {style_temp^4} } sendmsg htb, 0x0438, 0,style_temp//TB_SETSTYLE testfsize=" " dim mes_size_bt,2 t_dc=GetDC(htb) GetTextExtentPoint32 t_dc,testfsize,strlen(testfsize),mes_size_bt //ツールバーのフォントの高さを取得(手抜き) ReleaseDC htb,t_dc sendmsg htb, 0x0420, 0,(bitmapsize(_tbbdid*2+_SL)<<16)|bitmapsize(_tbbdid*2+_SL) //TB_SETBITMAPSIZE if nb { dim tbb,5*nb if VERT { if _ftb<=1 {substyle=$1000}else{substyle=$4000} if _ftb=2 {addstyle=$20:substyle=0}else{addstyle=$5060} }else{addstyle=$5000*(_ftb=1)} repeat nb get_modbtlist _TBBUTTON(MVI),tbb,tbidlist_dup,cnt if (tbb(cnt*5+2)&256)=0 {tbb(cnt*5)+bitmapstartindex(_tbbdid*2+_SL)} if VERT {tbb(cnt*5+2)=(tbb(cnt*5+2)|addstyle)^substyle}else{tbb(cnt*5+2)|addstyle} loop sendmsg htb,0x0414, nb, varptr(tbb)//TB_ADDBUTTONS }else{ sendmsg htb,0x0418,0,0//TB_BUTTONCOUNT if stat=0 { GETBUTTON=-1,0,0,0,varptr(testfsize) sendmsg htb,0x0414, 1, varptr(GETBUTTON)//TB_ADDBUTTONS } } if VERT{ dim rect,4 if _ftb=0 { sendmsg htb,0x041f, 0, ((bitmapsize(_tbbdid*2+_SL)+mes_size_bt(1))<<16)|VertWidthLiset(TBLOCALID)// TB_SETBUTTONSIZE }else{ sendmsg htb,0x041f, 0, $10001// TB_SETBUTTONSIZE } GETBUTTONSIZE(TBLOCALID)=getbmaxsizex@mod_tbCustomize(htb,bitmapsize(_tbbdid*2+_SL)) dim recty,2 sendmsg htb, 0x0463, 1,varptr(recty)//TB_GETIDEALSIZE }else{ sendmsg htb,0x041f, 0, $10001// TB_SETBUTTONSIZE sendmsg htb, 0x0439, 0, 0//TB_GETSTYLE style_temp=stat if (_ftb=0) and ((style_temp&0x1000)=0){ sendmsg htb,0x041f, 0, ((bitmapsize(_tbbdid*2+_SL)+mes_size_bt(1))<<16)|bitmapsize(_tbbdid*2+_SL)//+stat// TB_SETBUTTONSIZE } dim rectx,2 sendmsg htb, 0x0463, 0,varptr(rectx)//TB_GETIDEALSIZE if (style_temp&8)=0{sendmsg htb,0x0421, 0, 0}// TB_AUTOSIZE sendmsg htb,0x043a, 0,0// TB_GETBUTTONSIZE GETBUTTONSIZE(TBLOCALID)=stat&$ffff } gosub *_toolbarsize if GETBUTTON=-1{sendmsg htb,0x0416,0,0}//TB_DELETEBUTTON return TOOLBAR_FIRSTID+TBLOCALID *_toolbarsize dim rect,ADDTBID*4 repeat ADDTBID GetWindowRect TBhwnd(cnt),rect(cnt*4) loop cntVERT=0 topy=0 btoy=0 repeat ADDTBID sendmsg TBhwnd(cnt), 0x0439, 0, 0//TB_GETSTYLE tbstyle=stat if (tbstyle&$80)=0 { if (tbstyle&4)=4 or (tbstyle&8)=8{ dim rectx,2 sendmsg TBhwnd(cnt), 0x0463, 0,varptr(rectx)//TB_GETIDEALSIZE ScreenToClient GetWindow(TBhwnd(cnt),2), varptr(rect(cnt*4)) sendmsg TBhwnd(cnt),0x043a, 0,0// TB_GETBUTTONSIZE MoveWindow TBhwnd(cnt),rect(cnt*4),rect(cnt*4+1),rectx,(stat>>16)+4,1 }else{ if (tbstyle&3)=1{topy=rect(cnt*4+3)-rect(cnt*4+1)} if (tbstyle&3)=3{btoy=rect(cnt*4+3)-rect(cnt*4+1)} } }else{ LEFT_RIGHT(cntVERT)=(tbstyle&11) indexVERT(cntVERT)=cnt cntVERT++ } loop dim recty,2 repeat cntVERT iv=indexVERT(cnt) if LEFT_RIGHT(cnt)&1{ if LEFT_RIGHT(cnt)&8{ sendmsg TBhwnd(iv), 0x0463, 1,varptr(recty)//TB_GETIDEALSIZE ScreenToClient hwnd, varptr(rect(iv*4)) if rect(iv*4+1)<topy { rect(iv*4+1)=topy} MoveWindow TBhwnd(iv),rect(iv*4),rect(iv*4+1),GETBUTTONSIZE(iv),recty(1)+4,1 }else{ MoveWindow TBhwnd(iv),(ginfo_winx-GETBUTTONSIZE(iv))*(LEFT_RIGHT(cnt)=3),topy,GETBUTTONSIZE(iv),ginfo_winy-(btoy+topy),1 } }else{ sendmsg TBhwnd(iv), 0x0463, 1,varptr(recty)//TB_GETIDEALSIZE ScreenToClient hwnd, varptr(rect(iv*4)) MoveWindow TBhwnd(iv),rect(iv*4),rect(iv*4+1),GETBUTTONSIZE(iv),recty(1),1 } loop return ////---------------縦型のツールバーの幅を設定 //[ ToolBarVertWidth htb, VertWidth ] // htb : ツールバーハンドル // VertWidth : 縦型のツールバーの幅(省略時48) #deffunc ToolBarVertWidth int htb, int VertWidth TBLOCALID=GetWindowLong(htb,-12)-TOOLBAR_FIRSTID if TBLOCALID<0 {return -1} if VertWidth>0 { VertWidthLiset(TBLOCALID)=VertWidth+48*(VertWidth=0)} MVI=MODINDEX(TBLOCALID) set_bttexonoff _TBBUTTON(MVI),-1 _ftb=stat set_SmallLarge _TBBUTTON(MVI),-1 _SL=stat _tbbdid=get_tbbdid(_TBBUTTON(MVI)) sendmsg htb, 0x0439, 0, 0//TB_GETSTYLE if stat&$80{ dim rect,4 if _ftb=0 { sendmsg htb,0x041f, 0, ((bitmapsize(_tbbdid*2+_SL)+mes_size_bt(1))<<16)|VertWidthLiset(TBLOCALID)//+PADDING// TB_SETBUTTONSIZE }else{ sendmsg htb,0x041f, 0, $10001// TB_SETBUTTONSIZE } dim recty,2 sendmsg TBhwnd(iv), 0x0463, 1,varptr(recty)//TB_GETIDEALSIZE GETBUTTONSIZE(TBLOCALID)=getbmaxsizex@mod_tbCustomize(htb,bitmapsize(_tbbdid*2+_SL)) } gosub *_toolbarsize return 0 #defcfunc local getbmaxsizex int htb,int bsx_max bsxmax=bsx_max lotalsizey=0 sendmsg htb,0x0418,0,0//TB_BUTTONCOUNT repeat stat sendmsg htb,0x0417,cnt,varptr(GETBUTTON)//TB_GETBUTTON sendmsg htb,0x041d, cnt, varptr(rect)//TB_GETITEMRECT if GETBUTTON(1)>0 { bsx=rect(2)-rect if bsxmax<bsx {bsxmax=bsx} } loop return bsxmax ////---------------ツールバーにボタンを挿入する //[ ToolBarInsertButton htb, ib, iscid ] // htb : ツールバーハンドル「必ず先にToolBarAddButtonsで使用したハンドルを使用してください」 // ib : 0から始まる挿入するインデックス「指定したインデックスの左側に挿入される」 // iscid : 挿入するコマンドID「予めボタンデータがSetTBButtonDataで登録してある必要がある」 #deffunc ToolBarInsertButton int htb, int ib,int iscid TBLOCALID=GetWindowLong(htb,-12)-TOOLBAR_FIRSTID if TBLOCALID<0 {return -1} MVI=MODINDEX(TBLOCALID) set_SmallLarge _TBBUTTON(MVI),-1 _SL=stat set_bttexonoff _TBBUTTON(MVI),-1 _ftb=stat _tbbdid=get_tbbdid(_TBBUTTON(MVI)) cid_var=iscid if iscid<0 { sendmsg htb, 0x0439, 0, 0//TB_GETSTYLE if stat&$80 { if _ftb=0 { sendmsg htb,0x041f, 0, ((bitmapsize(_tbbdid*2+_SL)+mes_size_bt(1))<<16)|VertWidthLiset(TBLOCALID)// TB_SETBUTTONSIZE }else{ sendmsg htb,0x041f, 0, $10001 } bsxmax=bitmapsize(_tbbdid*2+_SL) lotalsizey=0 sendmsg htb,0x0418,0,0//TB_BUTTONCOUNT repeat stat sendmsg htb,0x0417,cnt,varptr(GETBUTTON)//TB_GETBUTTON sendmsg htb,0x041d, cnt, varptr(rect)//TB_GETITEMRECT if GETBUTTON(1)>0 { bsx=rect(2)-rect if bsxmax<bsx {bsxmax=bsx} } loop GETBUTTONSIZE(TBLOCALID)=bsxmax dim recty,2 sendmsg htb, 0x0463, 1,varptr(recty)//TB_GETIDEALSIZE gosub *_toolbarsize } return 0 } get_modbtlist _TBBUTTON(MVI),GETBUTTON,cid_var,0 if (GETBUTTON(2)&256)=0 {GETBUTTON+bitmapstartindex(_tbbdid*2+_SL)} sendmsg htb, 0x0439, 0, 0//TB_GETSTYLE style_temp=stat VERT=style_temp&$80 addstyle=$5020 if VERT { if _ftb<=1 {substyle=$1000}else{substyle=$4000} if _ftb=2 {addstyle=$20:substyle=0}else{addstyle=$5020} }else{addstyle=$4000*(_ftb=1)} if VERT {GETBUTTON(2)=(GETBUTTON(2)|addstyle)^substyle}else{GETBUTTON(2)|addstyle} sendmsg htb,0x0415, ib, varptr(GETBUTTON)//TB_INSERTBUTTON is_stat=stat if is_stat ! 0{ if VERT { dim rect,4 if _ftb=0 { sendmsg htb,0x041f, 0, ((bitmapsize(_tbbdid*2+_SL)+mes_size_bt(1))<<16)|VertWidthLiset(TBLOCALID)// TB_SETBUTTONSIZE }else{ sendmsg htb,0x041f, 0, $10001 } GETBUTTONSIZE(TBLOCALID)=getbmaxsizex@mod_tbCustomize(htb,bitmapsize(_tbbdid*2+_SL)) dim recty,2 sendmsg htb, 0x0463, 1,varptr(recty)//TB_GETIDEALSIZE gosub *_toolbarsize } } return is_stat ////---------------ツールバーをリセットする(最初にToolBarAddButtonsした状態に戻す) //[ ToolBarReset htb, rm, tbbtexf, SL ] // htb : ツールバーハンドル // rm : ボタン配置を初期状態に戻すかどうか「0=最初のボタン配置に戻す、1=現在のボタン配置を維持して設定を反映」 // tbbtexf : テキストの表示有無指定(省略時-1)「-1=現状維持、0=下にテキスト表示、1=右にテキスト表示、2=TBSTYLE_LISTを設定しBTNS_SHOWTEXTが指定される物のみテキスト表示、3=TBSTYLE_LISTを設定しBTNS_SHOWTEXTを削除してテキスト非表示」 // SL : 画像の大きい小さい指定(省略時-1)「-1=現状維持、0=小さい、1=大きい 」 #define global ToolBarReset(%1,%2=0,%3=-1,%4=-1) _ToolBarReset %1,%2,%3,%4 #deffunc _ToolBarReset int htb,int rm,int tbbtexf,int SL TBLOCALID=GetWindowLong(htb,-12)-TOOLBAR_FIRSTID if TBLOCALID<0 {return -1} MVI=MODINDEX(TBLOCALID) dim GETBUTTON,5 if rm=0 { get_InitialButtonIDList _TBBUTTON(MVI),tbbidlist listmax=stat } del_ToolBarButton_get_idlist _TBBUTTON(MVI),listmax,tbbidlist,rm set_SmallLarge _TBBUTTON(MVI),SL*(rm!0) | -1*(rm=0) _SL=stat set_bttexonoff _TBBUTTON(MVI),tbbtexf*(rm!0) | -1*(rm=0) _ftb=stat ToolBarAddButtons htb,get_tbbdid(_TBBUTTON(MVI)),listmax,tbbidlist,_ftb,_ftb if rm { dupptr BIDL_str_dup, varptr(tbbidlist),listmax*4,4 repeat listmax sendmsg htb,0x0412,BIDL_str_dup(cnt),0//TB_GETSTATE sendmsg htb,0x0411,BIDL_str_dup(cnt),((state(BIDL_str_dup(cnt))|$20)^$20) | (stat&$20)//TB_SETSTATE loop } set_ButtonOn _TBBUTTON(MVI) //ボタンが使用されてるかのフラグを設定 setCustomizeListbox //変更ダイアログ吾開いていたら左右のリストボックスにボタンを表示 return 0 ////---------------ボタンインサート禁止設定(変更ダイアログ内でインサートを禁止するかの設定) //[ setNoInsertButton htb, _cid, nof ] // htb : ツールバーハンドル「必ず先にToolBarAddButtonsで使用したハンドルを使用してください」 // _cid : コマンドID「必ずSetTBButtonDataで登録したIDを指定してください」 // nof : インサート禁止すかのスイッチ「-1=現状維持、0=禁止しない、1=禁止する」 //戻り値:statに現在の設定値が返る(-1ならツールバーが無かったかIDが無効) #deffunc setNoInsertButton int htb,int _cid,int nof if _cid<0 {return -1} TBLOCALID=GetWindowLong(htb,-12)-TOOLBAR_FIRSTID if TBLOCALID<0{return -1} MVI=MODINDEX(TBLOCALID) return (set_noInsertButton( _TBBUTTON(MVI), _cid, nof)!0) ////---------------ボタン削除禁止設定(変更ダイアログ内で削除禁止するかの設定) //[ setNoDeleteButton htb, _cid, nof ] // htb : ツールバーハンドル「必ず先にToolBarAddButtonsで使用したハンドルを使用してください」 // _cid : コマンドID「必ずSetTBButtonDataで登録したIDを指定してください」 // nof : 削除禁止すかのスイッチ「-1=現状維持、0=禁止しない、1=禁止する」 //戻り値:statに現在の設定値が返る(-1ならツールバーが無かった) #deffunc setNoDeleteButton int htb,int _cid,int nof if _cid<0 {return -1} TBLOCALID=GetWindowLong(htb,-12)-TOOLBAR_FIRSTID if TBLOCALID<0{return -1} MVI=MODINDEX(TBLOCALID) return (set_noDeleteButton( _TBBUTTON(MVI), _cid, nof)!0) ////---------------テキストの表示設定値取得(設定変更はToolBarReset命令で) //[ 変数 = getTBTextON( htb ) ] // htb : ツールバーハンドル //戻り値:0=下にテキスト表示、1=右にテキスト表示、2=TBSTYLE_LISTを設定しBTNS_SHOWTEXTが指定される物のみテキスト表示、3=TBSTYLE_LISTを設定しBTNS_SHOWTEXTを削除してテキスト非表示 #defcfunc getTBTextON int htb TBLOCALID=GetWindowLong(htb,-12)-TOOLBAR_FIRSTID if TBLOCALID<0{return -1} MVI=MODINDEX(TBLOCALID) set_bttexonoff _TBBUTTON(MVI),-1 return stat ////---------------画像の大小設定値取得(設定変更はToolBarReset命令で) //[ 変数 = getTBSmallLarge( htb ) ] // htb : ツールバーハンドル //戻り値:0=小さい、1=大きい #defcfunc getTBSmallLarge int htb TBLOCALID=GetWindowLong(htb,-12)-TOOLBAR_FIRSTID if TBLOCALID<0{return -1} MVI=MODINDEX(TBLOCALID) set_SmallLarge _TBBUTTON(MVI),-1 return stat ////---------------登録したボタンデータを設定も反映させて取得(実際に設置されてるボタンから取得する訳ではない) //[ getButtonData htb, _cid, _tbb ] // htb : ツールバーハンドル // _cid : コマンドID // _tbb : TBBUTTONを取得する配列 #deffunc getButtonData int htb,int _cid,array _tbb TBLOCALID=GetWindowLong(htb,-12)-TOOLBAR_FIRSTID if TBLOCALID<0{return -1} MVI=MODINDEX(TBLOCALID) tbbid=_cid get_modbtlist _TBBUTTON(MVI),_tbb,tbbid,0 return stat #define TEMP_WINIDA 1001 //ToolBarAddPicで使用される作業用bufferID #define TEMP_WINIDB 1002 ////---------------ツールバーボタンに使用する画像を追加します(TB_ADDBITMAP) //[ ToolBarAddPic %1, %2, %3, %4 ] // %1 : ツールバーハンドル // %2 : 追加する画像がbufferにあるならIDをファイルならファイル名をHINST_COMMCTRLなら-1を指定(省略時-2)「-2=現在の操作先ウィンドウ、-1=HINST_COMMCTRL、0以上=ウィンドID、"文字列"=ファイル名」 // %3 : 追加する画像の数(省略時0)「0=画像Xサイズ(バッファサイズ)/一つ分の画像サイズ、%2を-1にした場合はボタンイメージのビットマップのリソースIDになる」 // %4 : 一つ分の画像サイズ(省略時16)「縦横サイズとして使われる(%2が-1の場合無視される)」 //戻り値:一つ目が追加された位置(インデックス)が返ります。失敗した場合は-1 #define global ToolBarAddPic(%1,%2=-2,%3=0,%4=16) _ToolBarAddPic %1,int(%2),str(%2),%3,%4 #deffunc _ToolBarAddPic int htb,int bid ,str fname,int picmax,int size if bid ! -1 { gsel_bak=ginfo_sel gsel 0 hdc_disp=GetDC(hwnd) dim BITMAPINFOHEADER,10 if fname=str(bid) or bid<0{ if bid<0 {gsel gsel_bak}else{gsel bid} copyid=ginfo_sel pget 0,0 gr=ginfo_r:gg=ginfo_g:gb=ginfo_b if (picmax>0) {_picmax=picmax}else{_picmax=ginfo_sx/size} buffer TEMP_WINIDB,size*_picmax,size syscolor 15: boxf gmode 4,ginfo_sx,ginfo_sy,256 color gr,gg,gb gcopy copyid }else{ buffer TEMP_WINIDA picload fname pget 0,0 gr=ginfo_r:gg=ginfo_g:gb=ginfo_b if (picmax>0) {_picmax=picmax}else{_picmax=ginfo_sx/size} buffer TEMP_WINIDB,size*_picmax,size syscolor 15: boxf Ext= getpath(getpath(fname,2),16) if Ext=".png" { picload fname,1 }else{ gmode 4,ginfo_sx,ginfo_sy,256 color gr,gg,gb gcopy TEMP_WINIDA } } mref VRAM,66 mref BMSCR,67 BITMAPINFOHEADER=40,ginfo_sx,ginfo_sy hwnd_bmp(hwnd_bmp_cnt)=CreateDIBitmap( hdc_disp, varptr(BITMAPINFOHEADER), 4, BMSCR(5), BMSCR(6), 0 ) tbadd= 0,hwnd_bmp(hwnd_bmp_cnt) hwnd_bmp_cnt++ DeleteDC hdc_disp gsel gsel_bak }else{ tbadd= bid,picmax _picmax=0 } sendmsg htb, 0x0413 , _picmax ,varptr(tbadd) //TB_ADDBITMAP return stat #deffunc hwndbmpdel onexit repeat hwnd_bmp_cnt DeleteObject hwnd_bmp(cnt) loop return /////////////////////////////ここからツールバーの変更ダイアログが開いてる時限定の命令定義////////////////////////////////////////////////////////////////////// ////---------------ツールバーの変更ダイアログとリストボックスのハンドルを取得(その他も文字列でシステム変数に入る) //[ getCustomizeListbox l_Param, htbc, hlb, hrb, ListBoxcnt ](必ず割り込みTBN_INITCUSTOMIZE内で実行) // l_Param : lParam「WM_NOTIFY割り込み時のシステム変数」 // htbc : ツールバーの変更ダイアログのハンドル // hlb : 左のリストボックスのハンドル // hrb : 右のリストボックスのハンドル // ListBoxcnt : 発見したリストボックスの数 //戻り値1:statが0ならrストボックスが二つとも見つかった、1なら見つけてから閉じられていない、-1ならなんらかの不具合 //戻り値2:refstrに変更ダイアログ上のもの全て "クラスネーム,ハンドル,表示テキスト" の並びで改行されて代入される #deffunc getCustomizeListbox int l_Param,var htbc,var hlb,var hrb,var ListBoxcnt dupptr _nmhdr,l_Param,16,4 TBLOCALID=GetWindowLong(_nmhdr,-12)-TOOLBAR_FIRSTID if TBLOCALID<0 {return -1} MVI=MODINDEX(TBLOCALID) if set_LBHWND(_TBBUTTON(MVI), hlb,hrb,1) = 2 {set_ButtonOn _TBBUTTON(MVI):return 1} hToolBar=_nmhdr hCustom=_nmhdr(3) htbc=hCustom temp_hwnd=htbc sdim text,256 ListBoxcnt=0 objliststr="" repeat if GetWindow(temp_hwnd,2+(cnt=0)*3) {//ツールバーの変更ダイアログ内の子ウィンドウハンドルを全て取得 temp_hwnd=stat if GetAncestor(temp_hwnd,1) ! htbc {break}//親が変更ダイアログじゃないなら終了 GetClassName temp_hwnd,ClassName,255 text="" GetWindowText temp_hwnd,text,255 objliststr+strf("%s %d %s\n",ClassName,temp_hwnd,text) if ClassName="ListBox" { //ListBox_hwnd(0)=左側のリストボックスハンドル、ListBox_hwnd(1)=右側のリストボックスハンドル if ListBoxcnt=0 {hlb=temp_hwnd}else{hrb=temp_hwnd} sendmsg temp_hwnd, 0x01A1, 0,0 //LB_GETITEMHEIGHT ListBoxHEIGHT=stat ListBoxcnt++ } }else{break} loop set_ButtonOn _TBBUTTON(MVI) //ボタンが使用されてるかのフラグを設定 mref _stat,64 if ListBoxcnt=2 { temp=set_LBHWND(_TBBUTTON(MVI),hlb,hrb,0) _stat=0 }else{_stat=-1} return objliststr ////---------------ダミーボタン削除 //[ delDummyButtton ](必ず割り込みTBN_TOOLBARCHANGE内で実行) //戻り値:statにダミーから本来のボタンに置き換わったコマンドIDが返る。-1の場合削除されなかった #deffunc delDummyButtton if IsWindow(hCustom)=0 {return -1} TBLOCALID=GetWindowLong(hToolBar,-12)-TOOLBAR_FIRSTID if TBLOCALID<0 {return -1} MVI=MODINDEX(TBLOCALID) sendmsg hToolBar,0x0418,0,0//TB_BUTTONCOUNT return Del_DummyButtton(_TBBUTTON(MVI),stat) ////---------------左右のリストボックスにボタンを表示(ToolBarReset内で使用されてる) //[ setCustomListbox ](変更ダイアログを開いてる状態でToolBarAddButtons。ToolBarAddButtonsを使用しない限り単体で使うことは無い) #deffunc setCustomizeListbox if IsWindow(hCustom)=0 {return -1} TBLOCALID=GetWindowLong(hToolBar,-12)-TOOLBAR_FIRSTID if TBLOCALID<0{return -1} MVI=MODINDEX(TBLOCALID) set_RightListbox _TBBUTTON(MVI) set_LeftListbox _TBBUTTON(MVI) return 0 ////---------------使用中のボタンを右のリストボックスに表示 //[ setRightListbox ](変更ダイアログを開いてる状態でToolBarAddButtonsを使用しない限り単体で使うことは無い) #deffunc setRightListbox if IsWindow(hCustom)=0 {return -1} TBLOCALID=GetWindowLong(hToolBar,-12)-TOOLBAR_FIRSTID if TBLOCALID<0{return -1} MVI=MODINDEX(TBLOCALID) set_RightListbox _TBBUTTON(MVI) return 0 ////---------------未使用のボタンを左のリストボックスに表示(retButtonInfo内で使用されてる) //[ setLeftListbox ](変更ダイアログを開いてる状態でSetTBButtonDataを使用しない限り単体で使うことは無い) #deffunc setLeftListbox if IsWindow(hCustom)=0 {return -1} TBLOCALID=GetWindowLong(hToolBar,-12)-TOOLBAR_FIRSTID if TBLOCALID<0{return -1} MVI=MODINDEX(TBLOCALID) set_LeftListbox _TBBUTTON(MVI) return 0 ////インサート禁止するかのフラグを返す(割り込みreturn用の値なので設定値とは違う) //[ 変数 = getNoInsertButton( l_Param ) ](必ず割り込みTBN_QUERYINSERT内で実行) // l_Param : lParam「WM_NOTIFY割り込み時のシステム変数」 //戻り値:インサート禁止されてたら0が返る(通常は1が返る) #defcfunc retNoInsertButton int l_Param dupptr NMHDR_dup,l_Param,24,4 if NMHDR_dup(5) <0 {return 0} TBLOCALID=NMHDR_dup(1)-TOOLBAR_FIRSTID if TBLOCALID<0 {return 0} MVI=MODINDEX(TBLOCALID) return (set_noInsertButton( _TBBUTTON(MVI), NMHDR_dup(5), -1)=0) ////削除禁止するかのフラグを返す(割り込みreturn用の値なので設定値とは違う) //[ 変数 = getNoDeleteButton( l_Param ) ](必ず割り込みTBN_QUERYDELETE内で実行) // l_Param : lParam「WM_NOTIFY割り込み時のシステム変数」 //戻り値:削除禁止されてたら0が返る(通常は1が返る) #defcfunc retNoDeleteButton int l_Param//_TBN_QUERYDELETE dupptr NMHDR_dup,l_Param,24,4 if NMHDR_dup(5) <0 {return 0} TBLOCALID=NMHDR_dup(1)-TOOLBAR_FIRSTID if TBLOCALID<0 {return 0} MVI=MODINDEX(TBLOCALID) return (set_noDeleteButton( _TBBUTTON(MVI), NMHDR_dup(5), -1)=0) ////ダミーボタン情報をセットして1を返す。変更ダイアログを開いた時やリセット時は左側のリストボックスに未使用のボタンを表示させる //[ 変数 = retButtonInfo( l_Param ) ](必ず割り込みTBN_GETBUTTONINFOA内で実行) // l_Param : lParam「WM_NOTIFY割り込み時のシステム変数」 //戻り値:ダミ-ボタン情報を渡す必要がある時は1になる #defcfunc retButtonInfo int l_Param if IsWindow(hCustom)=0 {return 0} dupptr NMHDR_dup,l_Param,4*20,4 if NMHDR_dup(5)=385 { sendmsg NMHDR_dup,0x0418,0,0//TB_BUTTONCOUNT BUTTONCOUNT=stat dim GETBUTTON,5 sendmsg NMHDR_dup,0x0417,NMHDR_dup(4),varptr(GETBUTTON)//TB_GETBUTTON sendmsg NMHDR_dup,0x0412,GETBUTTON(1),0 //TB_GETSTATE NMHDR_dup(4)=-1,-1,$100|stat*(stat>0),BUTTONCOUNT,-1 //ダミーのボタンデータ設定 return 1 } if NMHDR_dup(5)=49 {setLeftListbox}//使用されていないボタンを左のリストボックスに表示 return 0 /////////////////////////////ここまでツールバーの変更ダイアログが開いてる時限定の命令定義////////////////////////////////////////////////////////////////////// //======ここからモジュール内用命令定義======//(glooalからは使わない) //「ボタンデータ数,テキスト表示フラグ」 //m_tbbtexf:0=表示、1=条件付表示、2=非表示 #modinit int m_id,int m_tbdatmax TBBD_ID=m_id dim BitmapIndex,m_tbdatmax dim BitmapIndex,m_tbdatmax dim CommandID,m_tbdatmax dim StateStyle,m_tbdatmax dim Data,m_tbdatmax dim StringIndex,m_tbdatmax sdim StringList,64,m_tbdatmax dim ButtonOn,m_tbdatmax sdim ButtonIDList_str dim noDelButList,m_tbdatmax dim noInsButList,m_tbdatmax LeftLBHWND=0 RightLBHWND=0 tbbnextindex++ sdim ClassName,256 return tbbnextindex-1 //「変数 = set_LBHWND( モジュール変数,左のリストボックスハンドル,右のリストボックスハンドル,0で設定1なら設定済みハンドル取得 )」 //statが2ならハンドルが両方設定済 #modcfunc set_LBHWND var m_hlb,var m_hrb,int m_m if m_m { if IsWindow(LeftLBHWND) {m_hlb=LeftLBHWND}else{m_hlb=0} if IsWindow(RightLBHWND) {m_hrb=RightLBHWND}else{m_hrb=0} return ((m_hlb!0) + (m_hrb!0)) }else{ LeftLBHWND=m_hlb RightLBHWND=m_hrb } return 2 ///ボタンデータID取得 //「変数 = get_tbbdid(モジュール変数)」 #modcfunc get_tbbdid return TBBD_ID //「set_bttexonoff モジュール変数,テキスト表示フラグ(-1=現状維持、0=下にテキスト表示、1=右にテキスト表示、2=TBSTYLE_LISTを設定してBTNS_SHOWTEXTが指定される物のみテキスト表示、3=TBSTYLE_LISTを指定してBTNS_SHOWTEXTを削除してテキスト非表示)」 //statに現在の設定が返る #modfunc set_bttexonoff int m_tbbtexf if m_tbbtexf<0 { BTF(TBLOCALID) | 0 }else{ BTF(TBLOCALID)=limit(m_tbbtexf,0,3) } return BTF(TBLOCALID) //ツールバー初期設定モジュール内に保存 //「Initial_ToolBar モジュール変数,ツールバーハンドル ,ボタン配置数,ボタンIDリスト,画像の大きさ切替フラグ」 //m_SL:0=小さい、1=大きい #modfunc Initial_ToolBar int m_htb,int m_nb,array m_idl ,int m_tbbtexf,int m_SL,var _m_tbbtexf,var _m_SL HTB_List(HTBNumber)=m_htb HTBNumber++ TBhwnd(TBLOCALID)=m_htb InitialNumber(TBLOCALID)=m_nb //最初に設置された数(リセット時に使用) SmallLarge(TBLOCALID)=limit(m_SL,0,1) _m_SL=SmallLarge(TBLOCALID) memexpand ButtonIDList_str(TBLOCALID),m_nb*4 repeat m_nb memcpy ButtonIDList_str(TBLOCALID),m_idl,m_nb*4//最初に設置されたリスト(リセット時に使用) loop set_bttexonoff thismod,m_tbbtexf _m_tbbtexf=stat return //ツールバーボタン画像大きさ切替 //「set_SmallLarge モジュール変数,画像の大きさ」 //m_SL:-1=現状維持、0=小さい、1=大きい //statに現在の設定が返る #modfunc set_SmallLarge int m_SL if m_SL>=0 {SmallLarge(TBLOCALID)=limit(m_SL,0,1)} return SmallLarge(TBLOCALID) ////インサート禁止するかを設定取得 //[ 変数 = getNoInsertButton( モジュール変数,コマンドID, インサート禁止すかのスイッチ ) ] // m_nof : インサート禁止すかのスイッチ「-1=現状維持、0=禁止しない、1=禁止する」 //戻り値 :現在の設定値が返る #modcfunc set_noInsertButton int m_cid,int m_nof if m_nof>=0 {noInsButList(m_cid)=m_nof>0} return noInsButList(m_cid) ////削除禁止するかを設定取得 //[ 変数 = set_noDeleteButton( モジュール変数,コマンドID, インサート禁止すかのスイッチ ) ] // m_nof : 削除禁止すかのスイッチ「-1=現状維持、0=禁止しない、1=禁止する」 //戻り値 :現在の設定値が返る #modcfunc set_noDeleteButton int m_cid,int m_nof if m_nof>=0 {noDelButList(m_cid)=m_nof>0} return noDelButList(m_cid) //同じボタンデータIDを使ってるツールバーボタンを一旦全て削除してから呼び出したツールバー以外を再配置して呼び出したツールバーのIDリストを取得 //「del_ToolBarButton_get_idlist モジュール変数,ボタン数を取得する配列, ボタンIDリストを取得する文字列配列(内容はint),最初の状態に戻す(0以外なら現状時)」 #modfunc del_ToolBarButton_get_idlist array m_nbl,array m_tbbidl,int m_rm TBLOCALID_bak=TBLOCALID MVI_bak=MVI if m_rm=0 { dim m_tbbidl_bak,m_nbl m_nbl_bak=m_nbl memcpy m_tbbidl_bak,m_tbbidl,m_nbl*4 } dim GETBUTTON,5 sdim temp_tbbidl,,HTBNumber idlist_index=0 repeat HTBNumber _TBhwnd=HTB_List(cnt) sendmsg _TBhwnd,0x0418,0,0//TB_BUTTONCOUNT if stat>0 { m_nbl(cnt)=stat memexpand temp_tbbidl(cnt),m_nbl(cnt)*4 dupptr BIDL_str_dup, varptr(temp_tbbidl(cnt)),m_nbl(cnt)*4,4 repeat m_nbl(cnt) sendmsg _TBhwnd,0x0417,0,varptr(GETBUTTON)//TB_GETBUTTON BIDL_str_dup(cnt)=GETBUTTON(1) state(GETBUTTON(1))=GETBUTTON(2)&$ff sendmsg _TBhwnd,0x0416,0,0//TB_DELETEBUTTON loop }else{m_nbl(cnt)=0} if _TBhwnd=TBhwnd(TBLOCALID) { idlist_index=cnt if m_rm=0 { m_nbl(cnt)=m_nbl_bak memexpand temp_tbbidl(cnt),m_nbl_bak*4 memcpy temp_tbbidl(cnt),m_tbbidl_bak,m_nbl_bak*4 } } loop if m_nbl(idlist_index) { dupptr BIDLdel_dup, varptr(temp_tbbidl(idlist_index)),m_nbl(idlist_index)*4,4 repeat HTBNumber if idlist_index!cnt { if m_nbl(cnt) { dupptr BIDL_str_dup, varptr(temp_tbbidl(cnt)),m_nbl(cnt)*4,4 index_str="," repeat m_nbl(cnt) index_str+""+BIDL_str_dup(cnt)+"," loop repeat m_nbl(idlist_index) strrep index_str ,","+BIDLdel_dup(cnt)+"," ,"," loop split index_str,",",index_str m_nbl(cnt)=limit(stat-2,0,stat) if m_nbl(cnt) { repeat stat-2 BIDL_str_dup(cnt)=int(index_str(cnt+1)) loop } } } loop } repeat HTBNumber if idlist_index!cnt { if m_nbl(cnt){ dupptr BIDL_str_dup, varptr(temp_tbbidl(cnt)),m_nbl(cnt)*4,4 ToolBarAddButtons HTB_List(cnt),TBBD_ID,m_nbl(cnt),BIDL_str_dup,-1,-1 repeat m_nbl(cnt) sendmsg h_tb,0x0411,BIDL_str_dup(cnt),state(BIDL_str_dup(cnt)) //TB_SETSTATE loop } } loop m_nbl=m_nbl(idlist_index) dim m_tbbidl,m_nbl memcpy m_tbbidl,temp_tbbidl(idlist_index),m_nbl*4 TBLOCALID=TBLOCALID_bak MVI=MVI_bak _tbbdid=TBBD_ID return //ボタンデータをモジュール変数に移す //「set_modbt モジュール変数,ボタンデータ,ボタンデータインデックス」 #modfunc set_modbt array m_tbbdat,int m_index cid=m_tbbdat(m_index*5+1) BitmapIndex(cid)=m_tbbdat(m_index*5) CommandID(cid)=m_tbbdat(m_index*5+1) StateStyle(cid)=m_tbbdat(m_index*5+2) Data(cid)=m_tbbdat(m_index*5+3) StringIndex(cid)=m_tbbdat(m_index*5+4) memexpand StringList(cid),256 noDelButList(cid)=0 noInsButList(cid)=0 ButtonOn(cid)=0 ButtonDef(cid) | 0 if ButtonDef(cid) =0 { ButtonDef(cid)=1 ButtonOnList(ButtonOnMax)=cid ButtonOnMax++ } return //初期設置ボタンリストをモジュール変数に保存 //「get_InitialButtonIDList モジュール変数,最初に設置したボタンIDリスト配列」 #modfunc get_InitialButtonIDList array m_tbbid_list dim m_tbbid_list,InitialNumber(TBLOCALID) memcpy m_tbbid_list,ButtonIDList_str(TBLOCALID),InitialNumber(TBLOCALID)*4 return InitialNumber(TBLOCALID) //ボタンが使用中か判定して使用してるならモジュール変数ButtonOnを1にする(コマンドIDが要素) //[ set_ButtonOn モジュール変数 ] #modfunc set_ButtonOn dim GETBUTTON,5 dim ButtonOn,length(ButtonOn) dim StateList,length(ButtonOn) repeat HTBNumber _TBhwnd=HTB_List(cnt) TBLOCALID_temp=GetWindowLong(_TBhwnd,-12)-TOOLBAR_FIRSTID if TBLOCALID_temp<0{continue } sendmsg _TBhwnd,0x0418,0,0//TB_BUTTONCOUNT if stat>0 { ofsetid=bitmapstartindex(TBBD_ID*2+SmallLarge(TBLOCALID_temp)) repeat stat sendmsg _TBhwnd,0x0417,cnt,varptr(GETBUTTON)//TB_GETBUTTON _cid=GETBUTTON(1) ButtonDef(_cid) | 0 if ButtonDef(_cid)=0 {set_modbt thismod, GETBUTTON,0}//未登録のIDが使われてたので登録 ButtonOn(_cid)=1 if (ofsetid+BitmapIndex(_cid)) ! GETBUTTON {BitmapIndex(_cid)=GETBUTTON} StateList(_cid)=GETBUTTON(2)&$ff loop } loop return //get_ButtonOn コマンドID #modcfunc get_ButtonOn int m_cid return ButtonOn(m_cid) //[ del_DummyButtton モジュール変数,設置されてるボタン数 ] //statにダミーを置き換えたコマンドIDが返る(無い場合-1) #modcfunc del_DummyButtton int m_nb dim GETBUTTON,5 dmycid=-1 _tbh=TBhwnd(TBLOCALID) _sli=bitmapstartindex(TBBD_ID*2+SmallLarge(TBLOCALID)) repeat m_nb sendmsg _tbh,0x0417,cnt,varptr(GETBUTTON)//TB_GETBUTTON if GETBUTTON(1)=dmycid {//ダミーのボタンだった _BUTTONCOUNT=GETBUTTON(3) _STATE=GETBUTTON(2) sendmsg RightLBHWND, $199 ,cnt,0 //LB_GETITEMDATA ダミーが置かれているインデックスで右側のリストボックスのデータを取得 dat=stat-_sli //ビットマップインデックス foreach ButtonOn if ButtonDef(cnt) {//ボタンデータがある if BitmapIndex(cnt)=dat {//同じビットマップインデックスなら if (StateStyle(cnt)&256)=0 {//セパレータ以外なら dmycid=cnt StateList(cnt) | 0 break } } } loop if dmycid<0 {break} sendmsg _tbh,0x0416,cnt,0 //TB_DELETEBUTTON ダミーを削除 ToolBarInsertButton _tbh,cnt,dmycid//削除されたところにボタン挿入 if _BUTTONCOUNT=m_nb {sendmsg _tbh,0x0411,dmycid,_STATE }else{ if StateList(dmycid) {sendmsg _tbh,0x0411,dmycid,StateList(dmycid) } }//TB_SETSTATE break } loop if dmycid<0 { sendmsg _tbh, 0x0439, 0, 0//TB_GETSTYLE //if stat&$80 { ToolBarInsertButton _tbh,0,dmycid//削除されたところにボタン挿入 // } } return dmycid //[ get_modbtlist モジュール変数,出力ボタンデータ配列,入力コマンドIDリスト,入力設置インデックス ] #modfunc get_modbtlist array m_tbb,array m_tbbid_list,int m_index cid=m_tbbid_list(m_index) ButtonDef(cid) | 0 if ButtonDef(cid) { if (StateStyle(cid)&256)!0 {Style=0}else{Style=$4000}//セパレータ以外なら _BTF=$ffffffff^($1000*(BTF(TBLOCALID)>0)) ^($4000*(BTF(TBLOCALID)=3)) SS=(StateStyle(cid)&_BTF) | ( Style*(BTF(TBLOCALID)=0)) m_tbb(m_index*5)=BitmapIndex(cid),CommandID(cid),SS,Data(cid),StringIndex(cid) }else{return -1} return 0 //左のリストボックスに使用されてないボタンを表示 //[ set_LeftListbox モジュール変数 ] #modfunc set_LeftListbox sendmsg LeftLBHWND,0x000B,0,0 //WM_SETREDRAW await 0 //リストボックスが書き換わらない部分が出るので Nullstr="" sepstr="" sendmsg LeftLBHWND, $189 ,0,varptr(sepstr) //LB_GETTEXT sendmsg LeftLBHWND, $199 ,0,0 //LB_GETITEMDATA sep=stat _tbh=TBhwnd(TBLOCALID) sendmsg _tbh, 0x0439, 0, 0//TB_GETSTYLE sendmsg LeftLBHWND,0x01A0,0,limit(bitmapsize(TBBD_ID*2+SmallLarge(TBLOCALID))+2+((stat&0x0800)=0)*6,18,bitmapsize(TBBD_ID*2+SmallLarge(TBLOCALID))+18) //LB_SETITEMHEIGHT sendmsg LeftLBHWND,0x0184,0,0 //LB_RESETCONTENT sendmsg LeftLBHWND,0x0180,0,sepstr //LB_ADDSTRING //sepstrの内容を変更すれば右側の 区切り の文字を変えられる sendmsg LeftLBHWND,0x019a,0,sep //LB_SETITEMDATA dim GETBUTTON,5 repeat ButtonOnMax cid=ButtonOnList(cnt) if ButtonOn(cid)=0 and noDelButList(cid)=0 { if (StateStyle(cid)&256)=0 { if (StringIndex(cid)&$ffff0000)=0 { sendmsg _tbh,0x045c,(StringIndex(cid)<<16),0//TB_GETSTRINGA if stat>0 { _strsize=stat*2+1 if _strsize>63 {memexpand StringList(cid),_strsize} sendmsg _tbh,0x045c,(StringIndex(cid)<<16)|_strsize,varptr(StringList(cid))//TB_GETSTRINGA }else{ StringList(cid)="" } }else{ if StringIndex(cid) ! -1 { dupptr String_dup,StringIndex(cid),64,2 StringList(cid)=String_dup }else{ StringList(cid)="" } } sendmsg LeftLBHWND,0x0180,0,varptr(StringList(cid)) //LB_ADDSTRING sendmsg LeftLBHWND,0x019a,stat,BitmapIndex(cid)+bitmapstartindex(TBBD_ID*2+SmallLarge(TBLOCALID)) //LB_SETITEMDATA } } loop sendmsg LeftLBHWND,0x0186,0,0 //LB_SETCURSEL sendmsg LeftLBHWND,0x000B,1,0 //WM_SETREDRAW return //右のリストボックスに使用されてるボタンを表示 //[ set_RightListbox モジュール変数 ] #modfunc set_RightListbox sendmsg RightLBHWND,0x000B,0,0 //WM_SETREDRAW await 0 //リストボックスが書き換わらない部分が出るので Nullstr="" sepstr="" sendmsg LeftLBHWND, $189 ,0,varptr(sepstr) //LB_GETTEXT sendmsg LeftLBHWND, $199 ,0,0 //LB_GETITEMDATA sep=stat sendmsg RightLBHWND,0x018B,0,0 //LB_GETCOUNT sendmsg RightLBHWND, $199 ,stat-1,0 //LB_GETITEMDATA Lastsep=stat _tbh=TBhwnd(TBLOCALID) sendmsg _tbh, 0x0439, 0, 0//TB_GETSTYLE sendmsg RightLBHWND,0x01A0,0,limit(bitmapsize(TBBD_ID*2+SmallLarge(TBLOCALID))+2+((stat&0x0800)=0)*6,18,bitmapsize(TBBD_ID*2+SmallLarge(TBLOCALID))+18) //LB_SETITEMHEIGHT sendmsg RightLBHWND,0x0184,0,0 //LB_RESETCONTENT sendmsg RightLBHWND,0x0181,0,sepstr //LB_INSERTSTRING //一番下の 区切り の文字列 sendmsg RightLBHWND,0x019a,0,Lastsep //LB_SETITEMDATA //一番下の 区切り のDATA dim GETBUTTON,5 sendmsg _tbh,0x0418,0,0//TB_BUTTONCOUNT repeat stat sendmsg _tbh,0x0417,cnt,varptr(GETBUTTON)//TB_GETBUTTON dat=GETBUTTON(0) cid=GETBUTTON(1) sendmsg _tbh,0x042d, cid, 0//TB_GETBUTTONTEXTA if stat>63{ memexpand StringList(cid),stat+1} sendmsg _tbh,0x042d, cid, varptr(StringList(cid))//TB_GETBUTTONTEXTA if (GETBUTTON(2)&256) {dat=sep:strptr=sepstr}else{strptr=StringList(cid)} sendmsg RightLBHWND,0x0181,cnt,strptr //LB_INSERTSTRING sendmsg RightLBHWND,0x019a,stat,dat //LB_SETITEMDATA loop sendmsg RightLBHWND,0x0186,0,0 //LB_SETCURSEL sendmsg RightLBHWND,0x000B,1,0 //WM_SETREDRAW return //======モジュール内用命令定義終わり======// #global #uselib "comctl32.dll" #func InitCommonControls "InitCommonControls" #uselib "user32.dll" #func SetMenu "SetMenu" int,int #func GetWindowRect "GetWindowRect" int,var #func SetWindowPos "SetWindowPos" int,int,int,int,int,int,int #func SetParent "SetParent" int,int #func CreatePopupMenu "CreatePopupMenu" #func TrackPopupMenuEx "TrackPopupMenuEx" int,int,int,int,int,int #func AppendMenu "AppendMenuA" int,int,int,sptr #func DestroyMenu "DestroyMenu" int #func ClientToScreen "ClientToScreen" int,int #func ReleaseCapture "ReleaseCapture" #define WM_COMMAND 0x0111 #define WM_NOTIFY 0x004E #define TB_BUTTONSTRUCTSIZE 0x041E #define TB_ADDBITMAP 0x0413 #define TB_AUTOSIZE 0x0421 #define TB_ADDBUTTONS 0x0414 #define TB_SETEXTENDEDSTYLE 0x0454 #define TB_GETRECT 0x0433 #const TB_BUTTONCOUNT 0x0418 #const TB_DELETEBUTTON 0x0416 #define TB_CUSTOMIZE 0x041B #define TBSTYLE_EX_DRAWDDARROWS 1 #define TBSTYLE_EX_MIXEDBUTTONS 0x00000008 //ツールバーボタン画像(小) buffer 10,16,16 color 200,100,150 boxf 4,2,4+8,14 //ツールバーボタン画像(大) buffer 11,24,24 color 200,100,150 boxf 6,3,6+12,21 screen 0,640,480 onexit *OnClose InitCommonControls #define TBSTYLE_AUTOSIZE 0x10 #enum STD_CUT = 0 //切り取り #enum STD_COPY //コピー #enum STD_PASTE //貼り付け #enum STD_UNDO //アンドゥ #enum STD_REDOW //リドゥ #enum STD_DELETE // 削除 #enum STD_FILENEW //新規作成 #enum STD_FILEOPEN //開く #enum STD_FILESAVE //保存 #enum STD_PRINTPRE //印刷プレビュー #enum STD_PROPERTIES //プロパティ #enum STD_HELP //ヘルプ #enum STD_FIND // 検索 #enum STD_REPLACE //置換 #enum STD_PRINT //印刷 #enum VIEW_LARGEICONS // 大きいアイコン #enum VIEW_SMALLICONS // 小さいアイコン #enum VIEW_LIST // 一覧表示 #enum VIEW_DETAILS // 詳細表示 #enum VIEW_SORTNAME // 名前順に整列 #enum VIEW_SORTSIZE // サイズ順に整列 #enum VIEW_SORTDATE // 日付順に整列 #enum VIEW_SORTTYPE // 種類順に整列 #enum VIEW_PARENTFOLDER // 上のフォルダへ #enum VIEW_NETCONNECT // ネットワークドライブへ接続 #enum VIEW_NETDISCONNECT // ネットワークドライブから切断 #enum VIEW_NEWFOLDER // 新しいフォルダ #enum HIST_BACK // 前へ #enum HIST_FORWARD // 次へ #enum HIST_FAVORITES // お気に入り #enum HIST_ADDTOFAVORITES // お気に入りに追加 #enum HIST_VIEWTREE // ツリー表示 #enum MY_VERTICAL // 縦横切替 //ビットマップインデックスに合わせたボタン名とStyleとState tbString="切り取り","コピー","貼り付け","アンドゥ","リドゥ","削除","新規作成","開く","保存","印刷プレビュー","プロパティ","ヘルプ","検索","置換","印刷" StyleState= 0x1204, 0x1004, 0x1004, 0x1004, 0x1004,0x1004, 0x1804,0x1004,0x1004, 0x1004, 0x1004, 0x1004,0x1004,0x1004,0x1004 tbString(VIEW_LARGEICONS)="大きいアイコン","小さいアイコン","一覧表示","詳細表示","名前順に整列","サイズ順に整列","日付順に整列","種類順に整列","上のフォルダへ","ネットワークドライブへ接続","ネットワークドライブから切断","新しいフォルダ" StyleState(VIEW_LARGEICONS)= 0x9804|$4000, 0x9804|$4000, 0x9804, 0x9804|$4000, 0x1004 ,0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x5004 tbString(HIST_BACK) ="前へ","次へ","お気に入り","お気に入りに追加","ツリー表示" StyleState(HIST_BACK)=0x5004,0x1004, 0x1004, 0x1004, 0x1004 tbString(MY_VERTICAL) ="縦横切替" StyleState(MY_VERTICAL)=0x1204 //使用するビットマップインデックスをリストにして登録用ボタンデータリストを作る(ボタンデータID0用)IDは順序不同で連番である必要も無いが同じIDは不可でID0はセパレータに使用 dim bmilist,1 bmilist=STD_CUT,STD_COPY,STD_PASTE,STD_UNDO,STD_REDOW,STD_DELETE,STD_FILENEW,STD_FILEOPEN,STD_FILESAVE,STD_PRINTPRE,STD_PROPERTIES,STD_HELP,STD_FIND,STD_REPLACE,STD_PRINT,VIEW_PARENTFOLDER,VIEW_LIST,HIST_BACK,HIST_FORWARD nbtotal=0 repeat length(bmilist) //コマンドIDはビットマップインデックス+1で設定 bmi=bmilist(cnt) tbbutton(nbtotal*5) = bmi, bmi+1, (StyleState(bmi) ), 0, varptr(tbString(bmi)) //直接文字列ポインタを指定してるので元の変数が書き換わったり nbtotal++ loop tbbutton(nbtotal*5) = 8, 0, 0x100, 0, 0 ;「セパレータ」ボタン コマンドIDは0 (8はセパレータのデフォルト幅) nbtotal++ NumButtonsList=length(bmilist)+1 //登録するTBBUTTON構造体の数(+1はセパレータ分) //二つ目のボタンデータリスト作成(ボタンデータID1用) dim bmilist,1 bmilist=VIEW_LARGEICONS,VIEW_SMALLICONS,VIEW_DETAILS,VIEW_SORTNAME,VIEW_SORTSIZE,VIEW_SORTDATE,VIEW_SORTTYPE,MY_VERTICAL repeat length(bmilist) //コマンドIDはビットマップインデックス+100で設定 bmi=bmilist(cnt) tbbutton(nbtotal*5) = bmi, bmi+1, StyleState(bmi), 0, varptr(tbString(bmi)) //直接文字列ポインタを指定してるので元の変数が書き換わったり nbtotal++ loop tbbutton(nbtotal*5) = 8, 0, 0x100, 0, 0 ;「セパレータ」ボタン コマンドIDは0 (8はセパレータのデフォルト幅) nbtotal++ NumButtonsList(1)=length(bmilist)+1 //登録するTBBUTTON構造体の数 gsel 0 min_winid=ginfo_sel min_hndw=hwnd //ツールバー作成サブルーチン>*MakeToolBar //サブルーチン内で使用されるデータをセット (↓の10と11はウィンドウバッファIDで1は画像数) Small_tbadd=-1,0, -1,4, -1,8, 10,1//TBADDBITMAP小さい画像用(IDB_STD_SMALL_COLOR、IDB_HIST_SMALL_COLOR、IDB_HIST_SMALL_COLOR, 自前画像小,1) Large_tbadd=-1,1, -1,5, -1,9, 11,1//TBADDBITMAP大きい画像用(IDB_STD_LARGE_COLOR、IDB_HIST_LARGE_COLOR、IDB_HIST_LARGE_COLOR、自前画像大,1) IDB_cnt=4 //一回のSetTBButtonDataに使用するTB_ADDBITMAPの回数(小さい方だけ) IDB_Large=1 //大きい画像を使用するか(0なら使用しない) //WS_CHILD WS_VISIBLE TBSTYLE_CUSTOMERASE TBSTYLE_FLAT TBSTYLE_TOOLTIPS CCS_ADJUSTABLE CCS_TOP tbstyle=$40000000 | $10000000 | 0x2000 | 0x0800 | 0x0100 | 0x0020 | 0x0001 toolbarindex=0 tbbdid=0 //ボタンデータID tbindex=0 //ボタンデータインデックス(複数のツールバーに使うボタンデータを纏めてtbbuttonに入れてる時用) NumButtons=NumButtonsList(toolbarindex) //登録するボタンデータの数 //配置順リスト(ビットマップインデックス+1をコマンドIDしてリスト化) dim tblist,1 tblist=HIST_BACK+1,HIST_FORWARD+1,VIEW_PARENTFOLDER+1 ,0, STD_FILENEW+1,STD_FILEOPEN+1,STD_FILESAVE+1,0,STD_CUT+1,STD_COPY+1,STD_PASTE+1,0,STD_FIND+1,VIEW_LIST+1 tbmax=length(tblist) //tbbuttonにボタンデータを入れてジャンプ gosub *MakeToolBar //ツールバーIDがidtools(toolbarindex)、ハンドルがhTools(toolbarindex)、コントロールIDがControlID(toolbarindex)に入る toolbarmax++ //作ったツールバーの数 //二つ目のツールバー作成(Small_tbadd、Large_tbadd、IDB_cnt、IDB_Largeは一つ目のデータを流用) //WS_CHILD WS_VISIBLE TBSTYLE_CUSTOMERASE TBSTYLE_FLAT TBSTYLE_TOOLTIPS CCS_ADJUSTABLE CCS_BOTTOM tbstyle=$40000000 | $10000000 | 0x2000 | 0x0800 | 0x0100 | 0x0020 | 0x0003 toolbarindex=1 //toolbarindex=toolbarmax tbbdid=1 //ボタンデータID tbindex=NumButtonsList(0) //ボタンデータインデックス(複数のツールバーに使うボタンデータを纏めてtbbuttonに入れてる時用) NumButtons=NumButtonsList(1) //登録するボタンデータの数 //配置順リスト(ビットマップインデックス+1をコマンドIDしてリスト化) dim tblist,1 tblist=MY_VERTICAL+1 ,0, VIEW_LARGEICONS+1 ,0, VIEW_SORTNAME+1,VIEW_SORTSIZE+1,VIEW_SORTDATE+1,VIEW_SORTTYPE+1 tbmax=length(tblist) //tbbuttonにボタンデータを入れてジャンプ gosub *MakeToolBar //ツールバーIDがidtools(toolbarindex)、ハンドルがhTools(toolbarindex)、コントロールIDがControlID(toolbarindex)に入る toolbarmax++ //作ったツールバーの数 ToolBarLoad "ToolBar.dat",hTools //ツールバー復元(一度初期状態でツールバーを設置してから実行してください) //ツールバーの変更でこの上にインサートできないように設定(setNoInsertButton、setNoDeleteButtonはセーブされません) setNoInsertButton hTools,HIST_BACK+1 ,1 setNoInsertButton hTools,HIST_FORWARD+1 ,1 setNoInsertButton hTools,VIEW_PARENTFOLDER+1 ,1 //ツールバーの変更で削除出来ないように設定(これを設定されてるボタンは未使用でも左側のリストボックスに表示されない) setNoDeleteButton hTools,HIST_BACK+1 ,1 setNoDeleteButton hTools,HIST_FORWARD+1 ,1 setNoDeleteButton hTools,VIEW_PARENTFOLDER+1 ,1 setNoDeleteButton hTools(1),MY_VERTICAL+1 ,1 setNoDeleteButton hTools(1),VIEW_LARGEICONS+1 ,1 setNoDeleteButton hTools(1),VIEW_SMALLICONS+1 ,1 setNoDeleteButton hTools(1), VIEW_DETAILS+1 ,1 ; 右クリックメニュー作成 CreatePopupMenu hmenu(0)= stat //コマンドID0はセパーレータなのでツールバー右クリックメニューハンドルインデックスに利用 AppendMenu hmenu , 0, 101, "ユーザー設定" ; ドロップダウンボタン用のメニュー作成 CreatePopupMenu hmenu( STD_FILENEW+1) = stat //二つのツールバーでコマンドIDが被らないようにしてるのでIDをそのまま使用 AppendMenu hmenu( STD_FILENEW+1) , 0, 201, "新規1(未)" AppendMenu hmenu( STD_FILENEW+1) , 0, 202, "新規2(未)" AppendMenu hmenu( STD_FILENEW+1) , $800, 0, "" ; 区切り線 AppendMenu hmenu( STD_FILENEW+1) , 0, 203, "ファイルから...(未)" CreatePopupMenu hmenu(VIEW_LIST+1) = stat AppendMenu hmenu(VIEW_LIST+1), 0, 301, "縮小版(未)" AppendMenu hmenu(VIEW_LIST+1), 0, 302, "並べて表示(未)" //ドロップダウンメニュー選択でツールバーボタン入れ替え用(ボタンに機能は無い) CreatePopupMenu hmenu(VIEW_LARGEICONS+1) = stat AppendMenu hmenu(VIEW_LARGEICONS+1), 0, 402, "小さいアイコン" AppendMenu hmenu(VIEW_LARGEICONS+1), 0, 403, "詳細表示" CreatePopupMenu hmenu(VIEW_SMALLICONS+1) = stat AppendMenu hmenu(VIEW_SMALLICONS+1), 0, 401, "大きいアイコン" AppendMenu hmenu(VIEW_SMALLICONS+1), 0, 403, "詳細表示" CreatePopupMenu hmenu(VIEW_DETAILS+1) = stat AppendMenu hmenu(VIEW_DETAILS+1), 0, 401, "大きいアイコン" AppendMenu hmenu(VIEW_DETAILS+1), 0, 402, "小さいアイコン" oncmd gosub *OnCommand, WM_COMMAND oncmd gosub *OnNotify, WM_NOTIFY stop *OnCommand if toolbar_hwnd { //ツールバーの変更ダイアログが開いてる foreach cmbid if lparam = objinfo(cmbid(cnt),2) { if (wparam>>16)=9 {//CBN_SELENDOK cbi_bak=cbi(cnt) }else{ if ((wparam>>16)=1) and (cbi_bak ! cbi(cnt)) {//CBN_SELCHANGE ToolBarReset toolbar_hwnd,1,cbi(0),cbi(1) } } break } loop return } repeat toolbarmax if lparam = hTools(cnt) { itemId = wParam & $FFFF title "ToolBra:"+cnt+" コマンドID:"+itemId if itemId=(MY_VERTICAL+1) { sendmsg hTools(cnt), 0x0439, 0, 0//TB_GETSTYLE tbst=stat sendmsg hTools(cnt),0x0412,itemId,0//TB_GETSTATE tbst=(tbst|$83)^$83 //縦スタイルと上下にくっくつッスタイル削除 if stat&1 {tbst | $81}else{tbst | 3} sendmsg hTools(cnt), 0x0438, 0,tbst//TB_SETSTYLE ToolBarReset hTools(cnt),1 //スタイル変更を反映させるのにリセット } break } loop return *OnNotify dupptr NMHDR_dup,lParam,44,4 //logmes strf("%d %d %d %d %d %d %d %d %d %d ",NMHDR_dup,NMHDR_dup(1),NMHDR_dup(2),NMHDR_dup(3),NMHDR_dup(4),NMHDR_dup(5),NMHDR_dup(6),NMHDR_dup(7),NMHDR_dup(8),NMHDR_dup(9)) if NMHDR_dup(1)>=TOOLBAR_FIRSTID and NMHDR_dup(1)<=TOOLBAR_LASTID{//idFrom (ToolBarAddButtonsの戻り値と同じならツールバーとして処理、TOOLBAR_FIRSTIDはモジュール内で256に設定してあります。) ///codeの-700〜-728を0〜28にしてgoto on -(NMHDR_dup(2)+700) goto *_TBN_GETBUTTONINFOA,*_TBN_BEGINDRAG,*_TBN_ENDDRAG,*_TBN_BEGINADJUST,*_TBN_ENDADJUST,*_TBN_RESET,*_TBN_QUERYINSERT,*_TBN_QUERYDELETE,*_TBN_TOOLBARCHANGE,*_TBN_CUSTHELP,*_TBN_DROPDOWN,*_TBN_711 ,*_TBN_GETOBJECT,*_TBN_HOTITEMCHANGE,*_TBN_DRAGOUT,*_TBN_DELETINGBUTTON,*_TBN_GETDISPINFOA,*_TBN_GETDISPINFOW,*_TBN_GETINFOTIPA,*_TBN_GETINFOTIPW,*_TBN_GETBUTTONINFOW,*_TBN_RESTORE,*_TBN_SAVE,*_TBN_INITCUSTOMIZE,*_TBN_WRAPHOTITEM ,*_TBN_DUPACCELERATOR ,*_TBN_WRAPACCELERATOR,*_TBN_DRAGOVER ,*_TBN_MAPACCELERATOR if NMHDR_dup(2)=-5 {//右クリックメニュー if NMHDR_dup(3)=-1 { TrackPopupMenuEx hmenu, $100, ginfo_mx, ginfo_my, NMHDR_dup, 0 if stat=101{ sendmsg NMHDR_dup,TB_CUSTOMIZE,0,0 } } } } return *_TBN_GETBUTTONINFOA //-700 ret=retButtonInfo(lParam) //ツールバーの変更ダイアログが開いてる時に必要に応じてダミーボタンデータや左リストボックスにアイテムを追加します return ret //retButtonInfo(lParam)の戻り値を渡す *_TBN_BEGINDRAG //(-701) return *_TBN_ENDDRAG //(-702) return *_TBN_BEGINADJUST //(-703) return *_TBN_ENDADJUST //(-704)ツールバーの変更ダイアログが閉じられた if toolbar_hwnd {//コンボボックス削除 toolbar_hwnd=0 selwinid_bak=ginfo_sel gsel tb_winid foreach cmbid clrobj cmbid(cnt),cmbid(cnt) loop gsel selwinid_bak } return *_TBN_RESET //(-705) //[ToolBarReset ツールバーハンドル,ボタンを最初に戻す,テキスト表示モード維持,画像の大きさ維持] ToolBarReset NMHDR_dup,0,-1,-1//初期状態に戻す(最初にToolBarAddButtonsで登録したボタン配置) return *_TBN_QUERYINSERT //(-706) //変更ダイアログを開いた時に一度だけ灰色文字の 区切り のインデックスが来るので1を返さないとダイアログは閉じる return retNoInsertButton(lParam) //ここで0を返したボタンは[追加(A) ->]がグレーアウトする *_TBN_QUERYDELETE //(-707) //変更ダイアログを開いた時に一度も1を返さないとダイアログは閉じる return retNoDeleteButton(lParam) //ここで0を返したボタンは[<- 削除(R)]がグレーアウトする *_TBN_TOOLBARCHANGE //(-708) DelDummyButtton //ダミーボタン削除 return *_TBN_CUSTHELP //(-709) return *_TBN_DROPDOWN //(-710) gosub *OnToolDropDown return *_TBN_711 //(-711) return *_TBN_GETOBJECT //(-712) return *_TBN_HOTITEMCHANGE //(-713) return *_TBN_DRAGOUT //(-714) return *_TBN_DELETINGBUTTON //(-715) return *_TBN_GETDISPINFOA //(-716) return *_TBN_GETDISPINFOW //(-717) return *_TBN_GETINFOTIPA //(-718) return *_TBN_GETINFOTIPW //(-719) return *_TBN_GETBUTTONINFOW //(-720) return *_TBN_RESTORE //(-721) return *_TBN_SAVE //(-722) return *_TBN_INITCUSTOMIZE //(-723) //[getCustomizeListbox lParam,ツールバーの変更ダイアログのハンドル, 左のリストボックスのハンドル, 右のリストボックスのハンドル, 発見したリストボックスの数] //ListBoxcntが2じゃ無い場合何かしらの不具合 getCustomizeListbox lParam,customize_hwnd, LeftListbox_hwnd, RightListbox_hwnd, ListBoxcnt //各種ハンドルとリストボックスの数を取得 if stat < 0 { dialog "Listboxが見つかりませんでした。" }else{ if stat = 0 {//リストボックスが二つとも見つかった(1だったら前回見つけてから閉じられていない) logmes refstr //(デバッグログ)ツールバーの変更ダイアログ上のオブジェクトが文字列で返る「クラスネーム,ハンドル,表示テキスト」 gosub *ModeCombox //おまけで変更ダイアログにコンボボックス追加 } } return *_TBN_WRAPHOTITEM //(-724) return *_TBN_DUPACCELERATOR //(-725) return *_TBN_WRAPACCELERATOR //(-726) return *_TBN_DRAGOVER //(-727) return *_TBN_MAPACCELERATOR //(-728) return *ModeCombox toolbar_hwnd=NMHDR_dup //設定用コンボボックスに関連付けるツールバーハンドル dim Rect,4 GetWindowRect customize_hwnd,Rect //ツールバーの変更ダイアログのサイズ取得 SetWindowPos customize_hwnd,0,Rect,Rect(1),(Rect(2)-Rect),(Rect(3)-Rect(1))+34,0x0004|0x0100//ツールバーの変更ダイアログのサイズ変更 tb_winid=ginfo_sel pos (Rect(2)-Rect)/2-240/2,(Rect(3)-Rect(1))-34 font "MS ゴシック",12,16 objmode 2 objsize 240,18,22 cbi=getTBTextON(toolbar_hwnd),getTBSmallLarge(toolbar_hwnd) cbstr="テキストを下に表示する\nテキストを右に表示する\nいくつかのテキストを右側に表示する\nテキストを表示しない","小さい画像\n大さい画像" repeat 2 combox cbi(cnt),100,cbstr(cnt) cmbid(cnt)=stat cmbhwnd(cnt)=objinfo(stat,2) SetParent cmbhwnd(cnt),customize_hwnd //ツールバーの変更ダイアログをcomboxの親に設定 loop return *OnToolDropDown htb=NMHDR_dup //TrackPopupMenuExで書き変わってしまうので itemId = NMHDR_dup(3) dim rc, 4 sendmsg htb, TB_GETRECT, itemId, varptr(rc) pt = rc(0), rc(3) ClientToScreen htb, varptr(pt) TrackPopupMenuEx hmenu(itemId), $100, pt(0), pt(1), htb, 0 if stat>400 {//ツールバーボタン差し替え処理 mid=stat sendmsg htb,0x0419,itemId,0 //TB_COMMANDTOINDEX index=stat if mid=401 { sendmsg htb,0x0416,index,0 //TB_DELETEBUTTON ToolBarInsertButton htb,index,VIEW_LARGEICONS+1 } if mid=402 { sendmsg htb,0x0416,index,0 //TB_DELETEBUTTON ToolBarInsertButton htb,index,VIEW_SMALLICONS+1 } if mid=403 { sendmsg htb,0x0416,index,0 //TB_DELETEBUTTON ToolBarInsertButton htb,index,VIEW_DETAILS+1 } } return //ツールバーIDがidtools、ハンドルがhTools、コントロールIDがControlIDに入る *MakeToolBar winobj "ToolbarWindow32","",0,tbstyle,0,0 hTool=objinfo_hwnd(stat) hTools(toolbarindex)=hTool sendmsg hTool, TB_BUTTONSTRUCTSIZE, 20, 0 sendmsg hTool, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS |TBSTYLE_EX_MIXEDBUTTONS repeat IDB_cnt //[ ToolBarAddPic ツールバーハンドル, -1, システム定義ビットマップ値 ](システム定義のボタン) //[ ToolBarAddPic ツールバーハンドル, bufferID, 画像数 ](自前のボタン) ToolBarAddPic hTool,Small_tbadd(cnt*2),Small_tbadd(cnt*2+1) loop LargeIndex=0 repeat IDB_cnt*IDB_Large ToolBarAddPic hTool,Large_tbadd(cnt*2),Large_tbadd(cnt*2+1),24 if cnt=0 {LargeIndex=stat} loop SetTBButtonData tbbdid, NumButtons,tbbutton(tbindex*5),0,LargeIndex,16,24 //ToolBarAddButtons ツールバーハンドル,ボタンデータID,設置するボタンの数,設置するボタンのIDリスト,ボタンにテキストを表示するか(0なら表示) ToolBarAddButtons hTool,tbbdid,tbmax,tblist,2,0 ControlID(toolbarindex)=stat return *OnClose ToolBarSave "ToolBar.dat",toolbarmax,hTools //現在のツールバーを全て保存 foreach hmenu if hmenu(cnt) {DestroyMenu hmenu(cnt)} loop end

こんな使い方も出来ると言う事で
前へ、次へ、上のフォルダへは変更ダイアログ上で削除と他のを挿入も出来ないように設定
大きいアイコン、小さいアイコン、詳細表示、縦横切替は削除出来ないように設定
削除できないように設定したのは未使用でも変更ダイアログの左側に表示されない



暇人

リンク

2015/12/30(Wed) 15:35:34|NO.73863

書き忘れ
ToolBarAddPicで画像ファイルやウィンドウバッファから画像を追加したときの透過色の扱い
pngファイル以外は左上0,0の座標の色を透過色としてボタンの表面色で塗りつぶします。
pngファイルはボタンの表面色の上にアルファ値有効で読み込まれます。

8ビットカラー画像ファイル等は読み込み時に24ビットのビットマップになります。
ウィンドウバッファIDを指定する場合は必ずフルカラーのバッファにしてください。
(gmode4が使えないので)



ONION software Copyright 1997-2023(c) All rights reserved.