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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0913
ひらまるTabキーでオブジェクトのフォーカスを移動13未解決


ひらまる

リンク

2011/9/13(Tue) 17:09:43|NO.41339

HSPのインプットボックス等では、標準でTabキーによるフォーカス移動を行い、
objmodeの第2パラメータでフォーカス移動のON・OFFを設定できます。

しかし、winobj命令によってHSPの標準インプットボックスと全く同じ
スタイル、拡張スタイルのオブジェクトを作ってもTabキーによるフォーカス移動ができません。

#uselib "user32" #cfunc getWindowLongA "GetWindowLongA" sptr, sptr #define GWL_STYLE $FFFFFFF0 #define GWL_EXSTYLE $FFFFFFEC #define WS_CHILD $40000000 #define WS_VISIBLE $10000000 #define WS_BORDER $800000 #define WS_TABSTOP $10000 #define ES_AUTOHSCROLL $80 #define STYLE WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL #define UNKNOWN $200 ; HSPのインプットボックスに設定されていたEXスタイルの値 screen 0, 300, 350, 0, 100, 100 pos 10, 10 mes "HSP標準" objsize 280, 30 input test1 input test2 input test3 nowHwnd = objinfo( stat, 2 ) mes "スタイル   = " + getWindowLongA( nowHwnd, GWL_STYLE ) mes "拡張スタイル = " + getWindowLongA( nowHwnd, GWL_EXSTYLE ) mes "-------------------------\nwinobj" objsize 280, 30 winobj "Edit", "", UNKNOWN, STYLE winobj "Edit", "", UNKNOWN, STYLE winobj "Edit", "", UNKNOWN, STYLE nowHwnd = objinfo( stat, 2 ) mes "スタイル   = " + getWindowLongA( nowHwnd, GWL_STYLE ) mes "拡張スタイル = " + getWindowLongA( nowHwnd, GWL_EXSTYLE )
winobjで作ったオブジェクトのフォーカスをTabキーで変更するには、
他にどのパラメータをいじれば良いのでしょうか。



この記事に返信する


匿名

リンク

2011/9/13(Tue) 21:09:26|NO.41340

そういった処理は恐らくコントロールをサブクラス化しないと(各オブジェクトに送られるメッセージを直接取得できないと)不可能だと思います。
フォーカス変更用のウインドウスタイルが個別に用意されているわけではなく、HSPが自前でtabキーの押下を取得してフォーカスを移しているので。



TTRUKO

リンク

2011/9/13(Tue) 21:23:00|NO.41341

こんな感じでしょうか?

#uselib "user32" #cfunc getWindowLongA "GetWindowLongA" sptr, sptr #define GWL_STYLE $FFFFFFF0 #define GWL_EXSTYLE $FFFFFFEC #define WS_CHILD $40000000 #define WS_VISIBLE $10000000 #define WS_BORDER $800000 #define WS_TABSTOP $10000 #define ES_AUTOHSCROLL $80 #define STYLE WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL #define UNKNOWN $200 ; HSPのインプットボックスに設定されていたEXスタイルの値 screen 0, 300, 350, 0, 100, 100 pos 10, 10 mes "HSP標準" objsize 280, 30 input test1 input test2 input test3 nowHwnd = objinfo( stat, 2 ) mes "スタイル   = " + getWindowLongA( nowHwnd, GWL_STYLE ) mes "拡張スタイル = " + getWindowLongA( nowHwnd, GWL_EXSTYLE ) mes "-------------------------\nwinobj" objsize 280, 30 winobj "Edit", "", UNKNOWN, STYLE objskip stat, 5 winobj "Edit", "", UNKNOWN, STYLE objskip stat, 5 winobj "Edit", "", UNKNOWN, STYLE objskip stat, 5 nowHwnd = objinfo( stat, 2 ) mes "スタイル   = " + getWindowLongA( nowHwnd, GWL_STYLE ) mes "拡張スタイル = " + getWindowLongA( nowHwnd, GWL_EXSTYLE )



ひらまる

リンク

2011/9/13(Tue) 22:21:30|NO.41342

objskip命令!
こんなものがあったのに気付きませんでした…
ヘルプで「Tab」で検索したのに、objmodeにしか目が行きませんでした…;

