初めまして。VBは触らなくなってある程度経つので初心者扱いで
よろしくお願いします。VC++でテキストエディタコントロールを
制作しまして、それをDLL化しました。そこまでは
よかったのですが、VBでフォーム上にそのエディタのコントロールと
コマンドボタンが同居しているとコマンドボタンを押した後に
Enterキーを押してもそれをコマンドボタンにメッセージが
行ってしまいます。
コントロールの方はCreateWindowExで作成していて、
ダイアログコントロールのためにWM_GETDLGCODEを適切に
処理することでC++とWindowsSDKで作成したダイアログ上では
コマンドボタンと同居しても問題なく動作するようになりました。
しかし、VBではうまくいかないのです。
テキストエディタコントロール上でクリックされたときに
SetFocusAPIを呼び出していますが、まだコマンドボタンが
フォーカスを持っているようです。私個人も十分この件に関して
調べてきましたが、VBの特殊仕様についていけなくなったので
挫折してしまいました。どなたか、この件に関して詳しい方
ご教授願えませんか?よろしくお願いします。
> Enterキーを押してもそれをコマンドボタンにメッセージが
> 行ってしまいます。
コマンドボタンにBS_DEFPUSHBUTTONがついてないですか?
標準ボタンになっていた場合
そうなりそうな気がするのですが・・・
早速
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を使っているのですが、その辺りの切り口から
うまくできないものですかね?
> なにやら.NETではSetStyleを使ったり
> VB5ではCanGetFocusをfalseにすればフォーカスを
> 絶対に得ることのないボタンを作成できるそうですね。
フォーカスを絶対に得られないようにするなら
ボタンのGotFocusイベントに別のコントロールにフォーカスを移すような
処理を入れれば可能だと思います(ただしかっこ悪いかも)
あとはボタンをサブクラス化して
WM_KEYDOWNのVK_RETURNがきたときに
自作のコントロールにSendMessageでもしてみてはどうでしょう?
自作のコントロールを直すほうがいいとも思うのですが・・・
サブクラス化は僕も考えました…が
やったらVB自体が落ちました(^0^;
格好悪いですが、Pictureボックスを用意して、
それをテキストエディタコントロールを生成する位置に
置いておき(生成したときに隠れる)、GetFocus時に
Pictureボックスの方にフォーカスを移してやりました。
PictureボックスのVisibleプロパティをfalseにすると
エラーが出るんですね。
> 自作のコントロールを直すほうがいいとも思うのですが・・・
本当ならそれが一番いいんですが、
どこをどう直していいやら…。
ツイート | ![]() |