Visual Studio MFCは、入力中に/動的に編集コントロールのテキストを変更します
Visual Studio2019でMFCC ++アプリをセットアップして、ユーザーが入力しているときにユーザーのテキストを変更しようとしています。
現在のレイアウトは2つのラジオボタンです。
ID = rdbOn
(Group =True
に設定、Value int variable m_isOn
= 1
)
ID = rdbOff
、m_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);
}
回答
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