9

基になるデータが null の場合に文字列 "N/A" を表示する CEdit 派生コントロールがあります。私は最近、コントロールを空にするコードを追加しました (SetWindowText("");) フォーカスを取得すると、ユーザーがフォーカスを失ったときに "N/A"(SetWindowText("N/A")) に戻る場合に設定しますコントロールが空です。

唯一の問題は、ウィンドウ テキストを "" または "N/A" に設定すると EN_CHANGE がトリガーされるため、ダイアログでデータが変更されたと見なされることです。

SetWindowText (WM_SETTEXT) を呼び出すときに EN_CHANGE が発生しないようにするにはどうすればよいですか?

ノート

-編集コントロールを Multiline=TRUE に設定できることは知っていますが、それは私には受け入れられません。

-私のアプリケーションは MBCS であるため、SetCueBanner を使用できません

-エレガントなソリューションが欲しい。親ウィンドウを一時的に NULL に設定することは、洗練された解決策ではありません。

編集:

-各ダイアログではなく、カスタム コントロールにソリューションを配置したい

ありがとう

4

6 に答える 6

10

私が以前に行った方法 (前回は 20 分前のように、実際には同じ質問をすることを考えていました) は、フラグを設定することです。プログラムでテキストを設定しようとしているときに、フラグを設定し、EN_CHANGE ハンドラーで確認します。

void CMyDialog::MyFunction()
{    
    setEditTextProgramatically = true;  
    c_Edit.SetWindowText(_T("Whatever"));  
    setEditTextProgramatically = false;
}

void CMyDialog::OnEnChangeEdit()
{
    if (!setEditTextProgramatically)
    {
        // Do whatever you need to do
    }
}

私はそれが最もエレガントな解決策ではないことを知っていますが、少なくとも私にとってはうまくいきます。

MFC がユーザー入力とコードによる変更を区別する方法を提供しないのはなぜだろうといつも思っていましたが、それはその通りです。

于 2012-07-03T16:02:03.053 に答える
6

私は最終的に私の問題に対する適切な解決策を見つけました。

まず、派生コントロールのヘッダー ファイルにフラグを追加し、コンストラクターで false に初期化しました。

bool m_bNoEnChange;

派生コントロールのヘッダー ファイルで OnChildNotify をオーバーライドし、実装では、EN_CHANGE パラメーターを使用して WM_COMMAND メッセージをチェックしました。次に、TRUE を返して、メッセージが親 (ダイアログ/ページ) に送信されないようにします。

virtual BOOL OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult);

BOOL CADEdit::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult) 
{
    if(message == WM_COMMAND && HIWORD(wParam) == EN_CHANGE)
    {
        //If the flag is set, don't send the message to the parent window
        if(m_bNoEnChange)
            return TRUE;
    }

    return CEdit::OnChildNotify(message, wParam, lParam, pLResult);
}

最後に、コントロールがフォーカスを得たり失ったりしたときに、問題のある SetWindowText をフラグでラップしました。

m_bNoEnChange = true;
SetWindowText(_T(""));
m_bNoEnChange = false;

各ダイアログを変更する必要がないため、このソリューションは私の場合に最適です。

于 2012-07-04T19:21:29.023 に答える
1

送信する前にコントロールを無効にする(EnableWindow(FALSE)WM_ENABLE、パラメータ FALSE で送信し、WM_SETTEXT後で有効にすることができます。それは防ぐべきですEN_CHANGE

おそらくもっとエレガントな方法があります:p

于 2012-07-03T15:29:30.883 に答える
-1

他の誰かがこの議論を見つけた場合...

Steven が書いたように、UpdateData によって EN_CHANGE が送信されることはありません。

内部では、MFC は AfxSetWindowText を呼び出します。これにより、1 つの hwnd を指定できます。

于 2014-08-20T15:24:00.717 に答える