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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0901
kohkiカーソルがないときのみ文字を表示する11解決


kohki

リンク

2012/9/1(Sat) 06:32:40|NO.48981

inputでインプットボックスを描画して、

そのあとに

薄い灰色とかで「〜を入力してください」と書き、

入力するためにポインターをあてると消えて入力できる。。。

みたいな

google先生とかでもありそうなw

を作りたいのですが。。。

inputとsendmsg,あとhwndで

hwndを使って、inputboxにカーソルがあるか調べて、

なかったらsendmsgで「〜を入力してください」を送信。。。

とかやりたいんですけど、

sendmsgがややこし過ぎて意味わからんwww

どうやったらできますかね?

ご教授お願いいたしますm(_ _)m

hsp3です

今思ったのですが、

objprmとかoncmdとかを使ってもいいかもしれません



この記事に返信する


DW

リンク

2012/9/1(Sat) 10:31:41|NO.48983

これでどうでしょうか。かなり面倒くさいです(笑)。
WinAPIを真面目に使えばもっと楽になるんでしょうけどね。


#uselib "user32.dll" #cfunc IsWindowVisible "IsWindowVisible" int #cfunc WindowFromPoint "WindowFromPoint" int,int inp1 = "";これが本物の内容を保存するための変数 backup_inp1 = "";inp1の内容のバックアップ用変数 flag1 = 0;「〜ここに入力してください〜」メッセージが表示されているかどうかのフラグ。 screen 0,400,200 pos 10,10 : input inp1,100,16,0 objid_1 = stat;オブジェクトIDを取得 hwnd_obj_1 = objinfo(objid_1,2);入力ボックスのウィンドウハンドルを取得 repeat hwnd_get_1 = WindowFromPoint(ginfo(0),ginfo(1));マウスカーソル直下のGUIオブジェクトのウィンドウハンドルを取得 if hwnd_get_1 ! hwnd_obj_1 {;それが先ほどの入力ボックスのものでないなら... if (backup_inp1 = "〜ここに入力してください〜")|(inp1 = "") {;ユーザーから何も入力されていない場合のみ... if flag1 = 0 { backup_inp1 = inp1;バックアップ objprm 0,"〜ここに入力してください〜" flag1 = 1;フラグセット } } } else {;マウスが入力ボックスの上にある場合 ;dialog backup_inp1 ;dialog inp1 if backup_inp1 ! "〜ここに入力してください〜" {;ユーザーが何かしら入力している場合 if flag1 = 1 { inp1 = backup_inp1;バックアップから復元 objprm 0,inp1 flag1 = 0 } } else { if flag1 = 0 { backup_inp1 = inp1;バックアップ(どうせ空なんだけど...) objprm 0,"〜ここに入力してください〜" flag1 = 1 } } } await 10 loop



DW

リンク

2012/9/1(Sat) 10:35:46|NO.48984

コメントし忘れていました。15行目の「(inp1 = "")」という条件は最初に入力ボックスの内容が
空の状態で始まる場合(※普通の場合はこれに当てはまります)のための条件です。



DW

リンク

2012/9/1(Sat) 10:37:30|NO.48985

情報の小出しになってすみません。「〜ここに入力してください〜」のメッセージは灰色には
なりませんのでご注意を。



kohki

リンク

2012/9/1(Sat) 11:02:02|NO.48986

おお

できました

感謝です

ありがとうございますm(_ _)m



MIZUSHIKI

リンク

2012/9/1(Sat) 11:39:08|NO.48987

