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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0201
TAKAIEの検索バーのような・・・8解決


TAKA

リンク

2007/2/1(Thu) 17:39:43|NO.5353

初めまして、TAKAと申します。

早速質問なのですが、IEの検索バーのような入力ボックスはどのようにすれば作成できますか?

具体的に説明すると、
何も入力されていない時は灰色の文字で「○○検索」などと書いてあり、
カーソルを合わせると普通の入力ボックスのようになるやつです。

…説明へたですみません。



この記事に返信する


As

リンク

2007/2/1(Thu) 23:44:15|NO.5365

きたないですが・・・



#uselib "user32.dll" #func global SetWindowPos "SetWindowPos" sptr,sptr,sptr,sptr,sptr,sptr,sptr #define global SetWindowLong SetWindowLongA #func global SetWindowLongA "SetWindowLongA" sptr,sptr,sptr #define global GetWindowLong GetWindowLongA #func global GetWindowLongA "GetWindowLongA" sptr,sptr #func global InvalidateRect "InvalidateRect" sptr,sptr,sptr #define global CreateWindowEx CreateWindowExA #func global CreateWindowExA "CreateWindowExA" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr #func global SetParent "SetParent" sptr,sptr #define global GetWindowText GetWindowTextA #func global GetWindowTextA "GetWindowTextA" sptr,sptr,sptr #uselib "gdi32.dll" #func global GetStockObject "GetStockObject" sptr #func global SetBkColor "SetBkColor" sptr,sptr #func global SetTextColor "SetTextColor" sptr,sptr #func global SetBkMode "SetBkMode" sptr,sptr #define global WM_CTLCOLORSTATIC 0x0138 //スタティック #define global WM_CTLCOLOREDIT 0x0133 //エディットボックスinput #define global GWL_EXSTYLE $FFFFFFEC #define global WS_EX_TOPMOST $00000008 #define global SWP_SHOWWINDOW 0x0040 #define global SWP_NOSIZE 0x0001 #define global SWP_NOMOVE 0x0002 #define global WS_CHILD 0x40000000 #define global WHITE_BRUSH 0 //ホワイトブラシ #define global NULL_BRUSH 5 #define global WS_VISIBLE 0x10000000 #define global GWL_STYLE -16 #define global WM_ERASEBKGND 0x0014 //自動で背景を削除されないようにする #define ctype crgb(%1,%2,%3) (%1|(%2<<8)|(%3<<16)) #module #deffunc objvisible int p1,int p2 if p2=1{ SetWindowPos p1,0,0,0,0,0,SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE }else{ SetWindowPos p1,0,0,0,0,0,SWP_HIDEWINDOW|SWP_NOSIZE|SWP_NOMOVE } return #global syscolor 15 : boxf aa="" : bb="" sysfont 17 mref bm, 67 : hfont=bm(38) pos 10,10 input aa,100,21,256 haa=objinfo(stat,2) pos 10,50 input bb,100,21,256 hbb=objinfo(stat,2) GetStockObject WHITE_BRUSH hwhite=stat GetStockObject NULL_BRUSH hnull=stat pos 12,12 winobj "STATIC","検索ボックス",0,WS_VISIBLE|WS_CHILD,100,18 hs=objinfo(stat,2) //statictext "検索ボックス",90,18 //hs=objinfo(stat,2) sendmsg hs, $30, hfont, 1 oncmd gosub *ON_WM_CTLCOLORSTATIC,WM_CTLCOLORSTATIC oncmd gosub *ON_WM_CTLCOLOREDIT,WM_CTLCOLOREDIT oncmd gosub *ON_WM_ERASEBKGND,WM_ERASEBKGND stop *ON_WM_ERASEBKGND return *ON_WM_CTLCOLORSTATIC if lparam=hs{ objsel -1 losel=stat if (objinfo(stat,2)!haa)&(aa=""){ SetBkColor wparam,crgb(255,255,255) SetTextColor wparam,crgb(180,180,180) sdim buf,256 GetWindowText hs,varptr(buf),256 if buf="": sendmsg hs,$c,0,"検索ボックス" return hwhite }else{ sendmsg hs,$c,0,"" SetBkMode wparam,$1 return hnull } } return *ON_WM_CTLCOLOREDIT hsel=lparam rect=0,0,80,18 InvalidateRect hs,varptr(rect),0 return



TAKA

リンク

2007/2/2(Fri) 01:30:33|NO.5369

早速の返信ありがとうございます。
まさにコレです!!

