| 
 | 
 
								
									|  |  
 
 
 
 |  | 
2021/12/4(Sat) 15:41:50|NO.94598 
以下のスクリプトを利用して、次のような画像を使って、ツールバーを作成したいのですが、バグって作れません。どうすればいいか教えていただきたいです。 
<スクリプト: test.hsp>
 #uselib "comctl32.dll" 
#func InitCommonControls "InitCommonControls" 
#func CreateToolbarEx "CreateToolbarEx" int,int,int,int,int,int,sptr,int,int,int,int,int,int 
#uselib "user32.dll"
#func LoadImage "LoadImageA" int,sptr,int,int,int,int
#func SendMessage "SendMessageA" int,int,int,int
InitCommonControls
sdim string,260
string="test.bmp"
LoadImage 0,varptr(string),0,96,32,0x8010
himg=stat
if himg==0 : dialog "LoadImage error" : stop
dim tb , 5 , 3
tb(0,0)=0:tb(1,0)=2000:poke tb,8,0x04:poke tb,9,0x00:tb(3,0)=0:tb(4,0)=0
tb(0,1)=1:tb(1,1)=2001:poke tb,28,0x04:poke tb,29,0x00:tb(3,1)=0:tb(4,1)=0
tb(0,2)=2:tb(1,2)=2002:poke tb,48,0x04:poke tb,49,0x00:tb(3,2)=0:tb(4,2)=0
CreateToolbarEx hwnd,0x50000000,0,3,0,himg,varptr(tb),3,32,32,0,0,20
htoolbar=stat
SendMessage hToolbar, 0x421, 0, 0; TB_AUTOSIZE
stop
 
<画像:test.bmp>
https://d.kuku.lu/0b48a32e0 
画像に関してはアップローダー(上のリンク)からDLできます。画像にあるアイコンすべて使ってツールバーを作りたいです。
 | 
 
 
 
 
 
 
 
 |  | 
2021/12/4(Sat) 18:00:31|NO.94601 
申し訳ないです。早とちりで、ツールバーとメニューバー
 を勘違いしました。もう少し探してみます。
 
 それと、同じ物を、hsp3.5で動かした時は、どうでしょうか?
 構造体等の扱い方が、hsp3.6で変わって
 しまってるようです。
 
 例えば、フォントダイアログの指定が
 一部出来なくなったりしてます。
 こういったものが影響しているのかも。
 
 stdlibとかが、使えたらなぁ...
 
 | 
 
 
 |  | 
2021/12/4(Sat) 18:07:55|NO.94602 
Crystalさん
 画像がバグる件のみですが
 ザッと見た感じで、LoadImageAのドキュメントにある第4,5パラメータのcx,cy値は
 リソース幅と高さとなっているので、896x16のbmp画像で96,32だと潰れませんか?
 896,16または0,0と指定するか(等倍)、または1792,32ではどうでしょうか?
 
 | 
 
 
 |  | 
2021/12/4(Sat) 19:18:08|NO.94603 
>それと、同じ物を、hsp3.5で動かした時は、どうでしょうか?>構造体等の扱い方が、hsp3.6で変わって
 >しまってるようです。
 HSP 3.6ですが、おそらく画像の縮小のパラメータが違っている可能性があるのですが、どこで指定されていて、画像ではどのように修正すべきか
 知りたいという感じです。 HSP 3.5でも変わらない気がします。
 >zezenana さん
 できました。ですが、拡大するとやはり荒くなるのですが、荒くなくせる方法をお聞きしたいのと、クリック時の挙動を設定することはできますでしょうか?
 例えば、最初の画像をクリックした際に、ダイアログを表示するなどです。、
 
 | 
 
 
 
 
 |  | 
2021/12/4(Sat) 22:22:05|NO.94606 
沢渡さんの記事の件は、忘れて下さい。コピペした時、一部消えてしまったようで。
 
 
 上から三つ目の、73346 のスレッドに『暇人』と
 言う方の、モジュール?があるんですが...
 動くとしたら、化け物に近いっす。
 相当色々出来そう。(※理解出来る代物じゃない)
 
 この方、同一人物なら、●ちゃんねるで
 その当時、この掲示板で、5本の指に入る実力者だったらしい
 ...と最近、別件で調べ物してたら、出てきました。
 他の方は、イノビアさんとか、ご存知のメンツでしたが。
 
 | 
 
 
 |  | 