しかしこのobjskip命令。
winobjで作ったオブジェクトのフォーカスも移動できるのですが、
エクスプローラー等で意味のないキーを押したときのビープ音?みたいなのが鳴ります。
これはobjskipを設定しなくても鳴るのですが(フォーカスを移動しないので当たり前)
objskipを設定した後も鳴るのはなぜでしょうか。


匿名さんが仰られているのは、
WM_KEYDOWNメッセージが送られてきたとき、lparamがTabキーならば、
SetFocusで次のフォーカスに移動する。ということでしょうか。
だとしたらWS_TABSTOPは何のためにあるのでしょうか……



info

リンク

2011/9/14(Wed) 05:43:09|NO.41352

どうやら、[ winobj で作った Edit に objskip ] すると、beep音が鳴るらしい?

>>ttp://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200807/08120030.txt

どういうことでしょうか?



ひらまる

リンク

2011/9/14(Wed) 15:36:01|NO.41356

>infoさん
そうですね…この方法でもビープ音が鳴りますね…
どっかでキー入力のメッセージが拾われていて、
「そこはTabで移動できないオブジェクトだよ」って言われているんでしょうか…

しかしそうなると、自前でSetFocusを使っても、
フォーカス移動はできるけどビープ音は鳴る。という状況は変わりませんよね
一体どうすれば良いのでしょうか……



info

リンク

2011/9/16(Fri) 17:40:22|NO.41384

>>「そこはTabで移動できないオブジェクトだよ」って言われているんでしょうか…

色々、試して思ったのですが、どうやら、
「そのObjectからは、もう移動できませんよ」的な意味の様な気がしてきました。

 



ひらまる

リンク

2011/9/17(Sat) 13:29:59|NO.41424

>「そのObjectからは、もう移動できませんよ」的な意味の様な気がしてきました。
なるほど…
昨日耐えかねてVBを始めたのですが、フォームデザイナぱないっすね;
そこでオブジェクトのプロパティを見ていて思ったのですが、
TabStopのほかに、TabIndexという値があります。
これはHSPのサイトを探しているときにもちょっと見た気がするのですが、
Tabキーで移動する順番(インデックス)を設定するようです。
もしかしたらこの値が順当に設定されていないから、
「そのObjectからは、もう移動できませんよ」的なエラーが出るのかなと思い…
……ましたが関係ないようです;
というかHSPでTabIndexの変更は可能なのでしょうか…
WM_TABINDEXのようなメッセージもないようですし…

っと、そんなことより今はビープ音の問題です。
これさえ鳴らなければ、あとは煮るなり焼くなりできるのですが……
いっそのことHSP標準オブジェクトを使うという妥協策も……orz



ひらまる

リンク

2011/9/23(Fri) 21:46:24|NO.41618

どうやらビープ音はメッセージボックスではなくウィンドウが鳴らしているようです。
なのでウィンドウのキープレスメッセージを拾って、
Tabキーが押されていた場合、キーイベントを「処理済み」に設定すればビープ音がならない気がするのですが、
問題はそれをHSPでどう実装するかです。
イベントを拾ってoncmdで飛ばした後、
iparamかlparamに入っている構造体のデータを変更すれば良いのでしょうか?
う〜〜ん…よくわかりません;

またなんか思いついたら書くかもしれません。
(同じことで悩んでる人いないのかなぁ…?)



Cookies

リンク

2011/9/23(Fri) 23:29:27|NO.41621

UNKNOWNとなっていた拡張ウィンドウスタイルは、WS_EX_CLIENTEDGEのようです。
https://sites.google.com/site/autohotkeyjp/reference/misc/Styles

>イベントを拾ってoncmdで飛ばした後、
>iparamかlparamに入っている構造体のデータを変更すれば良いのでしょうか?
処理済みか否かは、oncmdでgosubしたルーチンで、
return 0にするか、return 1にするかで決めることが多いんですがねぇ。

サブクラス化できれば一番いいですよね。



who

リンク

2011/9/23(Fri) 23:46:47|NO.41623

winobjで作られたウィンドウをサブクラス化すれば大丈夫みたいですね。



ひらまる

リンク

2011/9/24(Sat) 00:07:12|NO.41627

>UNKNOWNとなっていた拡張ウィンドウスタイルは、WS_EX_CLIENTEDGEのようです。
そのようですね。調べていただいてありがとうございます。
「縁が沈んで見える境界線を持つウィンドウを指定します。」ですか…
WS_BORDERとは違うのですね(・ω・)

