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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0928
とあるプログラマタブコントロールのタブ切り替え3解決


とあるプログラマ

リンク

2018/9/28(Fri) 17:02:00|NO.85463

ttp://lhsp.s206.xrea.com/hsp_object6.html

こちらのページを参考にタブコントロールを作成したのですが、ユーザ側の直接的な操作ではなく、HSP内部からのタブの切替の方法がわからずに悩んでいます。
例として、ボタンを押したら2番めのタブに切り替える。みたいなことは出来ますでしょうか?
gselを使用した場合はタブの中身だけが変わって、タブのつまみは変わりませんでした。



この記事に返信する


MillkeyStars

リンク

2018/9/28(Fri) 23:25:51|NO.85468

こんな感じでいいのかな?
一応サンプルとしてタブを順次切り替えするスクリプトだけど

#module #uselib "user32" #func GetClientRect "GetClientRect" int, int #func SetWindowLong "SetWindowLongA" int, int, int #func SetParent "SetParent" int, int #uselib "gdi32" #cfunc GetStockObject "GetStockObject" int #define global TCM_FIRST 0x1300 #define global TCM_GETITEMCOUNT (TCM_FIRST + 4) //タブコントロールタブ(アイテム)数取得 #define global TCM_GETCURSEL (TCM_FIRST + 11) //選択中のタブ(アイテム)番号を取得 #define global TCM_SETCURSEL (TCM_FIRST + 12) //選択中となるタブ(アイテム)番号を設定 ; CreateTab p1, p2, p3, p4 ; タブコントロールを設置します。statにタブコントロールのハンドルが ; 返ります。 ; p1〜p2=タブコントロールのX/Y方向のサイズ ; p3(1)=タブの項目として貼り付けるbgscr命令の初回ウィンドウID値 ; p4=タブコントロールの追加ウィンドウスタイル #deffunc CreateTab int p1, int p2, int p3, int p4 winobj "systabcontrol32", "", , $52000000 | p4, p1, p2 hTab = objinfo(stat, 2) sendmsg hTab, $30, GetStockObject(17) TabID = p3 if TabID = 0 : TabID = 1 dim rect, 4 return hTab ; InsertTab "タブつまみ部分の文字列" ; タブコントロールに項目を追加します。 #deffunc InsertTab str p2 pszText = p2 : tcitem = 1, 0, 0, varptr(pszText) sendmsg hTab, $1307, TabItem, varptr(tcitem) GetClientRect hTab, varptr(rect) sendmsg hTab, $1328, , varptr(rect) bgscr TabID + TabItem, rect.2 - rect.0, rect.3 - rect.1, 2, rect.0, rect.1 SetWindowLong hwnd, -16, $40000000 SetParent hwnd, hTab TabItem++ return ; タブ切り替え処理用 #deffunc ChangeTab gsel wID + TabID, -1 sendmsg hTab, $130B wID = stat gsel wID + TabID, 1 return #global ; 以下、サンプル screen , 400, 300 syscolor 15 : boxf ; タブコントロールの設置。第3パラはbgscr命令で作成するウィンドウ ; IDの初期値です。たとえば、下のように「1」でタブの項目が4個あると ; すると、1〜4のウィンドウが使われます。「2」でタブの項目が5個とすると、 ; 2〜6が使われます。別で使用するウィンドウID値と被らないよう注意。 pos 50, 50 CreateTab 300, 200, 1 ; タブつまみ切り替え時に利用するタブコントロールのハンドルを取得 hTabControl = stat ; このサンプル上ではbgscr命令で作成したウィンドウID値「1」が使われ ; ます。 InsertTab "AAA" ; bgscr命令上にオブジェクトを置く感覚で処理を書きます。 pos 50, 50 : mes "A" InsertTab "BBB" pos 50, 50 : mes "B" InsertTab "CCC" pos 50, 50 : mes "C" ; bgscr命令ウィンドウのID値「4」が使われます。 InsertTab "DDD" pos 50, 50 : mes "D" ; タブの項目追加が終わったら、タブ内に貼り付けたbgscr命令が非表示 ; 状態になっているので、表示されるようgsel命令を指定。CreateTab命令で ; 指定したウィンドウIDの初期値と同じ値を指定します。 gsel 1, 1 ; 元々のscreen命令のウィンドウID 0に描画先を戻します。 gsel ; タブ項目切り替え処理時のメッセージ (WM_NOTIFY) oncmd gosub *notify, $4E button gosub "タブ切り替え",*Tab_con stop ;タブ項目の順次切り替え(主の要望している内容) *tab_con //タブコントロールハンドルからタブの総数を取得 sendmsg hTabControl,TCM_GETITEMCOUNT,0,0 //タブ総数を取得 TabCount = stat sendmsg hTabControl,TCM_GETCURSEL,0,0 //タブコントロールの現在選択中のタブ番号を取得 NextTab = stat + 1 //取得と同時に次にアクティブになるタブ番号を設定 if NextTab >= TabCount : NextTab = 0 //タブ番号がタブの総数を超えようとしている場合 0 にする sendmsg hTabControl,TCM_SETCURSEL,NextTab,0 //タブの選択中番号(アイテム)の切り替え ChangeTab //描画用の命令に更新指示 return ; タブ項目切り替え処理部分です。 *notify dupptr nmhdr, lparam, 12 if nmhdr.0 = hTabControl & nmhdr.2 = -551 { ChangeTab ; 元々のscreen命令のウィンドウID 0に描画先を戻します。 gsel } return



あらや

リンク

2018/9/28(Fri) 23:41:49|NO.85469

必要なのはTCM_SETCURSELだけですね。


sendmsg hTabControl, 0x130C, 1; // TCM_SETCURSELでBBBのタブに切り替える ChangeTab; // サンプル通り

sendmsgの3番目の数字が切り替えるタブの番号です。
タブの番号はHSPのバッファに関係なく0から始まる連番になります。



とあるプログラマ

リンク

2018/9/29(Sat) 00:34:50|NO.85470

>>MillkeyStarsさん
>>あらやさん

ありがとうございます。他のサイトでsndmsg使ってたのでsndmsgでいけることは分かってたのですが、そのサイトは第2パラが0x1312で載っていたのでうまくいかず詰んでいました…
おかげでうまくいきました。



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