2021/12/4(Sat) 22:31:31|NO.94607 
ありがとうございます。私も調べたのですが、暇人さんという方すごいですね。モジュールだけで300行以上はいっているの初めて見ました。
 確かにこれを応用すれば完成形に近づきそうです。また質問になるのですが、このモジュールを使用した際、カット、貼り付け
 などといったアイコンを Win32のDLLから利用していると思われているのですが、ほかのアイコンを表示させたり、クリック時の挙動
 をどのようにすべきか教えていただければと思います。
 クリック時では、 case文でいけるのかちょっと不安です。
 
 | 
 
 
 |  | 
2021/12/5(Sun) 10:32:04|NO.94612 
クリック時の挙動は、WM_COMMANDをoncmdすることでクリックの検知ができ、wParamの下位ワードにBTBUTTON構造体に設定したコマンドIDが入ってるので、それでボタンの識別ができます。 
※関数の引数を定数にしたりとかなり変えてますが、処理の流れ自体はそのままです 
※ボタンのサイズは、画像に合わせて16x16にしてます
 #uselib "comctl32.dll" 
#func InitCommonControls "InitCommonControls" 
#func CreateToolbarEx "CreateToolbarEx" int,int,int,int,int,int,sptr,int,int,int,int,int,int 
#uselib "user32.dll"
#func LoadImage "LoadImageA" int,sptr,int,int,int,int
#func SendMessage "SendMessageA" int,int,int,int
#define IMAGE_BITMAP 0
#define LR_LOADFROMFILE 0x10
#define TBSTATE_ENABLED 0x4
#define NULL 0
#define WS_VISIBLE 0x10000000
#define WM_COMMAND 0x111
// ボタンの数
#define BUTTON_COUNT 3
// ボタンのサイズ
#define BUTTON_SIZE 16
// ボタンのコマンドID(TはToolbarの略)
#enum IDT_FILENEW = 2000
#enum IDT_FILEOPEN
#enum IDT_FILESAVE
InitCommonControls
// 画像読み込み
// ・引数2 sptrなので文字列は直書きしてOK
// ・引数3,4には0を指定して原寸大
// ・引数5 LR_SHAREDフラグは、ファイルから読み込む場合には使用してはいけない
LoadImage 0, "test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE
hImg = stat
if hImg==0 : dialog "LoadImage error" : stop
// ボタン情報を作成
#module set_tb_button
	// BTBUTTON構造体のメンバーを設定する
	#deffunc SetTBButton array ary, int index, int bitmapIndex, int idCommand, int state, int style, int appData, int string
		ary(0,index) = bitmapIndex
		ary(1,index) = idCommand
		poke ary, (20 * index + 8), state
		poke ary, (20 * index + 9), style
		ary(3,index) = appData
		ary(4,index) = string
		return
#global
dim tb, 5, BUTTON_COUNT
SetTBButton tb, 0, 0, IDT_FILENEW,  TBSTATE_ENABLED, 0, 0, 0
SetTBButton tb, 1, 1, IDT_FILEOPEN, TBSTATE_ENABLED, 0, 0, 0
SetTBButton tb, 2, 2, IDT_FILESAVE, TBSTATE_ENABLED, 0, 0, 0
// ツールバー作成
// ・引数2、WS_CHILDは勝手に付くので、WS_VISIBLEだけでいい
CreateToolbarEx hwnd, WS_VISIBLE, 0, 1, NULL, hImg, varptr(tb), BUTTON_COUNT, BUTTON_SIZE, BUTTON_SIZE, 0, 0, 20
hToolbar = stat
SendMessage hToolbar, 0x421, 0, 0; TB_AUTOSIZE
// ボタン選択時の処理
oncmd gosub *onCommand, WM_COMMAND
stop
*onCommand
	if (lParam == hToolbar) {
		commandId = wParam & 0xFFFF
		
		switch commandId
		case IDT_FILENEW
			dialog "新規作成"
			swbreak
			
		case IDT_FILEOPEN
			dialog "開く"
			swbreak
			
		case IDT_FILESAVE
			dialog "上書き保存"
			swbreak
		swend
	}
	return
 