>winobjで作られたウィンドウをサブクラス化すれば大丈夫みたいですね。
サブクラス…とりあえずググってみよう…

>サブクラスに転職した際、そのクラスのレベル40で習得できる全てのスキルを覚えている状態になります。
なるほど…メインクラスだけではプレイヤーが飽きてしまうから……Σってこれオンラインゲームじゃないですか!

>サブクラスとは - オブジェクト指向において,2つのクラスに継承関係があるとき,子クラスをサブクラスという。
こっちですね。こっち。

どうやらHSPでサブクラスを実装するには、
HSPで標準搭載されていないコールバック関数をどうにか導入しないといけないようですね。
(アンドロイドアプリ開発でコールバックとかなんかやった気がする……)
ちょくとさんの開発したhscallbk.dllやhsgetmsg.dllを使えば、
HSPでもコールバック関数の実装が可能…ですか。

set_subclass
set_message
get_message

なにやら簡単に実装できそうですね…
今はちょっと忙しくてHSPに触る時間がないので、
少し余裕ができたら実験してみたいと思います。
貴重な情報をありがとうございました。
解決は…実験の後で!(汗



Cookies

リンク

2011/9/24(Sat) 08:13:15|NO.41635

hscallbk.asでもいいんですが、
sbcobjっていうサブクラス化専用のがあるんですよ。
kz3さんが作られたもので、kz3さんのブリーフケースにあったらしいのですが、
今ではブリーフケースにはアクセス不可になってます。
しかしさっき見つけました
http://fs-cgi-basic01.freespace.jp/~hsp/up/upload.cgi?page=Main&dir=/other&sort=date
にあげられてました。

(使ったことありませんが、)
こちらはhpiファイルだからDLLもいりませんし、いいかもしれませんよ?



ひらまる

リンク

2011/9/24(Sat) 12:14:27|NO.41638

>Cookiesさん
sbcobjというサブクラス専用のプラグインを、
わざわざ探していただきありがとうございます。

早速使……おうとしてみたのですが;
(実行にはsbcobjが必要です)

#include "sbcobj.as" #define GWL_STYLE $FFFFFFF0 #define GWL_EXSTYLE $FFFFFFEC #define WS_CHILD $40000000 #define WS_VISIBLE $10000000 #define WS_BORDER $800000 #define WS_TABSTOP $10000 #define ES_AUTOHSCROLL $80 #define STYLE WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL #define WS_EX_CLIENTEDGE $200 #define WM_KEYDOWN $00000100 screen 0, 300, 350, 0, 100, 100 pos 10, 10 mes "-------------------------" mes "HSP標準" objsize 280, 30 input test1 input test2 input test3 mes "-------------------------" mes "winobj" objsize 280, 30 winobj "Edit", "", WS_EX_CLIENTEDGE, STYLE nowObj = stat objskip nowObj, 5 objcmd nowObj, WM_KEYDOWN, *KeyDown winobj "Edit", "", WS_EX_CLIENTEDGE, STYLE nowObj = stat objskip nowObj, 5 objcmd nowObj, WM_KEYDOWN, *KeyDown winobj "Edit", "", WS_EX_CLIENTEDGE, STYLE nowObj = stat objskip nowObj, 5 objcmd nowObj, WM_KEYDOWN, *KeyDown stop *KeyDown title "" + sbcobj + "でキーを押した" return
付属のサンプルではオブジェクト上のマウス座標をWM_MOUSEMOVEメッセージで拾って、
ポインタ画像変更をWM_SETCURSORで行なっている? ようなので、
とりあえずエディットボックスのWM_KEYDOWNを拾ってラベルに飛ばしてみたのですが、
その後どうしたら良いかが思いつきません;

皆さんサブクラス化を強く勧めていますが、
なぜサブクラス化すると良いのでしょうか。
サブクラス化してどうすれば良いのでしょうか。

そもそもサブクラスって継承した子クラスというイメージなのですが、
ウィンドウメッセージを拾って処理をするだけならサブクラス化の必要はないのでは…と考えてしまいます;

とはいえ、winobjで作ったオブジェクトをTabキーで移動するためには、
オブジェクトに対する何らかのメッセージを拾って、
それに対して何らかの処理をする必要がある。ということなのでしょう。

大変恐縮ですが、今一度どなたか御教授いただけないでしょうか。


追伸 Google検索してたらこんなん見つけました。
http://questionbox.jp.msn.com/qa602408.html



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