ようこそゲストさん

つーさのくーかん -再誕-

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 が ツールバーハンドルと一致した場合のみ処理する。
       '&#' . ord(*) . ';'/

#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

       '&#' . ord(*) . ';'onCommand
	if lparam!=hToolbar : return
	dialog "ボタン「"+teststr.wparam+"」が押されました。"
return 0

1: アマグラマー 2007年12月18日(Tue) 午後11時38分

初めまして、アマグラマーと申します。

この度はモジュールの使用許可申請、質問
のため、コメントさせていただきます。

月影とも様の公開されているモジュールの前に
「* このモジュールはあなたのスクリに組み込んで自由に使用できるものとします。」
と記述されていますが、
このモジュールの前では記述されていなかったので、
念のため、使用許可をいただきたいと思います。

失礼ですが、質問というか「こうしたい」ということがあるので、
聞いてください。

ボタンの下(横)に表示される、文字列の大きさを変えたいのですが
どうしたらよいのでしょうか?
お願いします。

失礼します。

2: つーさ 2007年12月19日(Wed) 午後9時18分

ボタンの文字列に表示される文字のフォントは
WM_SETFONT あたりを投げれば変更されると思います。
このモジュールは、あまり形が美しくないのですが、
使用および改造等制限しませんので、どうぞ遠慮なく。

3: アマグラマー 2007年12月26日(Wed) 午後11時00分

つーささんのアドバイスどおり、WM_SETFONTを使って
文字を大きくすることが出来ました。
ありがとうございました。

ですが、ツールバーの灰色の領域から出るとそこで文字が途切れてしまいます。
又の質問失礼ですが、助言の方よろしくお願いします。

4: つーさ 2008年01月06日(Sun) 午前0時33分

おそくなってしまったので、もう解決しているかもしれませんが。
サイズ調整は、TB_AUTOSIZE を sendmsgしてやればいいです。

font MSMincho,64 : mref bmscr,67
sendmsg hToolBar, 0x0030, bmscr.38, 1 // WM_SETFONT
sendmsg hToolBar, 0x0421, 0, 0 // TB_AUTOSIZE

このモジュール内では、ツールバーのサイズは、ボタンを作るときに再調節してるので、
ボタンを追加する前にフォントを設定しておけば勝手にやってくれます。

5: 質問厨 2008年04月14日(Mon) 午前4時45分

はじめまして、
このモジュールでアイコンを追加していったのですが、
おもむろに区切り線も追加しようと
したのですが、そこで詰まってしまいました。
区切り線が表示されません。
あるいはビットマップで表示するものでしょうか?

6: つーさ 2008年04月15日(Tue) 午前1時47分

AddButton の 4番目の引数 style には、以下のようなスタイルを設定できます。
http://yokohama.cool.ne.jp/chokuto/urawaza/prm/toolbar_button_style.html
要するに、ここに TBSTYLE_SEP (=1) を設定すれば、区切り線になるかと?

7: 質問厨 2008年04月15日(Tue) 午後4時06分

どうもです。
なんとか解決したみたいです!


名前:  非公開コメント