また、Windows標準のツールバーアイコンを使うには下のようにします。 
変更点は箇条書きにしてる通りです。
 #uselib "comctl32.dll" 
#func InitCommonControls "InitCommonControls" 
#func CreateToolbarEx "CreateToolbarEx" int,int,int,int,int,int,sptr,int,int,int,int,int,int 
#uselib "user32.dll"
#func LoadImage "LoadImageA" int,sptr,int,int,int,int
#func SendMessage "SendMessageA" int,int,int,int
#define IMAGE_BITMAP 0
#define LR_LOADFROMFILE 0x10
#define TBSTATE_ENABLED 0x4
#define NULL 0
#define WS_VISIBLE 0x10000000
#define WM_COMMAND 0x111
#define HINST_COMMCTRL 0xFFFFFFFF
// 標準ビットマップの種類とサイズ
#define IDB_STD_SMALL_COLOR  0
;#define IDB_STD_LARGE_COLOR  1
;#define IDB_VIEW_SMALL_COLOR 4
;#define IDB_VIEW_LARGE_COLOR 5
;#define IDB_HIST_SMALL_COLOR 8
;#define IDB_HIST_LARGE_COLOR 9
// 標準ビットマップのインデックス
// 詳細: https://docs.microsoft.com/en-us/windows/win32/controls/toolbar-standard-button-image-index-values
#define STD_FILENEW 6
#define STD_FILEOPEN 7
#define STD_FILESAVE 8
// ボタンの数
#define BUTTON_COUNT 3
// ボタンのサイズ
#define BUTTON_SIZE 16
// ボタンのコマンドID(TはToolbarの略)
#enum IDT_FILENEW = 2000
#enum IDT_FILEOPEN
#enum IDT_FILESAVE
InitCommonControls
// ボタン情報を作成
// ・ビットマップインデックスにSTD_*を指定
#module set_tb_button
	// BTBUTTON構造体のメンバーを設定する
	#deffunc SetTBButton array ary, int index, int bitmapIndex, int idCommand, int state, int style, int appData, int string
		ary(0,index) = bitmapIndex
		ary(1,index) = idCommand
		poke ary, (20 * index + 8), state
		poke ary, (20 * index + 9), style
		ary(3,index) = appData
		ary(4,index) = string
		return
#global
dim tb, 5, BUTTON_COUNT
SetTBButton tb, 0, STD_FILENEW,  IDT_FILENEW,  TBSTATE_ENABLED, 0, 0, 0
SetTBButton tb, 1, STD_FILEOPEN, IDT_FILEOPEN, TBSTATE_ENABLED, 0, 0, 0
SetTBButton tb, 2, STD_FILESAVE, IDT_FILESAVE, TBSTATE_ENABLED, 0, 0, 0
// ツールバー作成
// ・引数4にHINST_COMMCTRLを指定
// ・引数5にIDB_STD_SMALL_COLORを指定
CreateToolbarEx hwnd, WS_VISIBLE, 0, 0, HINST_COMMCTRL, IDB_STD_SMALL_COLOR, varptr(tb), BUTTON_COUNT, BUTTON_SIZE, BUTTON_SIZE, 0, 0, 20
hToolbar = stat
SendMessage hToolbar, 0x421, 0, 0; TB_AUTOSIZE
// ボタン選択時の処理
oncmd gosub *onCommand, WM_COMMAND
stop
*onCommand
	if (lParam == hToolbar) {
		commandId = wParam & 0xFFFF
		
		switch commandId
		case IDT_FILENEW
			dialog "新規作成"
			swbreak
			
		case IDT_FILEOPEN
			dialog "開く"
			swbreak
			
		case IDT_FILESAVE
			dialog "上書き保存"
			swbreak
		swend
	}
	return
|  
 |  | 
 
 
 |  | 
2021/12/5(Sun) 12:36:50|NO.94618 
Crystal さん>拡大するとやはり荒くなるのですが、荒くなくせる方法をお聞きしたいのと、クリック時の挙動を設定することはできますでしょうか?
>例えば、最初の画像をクリックした際に、ダイアログを表示するなどです。、 
NO.94598 のスクリプトを組んでいて出てくるレベルの質問ではなかったので 
調べたところ hiro239415さんの「HSPメモ帳」ブログのサンプルスクリプトの転載であることがわかりました。
https://blog.goo.ne.jp/hiro239415/e/e2e18994dbbfd65f3c2678b13729a29e 
すみませんが、あまり好ましい質問の方法・手法ではないと思います。
 