解決済みですが、せっかく書いたので参考にしてみて下さい(^^;

検索ボックスの様に、フォーカスを当てると消えるタイプです。

手法としては、
入力ボックスの上にダミーの文字列としてスタティックテキストを配置。
フォーカスを得たら、スタティックテキストが非表示になるようにしてます。
また、スタティックテキストが描画されようとしているときに割り込んで、
文字数を見て何も入ってなければ表示するようにしてます。

API、API、oncmdの乱舞で申し訳ないですけど。。。


#include "user32.as" #include "gdi32.as" // inputボックス box="" pos 150, 30 input box,150,22 id_input = stat hw_input = objinfo_hwnd(stat) // input内のダミーテキスト ; inputボックスのサイズを取得 dim rect,4 GetWindowRect hw_input, varptr.rect ScreenToClient hwnd, varptr.rect(0) ScreenToClient hwnd, varptr.rect(2) ;サイズを一回り小さくする rect = rect(0)+6, rect(1)+2, rect(2)-2, rect(3)-2 ;ダミーのスタティックテキスト作成 pos rect(0), rect(1) winobj "static", "", , $50000000/*WS_CHILD|WS_VISIBLE*/ | $200/*SS_CENTERIMAGE*/, rect(2)-rect(0), rect(3)-rect(1) hw_input_dummy = objinfo_hwnd(stat) // デフォルトGUIフォント GetStockObject 17 sendmsg hw_input_dummy, $30/*WM_SETFONT*/, stat // ダミーテキストの設定 sendmsg hw_input_dummy, $C/*WM_SETTEXT*/, 0, "Google(日本語)" // フォーカスを逃がすためのテキトーなオブジェクト pos 10,30 input nn sysfont 17 mes "↑フォーカス逃がし用" objsel stat ;スタティックテキストの色を変更するため割り込み oncmd gosub *ctlcolorstatic, $138/*WM_CTLCOLORSTATIC*/ ;テキストボックスが描画されようとしているときに割り込み oncmd gosub *CTLCOLOREDIT, $133/*WM_CTLCOLOREDIT*/ ;フォーカス変化を監視する oncmd gosub *command, $111/*WM_COMMAND*/ stop // スタティックテキストの色を変更 *ctlcolorstatic if lparam = hw_input_dummy { // ダミーテキストの文字色、背景色の変更 GetSysColor 17 /*COLOR_GRAYTEXT ; 淡色状態 (無効状態) のテキストの色 */ SetTextColor wparam, stat SetBkMode wparam, 1 /*TRANSPARENT ; バックグラウンドカラーをつけない*/ GetSysColorBrush 5 /*COLOR_WINDOW ; ウィンドウの背景色*/ return stat } return // テキストボックスが描画されようとしている *CTLCOLOREDIT if lparam = hw_input { ;inputの文字数を取得 sendmsg hw_input, $E/*WM_GETTEXTLENGTH*/, 0,0 if stat=0 { ;文字数が0ならダミーテキストを再描画 InvalidateRgn hw_input_dummy,0,1 return } } return // フォーカス変化を監視 *command if lparam = hw_input { wp_HIWORD = wparam>>16 & $FFFF switch wp_HIWORD case $100 : ;(EN_SETFOCUS) // フォーカスを得た。 ダミーテキストを消す GetWindowLong hw_input_dummy,-16 SetWindowLong hw_input_dummy,-16,stat|$10000000^$10000000 ;WS_VISIBLE = $10000000 swbreak case $200 : ;(EN_KILLFOCUS) // フォーカスを失った。 inputに入力がなければダミーテキストを表示 sendmsg hw_input, $E/*WM_GETTEXTLENGTH*/, 0,0 if stat=0 { GetWindowLong hw_input_dummy,-16 SetWindowLong hw_input_dummy,-16,stat|$10000000 ;WS_VISIBLE = $10000000 } swbreak swend } return



cats

リンク

2012/9/1(Sat) 16:30:28|NO.48992

短いの作ってみました。

#uselib "user32.dll" #cfunc WindowFromPoint "WindowFromPoint" int,int sdim buf,256 buf="入力してください" input buf,200,20 sInput=stat hInput=objinfo(stat,2) repeat await 30 switch WindowFromPoint(ginfo(0),ginfo(1)) case hInput if buf="入力してください":objprm sInput,"" swbreak default if buf="":objprm sInput,"入力してください" swend loop



kohki

リンク

2012/9/1(Sat) 18:05:54|NO.48994

おおおおおおおおおおおお

これはwwww

ありがとうございますm(_ _)m



kohki

リンク

2012/9/1(Sat) 18:52:38|NO.48996

だが

    GetWindowRect hw_input, varptr.rect
ScreenToClient hwnd, varptr.rect(0)
ScreenToClient hwnd, varptr.rect(2)

ここがエラーになるw



MIZUSHIKI

リンク

2012/9/1(Sat) 23:39:04|NO.49001

ん、サンプルスクリプトでエラー出ちゃってますか?
なんでしょう、こちらは特にエラーは出てないですが。

違うとは思いますが、こちらに書き換えてみて下さい。

GetWindowRect hw_input, varptr(rect) ScreenToClient hwnd, varptr(rect(0)) ScreenToClient hwnd, varptr(rect(2))
私はたまに見た目と書きやすさから varptr.rect(0) みたいに書いてしまうのですが今は推奨されてない書き方だったかと思います。

ちなみにエラーメッセージはなんて出てますか?



kohki

リンク

2012/9/2(Sun) 06:32:42|NO.49004

いや

サンプルスクリプトではできるのですが

移植するとできなくなる(ノД`)

エラーメッセージは


#HSP script preprocessor ver3.3RC1 / onion software 1997-2011(c)
#Use file [hspdef.as]
#Error:symbol in use in line 377 [user32.as]
#Fatal error reported.
#Error:symbol in use in line 6 [as.hsp]
#Fatal error reported.

です



cats

リンク

2012/9/2(Sun) 10:59:38|NO.49010

>移植するとできなくなる(ノД`)
1行目の

#include "user32.as"


#uselib "user32.dll" #func GetWindowRect "GetWindowRect" int,int #func ScreenToClient "ScreenToClient" int,int #func GetSysColor "GetSysColor" int #func GetSysColorBrush "GetSysColorBrush" int #func InvalidateRgn "InvalidateRgn" int,int,int #func GetWindowLong "GetWindowLongA" int,int #func SetWindowLong "SetWindowLongA" int,int,int
にしてもダメですか?



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