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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
1204
Crystalツールバーの作成について17解決


Crystal

リンク

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できます。画像にあるアイコンすべて使ってツールバーを作りたいです。



この記事に返信する


zrs90(5さい)

リンク

2021/12/4(Sat) 16:31:42|NO.94599

例のエディタ関連ですか?
これってツールバーでなく、メニューバー?
それなら、こんなのが見つかりました。

https://hsp.tv/contest/hspcontest1870.txt

プロコンの出品作品らしいです。
...を調べると、良いかも。



Crystal

リンク

2021/12/4(Sat) 16:43:12|NO.94600

ありがとうございます。スクリプトを組んでテストしたのですが、ツールバーではありませんでした。
ツールバーモジュールはこんな感じのものです。
https://chokuto.ifdef.jp/urawaza/toolbar1.html
ちょくとさんのホームページより抜粋しました。これでスクリプトを実行しても私の画像がバグって正常に表示ができません。



zrs90(5さい)

リンク

2021/12/4(Sat) 18:00:31|NO.94601

申し訳ないです。
早とちりで、ツールバーとメニューバー
を勘違いしました。もう少し探してみます。

それと、同じ物を、hsp3.5で動かした時は、どうでしょうか?
構造体等の扱い方が、hsp3.6で変わって
しまってるようです。

例えば、フォントダイアログの指定が
一部出来なくなったりしてます。
こういったものが影響しているのかも。

stdlibとかが、使えたらなぁ...



zezenana

リンク

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ではどうでしょうか?



Crystal

リンク

2021/12/4(Sat) 19:18:08|NO.94603

>それと、同じ物を、hsp3.5で動かした時は、どうでしょうか?
>構造体等の扱い方が、hsp3.6で変わって
>しまってるようです。
HSP 3.6ですが、おそらく画像の縮小のパラメータが違っている可能性があるのですが、どこで指定されていて、画像ではどのように修正すべきか
知りたいという感じです。 HSP 3.5でも変わらない気がします。
>zezenana さん
できました。ですが、拡大するとやはり荒くなるのですが、荒くなくせる方法をお聞きしたいのと、クリック時の挙動を設定することはできますでしょうか?
例えば、最初の画像をクリックした際に、ダイアログを表示するなどです。、



zrs90(5さい)

リンク

2021/12/4(Sat) 20:16:51|NO.94604

役に立たないかもしれませんが
ツールバー関係の記事を漁って見ました。

画像が、粗くならない方法は、想像がつかないです。
拡大時、条件判定で、別の画像とすり替えるとか?

以前、沢渡さんが9/19のスレッドでハンバーガーメニュー
の実装か何かで画像サイズを調整して、回答していましたが...


http://hsp.tv/play/pforum.php?mode=pastwch&num=74032

http://hsp.tv/play/pforum.php?mode=pastwch&num=76158

http://hsp.tv/play/pforum.php?mode=pastwch&num=73346



※↓コレは、クリップボードに入れて外部から検索。
http://wiki.hsp.moe/ツールバーの画像%2Bα.html



zrs90(5さい)

リンク

2021/12/4(Sat) 22:22:05|NO.94606

沢渡さんの記事の件は、忘れて下さい。
コピペした時、一部消えてしまったようで。


上から三つ目の、73346 のスレッドに『暇人』と
言う方の、モジュール?があるんですが...
動くとしたら、化け物に近いっす。
相当色々出来そう。(※理解出来る代物じゃない)

この方、同一人物なら、●ちゃんねるで
その当時、この掲示板で、5本の指に入る実力者だったらしい
...と最近、別件で調べ物してたら、出てきました。
他の方は、イノビアさんとか、ご存知のメンツでしたが。



Crystal

リンク

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



zezenana

リンク

2021/12/5(Sun) 12:36:50|NO.94618

Crystal さん

>拡大するとやはり荒くなるのですが、荒くなくせる方法をお聞きしたいのと、クリック時の挙動を設定することはできますでしょうか?
>例えば、最初の画像をクリックした際に、ダイアログを表示するなどです。、

