6

CEditユーザーが関連情報を入力できるボックスがあります。彼\彼女がボックスに書き始めたらすぐに通知が必要です。そうすれば、doSomething()他のタスクを実行するために電話をかけることができます。Windows はコールバックを提供していますか? 提供している場合、どのように使用すればよいですか?

4

3 に答える 3

13

MFC にはコールバック自体がなく、適切なイベントのハンドラーを実装することでこれを行います。次の 2 つのイベントのいずれかを処理する必要がありますWM_CHAREN_CHANGE

EN_CHANGEたとえば、入力されたテキストをダイアログの他の場所にリアルタイムで複製するなど、ダイアログを処理します。最初にダイアログのメッセージ マップにエントリを追加し、次に適切なハンドラをオーバーライドする必要があります。

BEGIN_MESSAGE_MAP(CstackmfcDlg, CDialog)
    ON_EN_CHANGE(IDC_EDIT1, &CstackmfcDlg::OnEnChangeEdit1)
END_MESSAGE_MAP()

void CstackmfcDlg::OnEnChangeEdit1()
    {
    CString text;
    m_edit.GetWindowText(text);
    m_label.SetWindowText(text); // update a label control to match typed text
    }

または、エディットボックス クラスを処理してWM_CHAR、たとえば、特定の文字の入力を防止します。たとえば、数値入力の数字以外は無視します。CEdit からクラスを派生させ、WM_CHARそのクラス (ダイアログではなく) のイベントを処理し、編集コントロールをそのクラスのインスタンスにします。

BEGIN_MESSAGE_MAP(CCtrlEdit, CEdit)
    ON_WM_CHAR()
END_MESSAGE_MAP()

void CCtrlEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    // Do nothing if not numeric chars entered, otherwise pass to base CEdit class
    if ((nChar >= '0' && nChar <= '9') || VK_BACK == nChar)
        CEdit::OnChar(nChar, nRepCnt, nFlags);
    }

VS IDE を使用して、メッセージ マップ ブロックでマウスを選択して [プロパティ] バーを使用することにより、ハンドラー オーバーライドのスタブを配置できることに注意してください。

EDIT:WM_CHARサンプルコードを追加し、間違っていた説明を修正しました。

于 2012-06-19T09:02:36.957 に答える
1

リソース エディタの編集ボックスをダブルクリックすると、OnEnChanged イベントが自動的に作成されます。

于 2012-06-19T08:23:49.540 に答える