アプリ版:「スタンプのみでお礼する」機能のリリースについて

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にフォーカスをセット
}

「FlexGridでSetFocusすると」の質問画像

A 回答 (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にフォーカスをセットするような処理が書いてある、など)場合は、上記の追加では直りません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/25 00:19

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