コマンドボタンからフォーカスを奪うには?

解決


なべしん  URL  2003-12-09 06:45:16  No: 80777

初めまして。VBは触らなくなってある程度経つので初心者扱いで
よろしくお願いします。VC++でテキストエディタコントロールを
制作しまして、それをDLL化しました。そこまでは
よかったのですが、VBでフォーム上にそのエディタのコントロールと
コマンドボタンが同居しているとコマンドボタンを押した後に
Enterキーを押してもそれをコマンドボタンにメッセージが
行ってしまいます。

コントロールの方はCreateWindowExで作成していて、
ダイアログコントロールのためにWM_GETDLGCODEを適切に
処理することでC++とWindowsSDKで作成したダイアログ上では
コマンドボタンと同居しても問題なく動作するようになりました。
しかし、VBではうまくいかないのです。
テキストエディタコントロール上でクリックされたときに
SetFocusAPIを呼び出していますが、まだコマンドボタンが
フォーカスを持っているようです。私個人も十分この件に関して
調べてきましたが、VBの特殊仕様についていけなくなったので
挫折してしまいました。どなたか、この件に関して詳しい方
ご教授願えませんか?よろしくお願いします。


kara  2003-12-09 18:52:52  No: 80778

> Enterキーを押してもそれをコマンドボタンにメッセージが
> 行ってしまいます。
コマンドボタンにBS_DEFPUSHBUTTONがついてないですか?
標準ボタンになっていた場合
そうなりそうな気がするのですが・・・


なべしん  URL  2003-12-09 21:17:36  No: 80779

早速

    Dim st As Long
    st = GetWindowLong(Command1.hwnd, GWL_STYLE)
    If st And BS_DEFPUSHBUTTON <> 0 Then
        st = st - BS_DEFPUSHBUTTON
        st = st + BS_PUSHBUTTON
    End If
    SetWindowLong Command1.hwnd, GWL_STYLE, st

こんな感じでやってみましたがうまくいかないです…。
クリックした後にエディタをクリックして(このときにエディタ
部分はSetFocusAPIを呼び出す)文字を打つことは出来ても
Enterだけはコマンドボタンが持って行ってしまいます。

なにやら.NETではSetStyleを使ったり
VB5ではCanGetFocusをfalseにすればフォーカスを
絶対に得ることのないボタンを作成できるそうですね。
僕はVB6を使っているのですが、その辺りの切り口から
うまくできないものですかね?


kara  2003-12-09 23:40:09  No: 80780

> なにやら.NETではSetStyleを使ったり
> VB5ではCanGetFocusをfalseにすればフォーカスを
> 絶対に得ることのないボタンを作成できるそうですね。
フォーカスを絶対に得られないようにするなら
ボタンのGotFocusイベントに別のコントロールにフォーカスを移すような
処理を入れれば可能だと思います(ただしかっこ悪いかも)

あとはボタンをサブクラス化して
WM_KEYDOWNのVK_RETURNがきたときに
自作のコントロールにSendMessageでもしてみてはどうでしょう?

自作のコントロールを直すほうがいいとも思うのですが・・・


なべしん  URL  2003-12-10 06:51:27  No: 80781

サブクラス化は僕も考えました…が
やったらVB自体が落ちました(^0^;

格好悪いですが、Pictureボックスを用意して、
それをテキストエディタコントロールを生成する位置に
置いておき(生成したときに隠れる)、GetFocus時に
Pictureボックスの方にフォーカスを移してやりました。
PictureボックスのVisibleプロパティをfalseにすると
エラーが出るんですね。

> 自作のコントロールを直すほうがいいとも思うのですが・・・

本当ならそれが一番いいんですが、
どこをどう直していいやら…。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加