Visual Studio MFC mengubah teks di Edit Control saat mengetik / secara dinamis
Saya mencoba menyiapkan Aplikasi MFC C ++ di Visual Studio 2019 sedemikian rupa sehingga mengubah teks pengguna saat mereka mengetik.
Tata letak saat ini adalah 2 tombol radio,
ID = rdbOn
(ditetapkan ke Grup = True
, dengan variabel Nilai int m_isOn
= 1
)
ID = rdbOff
, m_isOn
nilainya menjadi =0

dan 1 Kontrol Edit, ID = txtInputBox
, dengan CString
variabel Nilaim_inputString
Saat ini, untuk pengujian saya dapat melihat bagaimana itu akan bekerja untuk sebuah tombol di klik, itu akan mengambil sesuatu seperti berikut dan hanya SetDlgItemText
hasilnya. Tapi itu terjadi setelah mereka mengetik, bukan SAAT mereka mengetik.
void Onsomebtnclick()
{
//convert CString to String of m_inputString
//do some string manipulation
//convert back to CString
//SetDlgItemText(txtInputBox, result)
}
Pembaruan: mulai EN_CHANGEbekerja Saya bisa EN_CHANGE
bekerja dengan saran bendera dari pengguna @GoGoWorx. Namun, sekarang saya hanya mengalami sedikit masalah yaitu kursor kembali ke awal kontrol edit txtInput
.
Saya membaca tentang menggunakan CEdit::SetSel
tetapi tidak tahu cara menggunakannya secara langsung di kode saya. Saya mencoba kontrol CEdit MFC, menempatkan kursor ke ujung string setelah SetWindowText
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);
}
Jawaban
Sepertinya Anda perlu menggunakan ON_EN_CHANGE
notifikasi peta pesan (dipanggil setelah kontrol diperbarui karena mengetik atau menempel misalnya)
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
}
Saya tidak yakin apa yang Anda gunakan untuk pengenal numerik untuk kontrol edit, karena ini biasanya definisi huruf besar - ganti di IDC_EDIT_CONTROL
atas dengan definisinya (mungkin txtInputBox
, tapi sekali lagi, ini biasanya huruf besar , jadi saya tidak yakin ).
Juga ubah CMyDialog
nama kelas dialog Anda.
Perhatikan bahwa kami menggunakan ON_EN_CHANGEpenangan peta-pesan di sini, bukan ON_EN_UPDATE
, karena ON_EN_CHANGE
pesan dikirim setelah kontrol diperbarui, sedangkan ON_EN_UPDATE
dipanggil tepat sebelum diperbarui.
Penangan peta pesan dijelaskan di bagian Keterangan dari CEdit
dokumentasi kontrol:https://docs.microsoft.com/en-us/cpp/mfc/reference/cedit-class?view=msvc-160
Mengenai kekhawatiran Anda tentang memodifikasi hal-hal saat pengguna mengetik - ini tidak masalah, karena setiap perubahan (penekanan tombol atau tempel dari papan klip, dll.) Harus memicu pemanggilan penangan ini, di mana Anda dapat mengubah apa pun yang Anda butuhkan. Pastikan bahwa saat Anda memperbarui kontrol, Anda tidak memicu ON_EN_CHANGE
lagi dan berakhir di lingkaran 'perubahan' rekursif.
Anda mungkin dapat melakukan ini dengan semacam bendera untuk menunjukkan bahwa Andalah yang memperbarui kontrol, bukan pengguna, namun mungkin lebih baik subkelas CEdit
kontrol untuk melakukan apa yang Anda inginkan. Ada beberapa contoh di luar sana tentang cara melakukan ini (tidak sesulit kedengarannya), misalnya:https://www.codeproject.com/Articles/27376/Avoiding-EN-CHANGE-notifications