ホテルを選ぶとき、これだけは譲れない条件TOP3は?

メインとなるウィンドウ(親)のクライアント領域に子ウィンドウを貼り付けそこにデータを表示させています。内容的にはエクセルのような表形式になっていてセルを選択でき、方向キーで選択を移動できます。
移動は子ウィンドウでWM_KEYDOWNが拾えなかったので親ウィンドウでWM_KEYDONWを子ウィンドウにSendMessageして子ウィンドウで処理させています。このやり方に少々疑問も感じますがとりあえずここまでは期待通りに動いてくれています。
ここからが問題なのですが、データを修正する時に子ウィンドウにEditBox(孫)を作成し直接入力できるようにしましたが、入力が終わりエディットボックスを破棄した後、以前のように方向キーでの移動が出来なくなってしまいました。親ウィンドウでWM_KEYDOWNを拾えていないようです。でも、最小化などにより一度親ウィンドウがフォーカスを失うと再び正常に戻ります。
EditBoxはサブクラス化してリターンキーで閉じるようになってます。
良い解決方法がありましたらお願いします。

環境:VC++6.0(SDK) WindowsMe

A 回答 (3件)

>ただ、以前のようにWM_KEYDOWNでWM_CLOSEを"SEND"した場合、(EditBoxプロシージャ内の)どこでSetFocusしてもだめだった理由がいまひとつ理解できていないのでちょっとすっきりしませんが...。



ウィンドウプロシージャから見たSend時の処理の流れ
WM_KEYDOWNの受け取り

WM_CLOSEの受け取り

WM_CLOSEに対する処理

WM_KEYDOWNに対する処理


Post時の処理の流れ
WM_KEYDOWNの受け取り

WM_KEYDOWNに対する処理

WM_CLOSEの受け取り

WM_CLOSEに対する処理

これで違いはわかりますか?


Sendしてしまうと、WM_CLOSEの処理が行われた後で
WM_KEYDOWNに対する内部処理がエディットのウィンドウプロシージャ内で行われます。
ここはブラックボックスなので、何が行われているかは
わからないですが、フォーカスに関係するような処理でも
行われているのでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。
順を追って流れを見ると違いがはっきり分かりました。
taka_tetsuさんのおかげで基本的かつ重要なことを学べました。

お礼日時:2003/06/11 14:00

>EditBox破棄後、EditBoxにあったフォーカスは親(子)ウィンドウには戻りませんでした。



参考までに、何が持ってました?
ハンドル値がわかればSPYで調べられますよね。

>サブクラス化したEditBoxのプロシージャ内でリターンキーによりEditBox自身を閉じた時に
>SetFocusしてもだめでした。

どのタイミングでSetFocusしました?
WM_KEYDOWN?WM_DESTROY?
タイミングをずらせばいいのであれば、WM_DESTROYのときに親ウィンドウにWM_USERかなんかをPOSTしてあげれば何とかなると思います。
    • good
    • 0
この回答へのお礼

>>...POSTしてあげれば何とかなると思います。
今まで何も考えずにSendMessageばかり使ってましてそれでも何とかなっていたのでPostとSendの違いを深く理解していませんでした。
taka_tetsuさんの言葉をきっかけにPostMessageについて調べ直し、直ちに制御を返すことに気づき使ってみました。
結果、WM_CLOSEをSendではなくPostしたらSetFocusするまでもなく親ウィンドウにフォーカスが移り、キー操作もちゃんと拾えるようになりました。(初歩的なことでお恥ずかしい)
ただ、以前のようにWM_KEYDOWNでWM_CLOSEを"SEND"した場合、(EditBoxプロシージャ内の)どこでSetFocusしてもだめだった理由がいまひとつ理解できていないのでちょっとすっきりしませんが...。

いずれにしても解決への糸口を提供していただきまして今回の件だけでなく今後のデバッグのためにも参考になりました。

お礼日時:2003/06/11 10:18

>移動は子ウィンドウでWM_KEYDOWNが拾えなかったので



子ウィンドウは、もしかしてスタティックなコントロールとか使用していませんか?

>入力が終わりエディットボックスを破棄した後、以前のように方向キーでの移動が出来なくなってしまいました。親ウィンドウでWM_KEYDOWNを拾えていないようです。

キーで動かないのは子ウィンドウがキーボードフォーカスを持ってない体と思われます。なんで、エディットを破棄した後にSetFocusすれば平気かも。

それでもだめなときは、キーボードフォーカスはどこにあるかGetFocusで調べてみてください。
このときに、デバッグ用にメッセージボックスなどフォーカスの移動が
発生するようなものは表示させないでくださいね。
    • good
    • 0
この回答へのお礼

ありがとうございます。早速、GetFocusで調べてみました。EditBox破棄後、EditBoxにあったフォーカスは親(子)ウィンドウには戻りませんでした。ご指摘のとおりEditBox破棄後、別のタイミングでSetFocusすれば元に戻りましたが、サブクラス化したEditBoxのプロシージャ内でリターンキーによりEditBox自身を閉じた時にSetFocusしてもだめでした。今の状態だと 編集する → リターンキーで編集を終える → 方向キーが使えない ということになってしまいます。
ちなみに子ウィンドウはCreateWindowで作ったWM_CHILDのタイトルなしのウィンドウです。

お礼日時:2003/06/10 16:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報