Visual Studio MFCは、入力中に/動的に編集コントロールのテキストを変更します

Dec 04 2020

Visual Studio2019でMFCC ++アプリをセットアップして、ユーザーが入力しているときにユーザーのテキストを変更しようとしています。

現在のレイアウトは2つのラジオボタンです。

ID = rdbOn(Group =Trueに設定、Value int variable m_isOn= 1

ID = rdbOffm_isOn値は=になります0

および1Edit Control、ID = txtInputBox、ValueCString変数m_inputString

現在、テストでは、ボタンをクリックしたときにどのように機能するかを確認できますSetDlgItemText。次のような結果が得られます。しかし、それは彼らがタイプしている間ではなく、彼らがタイプした後です。

void Onsomebtnclick()
{
    //convert CString to String of m_inputString
    //do some string manipulation
    //convert back to CString
    //SetDlgItemText(txtInputBox, result)    
}

アップデート: 持ってEN_CHANGE仕事には、私が取得することができたEN_CHANGEユーザー@GoGoWorxからフラグの提案での作業します。ただし、カーソルが編集コントロールの先頭に戻るというわずかな問題がありますtxtInput
使用について読んCEdit::SetSelでいますが、コードで直接使用する方法がわかりません。SetWindowTextの後の文字列の最後にカーソルを置いてCEditコントロールMFCを試しました

someDlg::someFunction()
{
    //some logic stuff to get a result string
    SetDlgItemText(txtInputBox, result);
    //need it to set the cursor to the end
    //I tried these, but it didn't recognize (expression must have class type?)
    //txtInputBox.SetSel(0, -1);
    //txtInputBox.SetSel(-1);
}

回答

3 GoGoWorx Dec 04 2020 at 08:04

ON_EN_CHANGEメッセージマップ通知を使用する必要があるようです(たとえば、入力または貼り付けのためにコントロールが更新された後に呼び出されます)

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)   
    ON_EN_CHANGE(IDC_EDIT_CONTROL, &CMyDialog::OnEnChangeEditControl)
END_MESSAGE_MAP()

void CMyDialog::OnEnChangeEditControl()
{
   // Copy or call your Onsomebtnclick() here
}

エディットコントロールの数値識別子に何を使用しているのかわかりません。これらは通常大文字の定義であるため、IDC_EDIT_CONTROL上記を自分の定義に置き換えます(おそらくtxtInputBox、これらは通常大文字であるため、わかりません) )。

CMyDialogダイアログクラスの名前も変更します。

ON_EN_CHANGEここではON_EN_UPDATE、の代わりにメッセージマップハンドラーを使用していることに注意してください。ON_EN_CHANGEメッセージはコントロールが更新されたに送信されるのに対し、メッセージは更新さON_EN_UPDATEれる直前呼び出されるためです。

メッセージマップハンドラは、コントロールドキュメントの備考セクションで説明されていCEditます。https://docs.microsoft.com/en-us/cpp/mfc/reference/cedit-class?view=msvc-160

ユーザーが入力するときに変更することに関する懸念については、変更するたびに(キーストロークやクリップボードからの貼り付けなど)このハンドラーが呼び出され、必要なものを変更できるため、これで問題ありません。コントロールを更新するときに、ON_EN_CHANGE再度トリガーして再帰的な「変更」ループが発生しないように注意してください。

ユーザーではなく、自分がコントロールを更新していることを示す何らかのフラグを使用してこれを行うことができる場合がありますが、コントロールをサブクラス化して、CEdit必要なことを実行することをお勧めします。これを行う方法の例がいくつかあります(思ったほど難しくはありません)。たとえば、次のようになります。https://www.codeproject.com/Articles/27376/Avoiding-EN-CHANGE-notifications