NO.94598 のスクリプトを組んでいて出てくるレベルの質問ではなかったので
調べたところ hiro239415さんの「HSPメモ帳」ブログのサンプルスクリプトの転載であることがわかりました。

https://blog.goo.ne.jp/hiro239415/e/e2e18994dbbfd65f3c2678b13729a29e

すみませんが、あまり好ましい質問の方法・手法ではないと思います。

上記ブログではツールバーやスクリプトの解説もされておりますし、
既に こいる さんがこのサンプルを使えるようにしたものを提供されておりますが
自分である程度の理解や調査をしてから疑問や質問をするのが良いと思いますがどうでしょうか?



zezenana

リンク

2021/12/5(Sun) 13:21:11|NO.94620

Crystal さん

>拡大するとやはり荒くなるのですが、荒くなくせる方法

提供されたbmp画像は896x16ですので、16x16ドットが最大のサイズです。
これ以上のサイズを指定しても画像のドットが拡大されるだけです。

解決策としては、これより大きなアイコン画像ファイル(32x32ドット以上など)を準備することで
画像拡大に耐えられると思います。
ただし大きいと今度は縮小が荒れるという問題がありますので適切なサイズの画像を準備するのが良いと思います。

上記以外には画像ファイル指定ではなくアイコンファイルを指定する方法などがあります。
アイコンファイルには大きさごとに異なる画像が準備されている場合があるので拡大や縮小に耐えられると思います。
アイコンのロードはLoadImageAやLoadIconAにて行うことが出来ます。この掲示板やネットで調べると情報が出てくるはずです。

>クリック時の挙動を設定することはできますでしょうか?

こちらについては こいる さんが詳しく解説されておりますので確認してください。



Crystal

リンク

2021/12/5(Sun) 13:22:29|NO.94621

>NO.94598 のスクリプトを組んでいて出てくるレベルの質問ではなかったので
>調べたところ hiro239415さんの「HSPメモ帳」ブログのサンプルスクリプトの転載であることがわかりました。
ソース元をよく調べて転載できていませんでした。すみませんでした。以後気を付けます。自分でも調べてから質問させていただきます。
>こいる さん
二つの場合のソースを書いていただきありがとうございます。無事できました。
zezenanaさん、zrs90(5さい) さん も様々な情報をいただきありがとうございました。
お騒がせしました。



ねんねこ5787

リンク

2021/12/5(Sun) 16:18:25|NO.94623

ツールバーではないと思うのですが、これはどうでしょうか?
https://hsp.moe/download/HSPRibbonUI_sample002.zip



Crystal

リンク

2021/12/5(Sun) 16:28:16|NO.94624

>NO.94623
リボンUIですね。それを実用化するのはちょっと厳しいです。
理由としては、HSPとは別言語のXAMLの要素が必要だったり、新たにボタンを追加するモジュールがわからないので、現段階では扱えなかったりします。
リボンUIも取り入れたいところですが... HSPでXAMLが扱えるようになればなぁ...と思っています。



zrs90(5さい)

リンク

2021/12/18(Sat) 16:02:39|NO.94717

crystalさんへ

偶然、opencv sharp関係の調べ物をしていて
見つけたのですが、リボンU I hsp3で
使えるかも。

イノビアさんのホームページ(※Twitterからも、入れます)
1番下のジャンクコーナーに、それらしき記述がありました。

私は、スマホ投稿なので、内容は確認出来ませんが
気が向いたら、ダウンロードしてみては?



Crystal

リンク

2021/12/18(Sat) 16:32:38|NO.94718

>zrs90(5さい)さん
調べていただきありがとうございます。HSPでリボンUIが扱えるのは知っていますが、リボンの内容が変更できないのが難点で...
変更方法なども調べてみたのですが... Visual StudioでDLL調べるか、ソースコードを変更するしか方法がなく...
それを行うには、HSPとは別にC++を覚えなければならないのが大変で使おうか迷っているところです。



zrs90(5さい)

リンク

2021/12/18(Sat) 16:50:42|NO.94719

...すでに、ご存知だったようですね。申し訳ないです。

偶然、あちらのページを覗く必要が
ありまして...こちらのスレッドを
思い出しただけです。



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