63918
MFCにて、エディットコントロールが複数ある場合のKillFocusの動作でわからないことがあります。

## 目標

エディット1、エディット2を画面に設置。  
各エディット入力制限があり、準拠せずにフォーカスを抜けようとするとエラーメッセージを表示し、元のエディットにフォーカスを戻すようにしたい。

## 結果

各エディットにkillfocusイベントでMessageBoxを出力させるようにしたいが、エディット1→エディット2にフォーカスを移そうとしたときに、なぜかエディット2のメッセージが出力し、そのあとにエディット1のメッセージが出力する。

## ソースコード

```

    /********************************************************/
    //環境：visualstudio2019
    
    void CKillFocusTestDlg::OnKillfocusEdit1()
    {
        CEdit* edit1 = (CEdit*)GetDlgItem(IDC_EDIT1);
        CString str;
        edit1->GetWindowText(str);
        if (str == "")
            MessageBox(_T("Edit1が空です"));
    }
    
    
    void CKillFocusTestDlg::OnKillfocusEdit2()
    {
        CEdit* edit2 = (CEdit*)GetDlgItem(IDC_EDIT2);
        CString str;
        edit2->GetWindowText(str);
        if (str == "")
            MessageBox(_T("Edit2が空です"));
    }
    /********************************************************/
    
```

## どんな機能を想定しているか

複数エディットを必須入力とし、各エディットに値が必ず入力されている状態を作りたいです。  
DBに値を登録することを考えていて、登録ボタンを押したときに各エディットに値が入力されているか確認してエラーを出力することしかできません・・・  
しかし、エディットのフォーカスを抜けたときにチェックするほうがユーザーにとって優しいと思うのでどうにか実現したいです。
CC BY-SA 4.0
2020-03-16T19:42:50.493
63913
2020-03-17T00:45:12.067
2020-06-17T08:14:45.997
-1
38241
question
c++ mfc
エディットコントロールが複数ある場合のKillFocusの動作がわからない
どうやら`OnKillfocusEditX()`関数の中で`MessageBox()`を呼び出してメッセージダイアログを表示しているのが原因のようです。  
表示されている順番はエディット1メッセージ→エディット2メッセージで、後から表示された方が人間の目には手前に見えるので先にエディット2メッセージが表示されていて、後からエディット1メッセージが表示されたように見えるのでしょう。

`MessageBox()`を`OutputDebugString()`に変えてVisual Studio
IDEの出力ウィンドウにどう表示されるか試してみてください。

それから、元々の処理でもあるいは`OutputDebugString()`に変えたとしても、`OnKillfocusEditX()`関数の中にブレークポイントを設定して処理を止めているかどうかで動作が変わるかもしれません。  
ブレークポイントの有無を変えて試してみるのも良いでしょう。

* * *

そういう意味では、KillFocus等のフォーカスが切り替わるタイミングの処理でメッセージダイアログ表示等の入力フォーカスが切り替わる処理は行ってはいけないと思われます。

目標のためには、画面上にスタティックテキスト等を配置して、それに目立つエラーメッセージが表示されるように色や大きさ等視覚効果を工夫してみるとか？

ただその表示を止めるのに別の操作が必要(とオペレータが感じてしまう)だと、そのためにまたKillFocusイベントが発生してしまうといったおかしな処理チェインが出来てしまう可能性もありますので、不足時・エラー時を含めた一連の処理・操作の流れがどうなるか考えた方が良いでしょう。
CC BY-SA 4.0
2020-03-17T00:20:57.377
63918
2020-03-17T00:45:12.067
2020-03-17T00:45:12.067
26370
26370
63913
answer