しかし、こんなに長いのを・・・お手数おかけしました。

自分でも少し理解したいのですが、もう少し詳しく教えていただけると幸いです。

そこで、いくつか疑問点があるのですが、
#module内の objvisible はどこに行ってしまわれたのでしょうか?

また、この動作は
inputの上にwinobj(灰色の文字)を配置し、カーソルが合うと消える
という仕組みになっているのでしょうか?

ということは、今まで通り「input」の使い方でよろしいんですよね。

追記:他のウィンドウ(hsp以外も含む)をアクティブにするとエラーになります。



As

リンク

2007/2/2(Fri) 18:53:17|NO.5372

時間がなかったので省いたところと無駄を消し忘れたところとバグだらけです^^;
ていうか今も時間がないので詳しく説明はできませんが、


objvisible は ウィンドウを非表示にさせる命令なのですが、使ってみようとおもったら
うまく動作しなかったのでけしてください^^;



if (objinfo(stat,2)!haa)&(aa=""){


この箇所ですが、objsel の値が-1以外だと実行というように


if (stat!-1)&(objinfo(limit(stat,0,100),2)!haa)&(aa=""){

というふうにすれば他のウィンドウをアクティブにしてもエラーは発生しません。


本当は、直接winobjで作成されたウィンドウの親ウィンドウをinputboxにしたかったのですが、
inputbox自体のポジションを0,0に変更しないといけなかったりとめんどくさかったので
やりませんでした^^;

ウィンドウの上にウィンドウを載せて、ウィンドウの再描画(nvalidateRect hs,varptr(rect),0)が実行されるたびに
表示しまくっている邪道な方法ですが、一応それっぽくはなるかと思います^^;


ウィンドウメッセージに関してはGoogleなどで調べてみて、どういうときに実行されてるのか
確認していただければ幸いです^^

プログラム内の動作では、検索ボックスにフォーカスが合った場合、
背景と文字共に透明化して、ほかのオブジェクトに移ったら、検索ボックスに
文字が表示されてない場合「検索ボックス」と表示されるようになっています。


尚、IE7の検索バーを調べてみましたら同じように複数のEDITBOXが重なっていました。



TAKA

リンク

2007/2/3(Sat) 00:57:32|NO.5377

大切なお時間を割いてしまって申し訳ございません。

他ウィンドウをアクティブにしてもエラーが出なくなりました!
ありがとうございます。

>尚、IE7の検索バーを調べてみましたら同じように複数のEDITBOXが重なっていました。

そこまで調べていただいてすみません…

これで思っていたものが作れそうです!
本当にありがとうございました!!!



TAKA

リンク

2007/2/3(Sat) 23:04:54|NO.5405

1度解決にしたので、回答していただけるかわかりませんが書き込ませていただきます。

ウィンドウに複数のオブジェクトを配置しているのですが、
どのオブジェクトにマウスを乗っけても、検索バーの文字がちらついてしまいます。
調べてみたところ、InvalidateRect命令あたりで制御していると思うのですが、
値を変えてもちらつきをなおすことは無理でした。

また、他ウィンドウをメインウィンドウ上に持っていき、その後メインをアクティブにすると
検索バーの文字が消えている状態になってしまいます。

分かる方いらっしゃいましたらご教授願います。



As

リンク

2007/2/4(Sun) 17:28:28|NO.5422


*ON_WM_CTLCOLORSTATIC

ラベル内の


else{ 〜〜 }

elseの間に【drawflag=0】を追加し、



*ON_WM_CTLCOLOREDIT

内の、【InvalidateRect hs,varptr(rect),0】を


if drawflag=0{ InvalidateRect hs,varptr(rect),0 drawflag=1 }

としてください。

描画が必要なときのみ描画されるようになります。



TAKA

リンク

2007/2/4(Sun) 22:00:04|NO.5430

度々すみません…

↑の通りにしたのですが、今度は
入力ボックスを1度アクティブにしてから、非アクティブにした時に
「検索ボックス」の文字が表示されなくなりました…

時間のある時でいいので、よろしくお願いいたします。



TAKA

リンク

2007/2/10(Sat) 01:34:27|NO.5553

自分で試行錯誤してみました。

原因は、検索ボックスと表示しているほうのダイアログをアクティブにしても
drawflagが0にならないことでした。

そこで、

stop

のところを
repeat
〜
loop
にし、その中に

objsel -1 if stat=0 : drawflag=0

というようにしてみました。
すると、ちらつかずにすみました。

このような動作でも問題ないのでしょうか?



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