• 締切済み

FlexGridでSetFocusするとタブオーダーがおかしくなる

WindowsXP、VC++2005のMFCにて図のようなプログラムを作成しています。 ※※※添付図はListCtrlですが、FlexGridとして認識お願いします。※※※ SetFocusが原因と考えられる問題が生じてしまい、 期待動作をさせることが出来ない状況です。 なお、FlexGridでなくListCtrlで同じプログラムを作成し、 同手順で操作したところ、期待動作をさせることが出来ました。 よって、FlexGridのみ起こる問題と考えられます。 原因と解決策についてご存知の方おられましたら、 ご教示お願い致します。 下記に期待動作、問題動作、また問題が再現しない特別な場合の 手順について記載します。 【期待動作】 タブオーダー設定順(リスト→ボタン1→ボタン2→ボタン3) に遷移させたい 【問題動作】 ボタン2にフォーカスがある状態でタブキーを押すと、 ボタン3でなくボタン1にフォーカスが移る 【問題が再現する場合の手順】 (1)ボタン2を押して、(※処理1)を実行する。  その際に、リストにフォーカスが当った後に、  フォーカスがボタン2に移る。 (2)タブキーを押す。 (3)ボタン3にフォーカスが移るはずが、ボタン1に移ってしまう。 【問題が再現しない場合の手順】 (1)ボタン1もしくはボタン3をクリックしフォーカスを当てる。 ※この際ボタン2をクリックすると、問題が再現してしまう。 ※ボタン1及びボタン3を押した際の処理はないものとする。 (2)アクセラレータキー(&A)によってボタン2をクリックし、  (※処理1)を実行。 (3)タブキーを押す。 (4)タブオーダーの通り、ボタン3へとフォーカスが移る。 (※処理1)の内容 void CtestListDlg::OnBnClickedButton2() { m_List.SetFocus(); //グリッドにフォーカスをセット m_btn2.SetFocus(); //ボタン2にフォーカスをセット }

みんなの回答

回答No.1

もし、FlexGridで「フォーカスを受け取った際、メッセージキューに何かメッセージを入れている」場合、そのメッセージが処理されるのは「btn2のクリックイベント関数を抜けた後」です。 そして、もし、その「何かのメッセージ」が「FlexGridにフォーカスを移す実処理に関わるメッセージ」だった場合、以下のような事が起きるでしょう。 ・btn2のクリックイベント内でFlexGridがSetFocusされる ・それに関わるメッセージがポストされる(まだ処理されない) ・btn2のクリックイベント内でbtn2がSetFocusされる ・btn2のクリックイベントを抜け、メッセージループに戻る ・FlexGridのSetFocusに関わるメッセージが処理され、そのメッセージにより内部的なタブストップ位置がFlexGridになる ・(見た目だけは)btn2にフォーカスがある(ように見える) ・Tabを押すと、内部的なタブストップ位置がFlexGridにあったので、FlexGridの次のタブストップであるbtn1にフォーカスが移る 以下の※の位置に、プロセスのメッセージを処理するProcessMessage()を入れ、メッセージキューに溜まったメッセージを処理してから、btn2にフォーカスをセットしてみましょう。 m_List.SetFocus(); //グリッドにフォーカスをセット ※ m_btn2.SetFocus(); //ボタン2にフォーカスをセット なお、原因が別の所にある(例えば、FlexGridのフォーカス消失時のイベント処理に、btn1にフォーカスをセットするような処理が書いてある、など)場合は、上記の追加では直りません。

zigen8513
質問者

お礼

ご回答ありがとうございます。 ご指摘の通り、ProcessMessage()を用いて試みましたが、 コンパイルエラーが発生して、使用することが出来ませんでした。 ※私の使い方が悪かったのかもしれませんが。。 ただ、理論は理解できたので、代わりに m_List.EnableWindow(false); にて無理やりフォーカスをはずしてやることで、 解決することが出来ました。 ありがとうございました。

関連するQ&A