上記ブログではツールバーやスクリプトの解説もされておりますし、 
既に こいる さんがこのサンプルを使えるようにしたものを提供されておりますが 
自分である程度の理解や調査をしてから疑問や質問をするのが良いと思いますがどうでしょうか?
 | 
 
 
 |  | 
2021/12/5(Sun) 13:21:11|NO.94620 
Crystal さん
 >拡大するとやはり荒くなるのですが、荒くなくせる方法
 
 提供されたbmp画像は896x16ですので、16x16ドットが最大のサイズです。
 これ以上のサイズを指定しても画像のドットが拡大されるだけです。
 
 解決策としては、これより大きなアイコン画像ファイル(32x32ドット以上など)を準備することで
 画像拡大に耐えられると思います。
 ただし大きいと今度は縮小が荒れるという問題がありますので適切なサイズの画像を準備するのが良いと思います。
 
 上記以外には画像ファイル指定ではなくアイコンファイルを指定する方法などがあります。
 アイコンファイルには大きさごとに異なる画像が準備されている場合があるので拡大や縮小に耐えられると思います。
 アイコンのロードはLoadImageAやLoadIconAにて行うことが出来ます。この掲示板やネットで調べると情報が出てくるはずです。
 
 >クリック時の挙動を設定することはできますでしょうか?
 
 こちらについては こいる さんが詳しく解説されておりますので確認してください。
 
 | 
 
 
 |  | 
2021/12/5(Sun) 13:22:29|NO.94621 
>NO.94598 のスクリプトを組んでいて出てくるレベルの質問ではなかったので>調べたところ hiro239415さんの「HSPメモ帳」ブログのサンプルスクリプトの転載であることがわかりました。
 ソース元をよく調べて転載できていませんでした。すみませんでした。以後気を付けます。自分でも調べてから質問させていただきます。
 >こいる さん
 二つの場合のソースを書いていただきありがとうございます。無事できました。
 zezenanaさん、zrs90(5さい) さん も様々な情報をいただきありがとうございました。
 お騒がせしました。
 
 | 
 
 
 |  | 
2021/12/5(Sun) 16:18:25|NO.94623 | 
 
 
 |  | 
2021/12/5(Sun) 16:28:16|NO.94624 
>NO.94623リボンUIですね。それを実用化するのはちょっと厳しいです。
 理由としては、HSPとは別言語のXAMLの要素が必要だったり、新たにボタンを追加するモジュールがわからないので、現段階では扱えなかったりします。
 リボンUIも取り入れたいところですが... HSPでXAMLが扱えるようになればなぁ...と思っています。
 
 | 
 
 
 |  | 
2021/12/18(Sat) 16:02:39|NO.94717 
crystalさんへ
 偶然、opencv sharp関係の調べ物をしていて
 見つけたのですが、リボンU I hsp3で
 使えるかも。
 
 イノビアさんのホームページ(※Twitterからも、入れます)
 1番下のジャンクコーナーに、それらしき記述がありました。
 
 私は、スマホ投稿なので、内容は確認出来ませんが
 気が向いたら、ダウンロードしてみては?
 
 | 
 
 
 |  | 
2021/12/18(Sat) 16:32:38|NO.94718 
>zrs90(5さい)さん調べていただきありがとうございます。HSPでリボンUIが扱えるのは知っていますが、リボンの内容が変更できないのが難点で...
 変更方法なども調べてみたのですが... Visual StudioでDLL調べるか、ソースコードを変更するしか方法がなく...
 それを行うには、HSPとは別にC++を覚えなければならないのが大変で使おうか迷っているところです。
 
 | 
 
 
 |  | 
2021/12/18(Sat) 16:50:42|NO.94719 
...すでに、ご存知だったようですね。申し訳ないです。
 偶然、あちらのページを覗く必要が
 ありまして...こちらのスレッドを
 思い出しただけです。
 
 | 
 
 
 |