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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
1104
吹雪ダイアログ表示後のカーソル位置の復帰6解決


吹雪

リンク

2017/11/4(Sat) 17:57:54|NO.81779

 以下のようなスクリプトを書いて実行すると、dialogの表示後にリストボックスはカーソルを失い、再度リストボックスを操作するにはTABキーによる移動が必要となってしまいます。


listbox x,200,"あ\nい\nう\nえ\nお" objsel 0 wait 500 dialog "ダイアログ"

 そこで、oncmdでWM_SETFOCUSの受信時に以下のようなラベルにジャンプするようにしてみたのですが、これでもうまくいきません。



#uselib "user32" #func SetFocus "SetFocus" int *WM_SETFOCUS if wparam=gethwnd(0):SetFocus objinfo(0,2) return #defcfunc gethwnd int _gid mref bmscr, 96 + _gid return bmscr(13)

 ツール系ソフトの制作に際し、例えば設定用の別ウィンドウの表示、ファイル参照ダイアログの表示、エラー通知後などで元のカーソル位置に自動復帰してほしいという事は多々あり、わざわざ各ダイアログの直後にカーソル位置復帰用の命令を入れるのはとても手間がかかる状況です。

 onkeyでのジャンプ等を利用して、カーソル位置の復帰をうまく行う方法はないでしょうか。



この記事に返信する


暇人

リンク

2017/11/4(Sat) 18:08:34|NO.81780

objselすれば良いだけじゃ?

listbox x,200,"あ\nい\nう\nえ\nお" objsel 0 wait 500 objsel -1 selid=stat dialog "ダイアログ" if selid >= 0 : objsel selid



沢渡

リンク

2017/11/4(Sat) 18:16:40|NO.81781

ダイアログを表示する前に、objsel -1でフォーカスの合っているオブジェクトIDを取得し、
ダイアログ表示後にそのIDにobjselする方法ではいけませんか?


objsize 100,10 pos 0,0 : listbox a,200,"あ\nい\nう\nえ\nお" pos 100,0 : listbox b,200,"か\nき\nく\nけ\nこ" pos 200,0 : listbox c,200,"さ\nし\nす\nせ\nそ" objsel 0 wait 500 objsel -1 : obj=stat dialog "ダイアログ" objsel obj

(かく言う私も、objselにこんな用法があるなんて以下のスレを見るまで知りませんでしたが)
http://hsp.tv/play/pforum.php?mode=pastwch&num=12381



沢渡

リンク

2017/11/4(Sat) 18:18:20|NO.81782

被った&statが-1(フォーカスが合ってない)だった時のこと考慮してなかった┐(´ー`)┌



吹雪

リンク

2017/11/4(Sat) 18:46:16|NO.81784

>> 暇人 様
>> 沢渡 様


 たしかに、ご指摘の方法で一応解決は可能です。(現状はこの方法を使っています。)

 ただ、ソフトの規模が大きくなればなるほど、操作先ウィンドウが変わる箇所の直前・直後に毎回命令を入れねばならないのが面倒になってしまったのです。
 それに、(HSP製でない)そこら中のソフトウェアではどれでも実装されているのですから、わざわざ毎回命令を呼ぶというような邪道な事をしなくとも、うまい方法があるのではないかと考えた次第です。



暇人

リンク

2017/11/4(Sat) 20:47:04|NO.81786

ウィンドウ毎にoncmdを設定して
アクティブ変化と入力フォーカスを監視すれば良い

WM_ACTIVATE = 6 WM_SETFOCUS = 7 dim selid,2 //使用する予定の最大ウィンドウID+1 screen 0,640,480,0,50,50 title "0" oncmd 0 //ウィンドウ作成時に割り込みジャンブが発生してしまうので割り込み一時停止 oncmd gosub *ACTIVATE,WM_ACTIVATE oncmd gosub *SETFOCUS,WM_SETFOCUS listbox x,200,"あ\nい\nう\nえ\nお" screen 1,640,480,0,700,50 title "1" oncmd gosub *ACTIVATE,WM_ACTIVATE oncmd gosub *SETFOCUS,WM_SETFOCUS listbox y,200,"あ\nい\nう\nえ\nお" objsel 0 oncmd 1 //ウィンドウが作り終わったので割り込み再開 wait 500 dialog "ダイアログ" stop *SETFOCUS //ウインドウが入力フォーカスを得た gsel act //アクティブウィンドウを操作先に設定 if selid(act) >= 0 { //非アクティブになる時に入力フォーカスがあるオブジェクトがる objsel selid(act) } return *ACTIVATE //アクティブ変化 if wparam=0 { //非アクティブになる objsel -1 selid(ginfo_act)=stat //非アクティブになるウィンドウの入力フォーカスがあるオブジェIDを保存 }else{ //アクティブになる act=ginfo_act //アクティブウィンドウID } return



吹雪

リンク

2017/11/4(Sat) 22:38:06|NO.81787

>> 暇人 様

 WM_ACTIVATEを使えばよかったのですね。
 これで目的の事ができそうです。
 ありがとうございました。



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