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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
1023
とあるプログラマ完全独自の自作コントロールを作成するための手順は6解決


とあるプログラマ

リンク

2019/10/23(Wed) 17:29:11|NO.88673

Win32での標準・コモンコントロールをオーナー・カスタムドローするのではなく、
レイアウトや操作なども全て自作の新しいコントロールの作成手順を おおまかでもいいので知りたいです。

例えばカラーピッカーやダイヤルタイプのゲージ、ON/OFFスイッチなどです。

自分が考えている方法では、
bgscrで作成したウィンドウを子ウィンドウ化
→ A2Dで必要なものを描画、スクリーンにコピー
→ ウィンドウメッセージを処理して操作と結果の描画を実現
といった流れです。

しかし、色々なソフトのこういったオリジナルのコントロールを WindowFromPoint, GetWindowClass で調べてみると、どうやらコントロールごとでウィンドウハンドルやクラスが変わらずに同じウィンドウで処理されている(?)ようです。
なので自分の方法は少し変なのかと思っているのですが、調べ方が悪いのかなかなかヒットしない状況です…

このような自作コントロールを作成する場合、どのような手順が良いとかありますでしょうか。
DLL作成する というのもありですが、その場合もおおまかな手順、調べるべきものなどを教えてくださるとありがたいです。



この記事に返信する


MillkeyStars

リンク

2019/10/24(Thu) 02:46:43|NO.88678

必要なのは、HSPに同梱されているコールバックモジュール(作者 tds12 さん)の物が必要だけかなー。
これがないと、ウィンドウ自体が作れないから必須になる。

上記でコールバック関数を作成したら、このコールバック関数のアドレスがわかるので、それを RegisterClassEx へ渡せばいい。
そうすれば、ウィンドウプロシージャを作成できる。

プロシージャにコールされたウィンドウメッセージをすべて HSP 側(スクリプト)で処理すれば、独自のコントロールの完成(基礎)。

そこからは、すべてウィンドウメッセージでやり取りすることになるから、それはとあるプログラマさんの腕次第です。



とあるプログラマ

リンク

2019/10/24(Thu) 10:20:47|NO.88679

プロシージャとクラスを登録するということはCreateWindow関数でウィンドウを作成するということですかね?
この方法でウィンドウを作成するのとbgscr命令で作成するのでは何か違いがあるのでしょうか。(メッセージ取得、送信はoncmd、sndmsgでできますし)



MillkeyStars

リンク

2019/10/24(Thu) 12:37:43|NO.88680

>>Win32での標準・コモンコントロールをオーナー・カスタムドローするのではなく、
>>レイアウトや操作なども全て自作の新しいコントロールの作成手順を おおまかでもいいので知りたいです。
BGSCR で作成すると、ただのサブクラス(オーナードロー・カスタムドロー)とあまり変わらないので、最初から作る方法を提示しただけです。

【HSPのウィンドウですべてを行う場合のサンプル】

#include "user32.as" #define WS_CHILD 0x40000000 #define WS_VISIBLE 0x10000000 #define WM_MOUSEMOVE 0x0200 //メインウィンドウのウィンドウハンドルを取得 MainHWND = hwnd //BGSCR の非表示で作成 bgscr 4,80,24,2 : cls 4 //ウィンドウスタイルを子ウィンドウに変更 SetWindowLong hwnd,-16,WS_CHILD | WS_VISIBLE //BMSCR で作成した子ウィンドウを親ウィンドウに統合 SetParent hwnd,MainHWND //ウィンドウメッセージ oncmd gosub oncmd gosub *Sub_mousemove,WM_MOUSEMOVE //子ウィンドウを表示 gsel 4,1 //操作先ウィンドウをメインウィンドウに変更 gsel 0 *main await 16 title ""+mousex+" / "+mousey+" / "+Sub_mx+" / "+Sub_my goto *main //子ウィンドウのマウス移動監視 *Sub_mousemove Sub_mx = lparam & 0xFFFF Sub_my = lparam >> 16 & 0xFFFF //連動して画面描画するなら最初に操作先を子ウィンドウにする事。 bgsel = ginfo(3) gsel 4 color 0,0,0 : boxf : color 255,255,255 pos 0,0 : mes "テスト "+Count Count++ gsel bgsel //return の引数は、HSPウィンドウプロシージャに任せる場合設定なしにする事。 //何らかの処理を行った場合、引数ありにする事。 return 0



とあるプログラマ

リンク

2019/10/24(Thu) 20:57:59|NO.88683

>>BGSCR で作成すると、ただのサブクラス(オーナードロー・カスタムドロー)とあまり変わらないので、最初から作る方法を提示しただけです。
bgscrで作る方法とRegisterClassEx & CreateWindowで作る方法では何か違いはあるのでしょうか。(ウィンドウIDが使えないとかではなく、根本的な機能の違いなど)
クラスに関してはまだ知識が浅いので変な質問でしたら申し訳ないです…

しかしどちらにせよ、ウィンドウを子ウィンドウ化してコントロールにする という点は同じようですね。
もっと他の方法があるのかと思ったのですが、そうするとフレームワークなど更に基盤的な話になってしまうのですかね。
(例えばGIMPというソフトのGTKのようなものなど)



MillkeyStars

リンク

2019/10/25(Fri) 00:24:07|NO.88686

>>bgscrで作る方法とRegisterClassEx & CreateWindowで作る方法では何か違いはあるのでしょうか。
>>ウィンドウIDが使えないとかではなく、根本的な機能の違いなど
ウィンドウID が使える使えないという前提なら、違いはないと思うよ。(BMSCR 構造体に保持されている変数などは除く)

どちらの場合も、RegisterClassEx で登録して、CreateWindow で作成して、ウィンドウプロシージャでメッセージの処理だからねー。



とあるプログラマ

リンク

2019/10/26(Sat) 12:10:25|NO.88698

なるほど、機能的には差異は無いんですね。だったらbgscrのほうでいいですかね… (プロシージャ処理が面倒くさい)

MillkeyStarsさん、ありがとうございました。



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