3

これを読んでいる皆さんこんにちは。お時間をいただきありがとうございます。

質問の前に 1 つ: MFC も Windows フォームも使用せず、C++ の WinApi のみを使用します。

さて、Visual C++ で多項式計算機を作っています。.rcドラッグ アンド ドロップ メソッドを使用してリソース (ファイル) に作成されたダイアログを追加しました。ダイアログを作成した場合、そのような問題CreateWindowExはないと思います(ただし、したくありません)。

マイ ダイアログにはいくつかの編集コントロールがあります。ダイアログが起動されたときに、編集コントロールの 1 つがキーボード入力を受け取る準備ができていることを除いて、すべて問題ありません。

の管理を含めましたEN_KILLFOCUS(別のコントロールを選択したためにフォーカスが失われたときに編集が親に送信します)。

ここでは、コントロールからwstring(ワイド文字の文字列 -_UNICODEが定義されています) を読み取り、ある種のパーサーを使用してこれを確認しwstring、不適切な文字を削除してから、正しい文字列を同じ編集コントロールに入れます。それは正常に動作しますが、ここに私の問題の原因があります:

入力がない場合、パーサーはstring "0"( ではなくNULL、文字列が "0" に設定されているだけで) コントロールにフォーカスがあり、ダイアログで何かをクリックする前にそれを失ったかのように戻ります。

そのため、および他の何か(これは私が理解しなければならないことです) により、ダイアログの起動時にパーサーがこれstring "0"を編集します。

編集の 1 つ (これを含む) をクリックするまで、編集でキーボードからの入力を受け付けないようにしたいと考えています。それが不可能な場合は、ダイアログの冒頭でテキスト全体をクリアしたい (入力を取得できることは問題ではありません。パーサーstring "0"が最初に入力しないようにしたいだけです) 私のコード:

DlgProc には次のものがあります。

//up here is switch to manage all controls
    case MyEditID:                // here is ID of one of my edits from resources
        switch (HIWORD(wParam))
        {
        case EN_KILLFOCUS:        // edit lost focus - another control selected

            if (LOWORD(wParam)==MyEditID)  //necessary to determine if
                                          // one of allowed Edits sent this message
                                          // because I have also other Edits
            {
                GetDlgItemText(hPanel, LOWORD(wParam), MyTempWcharArray, 100);
                MyTempString.assign(MyTempWcharArray);

                w1 = polynomial(MyTempWcharArray); // parser takes the string
                     // and removes bad chars in constructor
                     // polynomial is my class - you don't have to care of it
                     // w1 is declared before as object of polynomial class

                MyTempString = w1.ConversionToString();
                SetDlgItemText(hDialog, LOWORD(wParam), sw1);
            }
            break;
        }
        break;

Edit の ID に設定されている整数値は重要ですか?

私は知っているSetFocus()、そしてWM_SETFOCUSメッセージ。この場合、私はこれを機能させることができません。

私の要点を理解してもらうための重要な情報が含まれていない場合は、お知らせください。申し訳ありませんが、私は世界の初心者ですWinAPI

編集: 同様の問題がある場合:これを行わないでください: グローバル変数 ProcessKillFocus を false に設定して回避策を作成し、メッセージ管理の指示を処理しないことを示します。それを true に設定すると、次回以降に処理されます。

case EN_KILLFOCUS:
           if (ProcessKillFocus && LOWORD(wParam)==MyEditID)
           {
                // first time global ProcessKillFocus is false so all this is skipped
                // 2nd time and later do all the stuff
           }
           ProcessKillFocus = true;
           break;

私の質問を理解しやすくしてくれたSheyros Adikariに感謝します!!! 巨大な厄介な質問に対する簡単な答えをくれた patiiice に感謝します!!!

ANSWER: ところで: patriiice、私はこれを試しました:

case WM_INITDIALOG:
        SetFocus(GetDlgItem(hDialog, Desired_Control_ID));
        return (INT_PTR)FALSE;
        break;

それはただ働く!!!

4

1 に答える 1

4

WM_INITDIALOGメッセージに FALSE を返し、自分で正しいフォーカスを設定する必要があります。

于 2012-11-22T12:24:01.740 に答える