Visual Studio MFC mengubah teks di Edit Control saat mengetik / secara dinamis

Dec 04 2020

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_isOnnilainya menjadi =0

dan 1 Kontrol Edit, ID = txtInputBox, dengan CStringvariabel 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 SetDlgItemTexthasilnya. 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_CHANGEbekerja 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::SetSeltetapi 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

3 GoGoWorx Dec 04 2020 at 08:04

Sepertinya Anda perlu menggunakan ON_EN_CHANGEnotifikasi 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_CONTROLatas dengan definisinya (mungkin txtInputBox, tapi sekali lagi, ini biasanya huruf besar , jadi saya tidak yakin ).

Juga ubah CMyDialognama kelas dialog Anda.

Perhatikan bahwa kami menggunakan ON_EN_CHANGEpenangan peta-pesan di sini, bukan ON_EN_UPDATE, karena ON_EN_CHANGEpesan dikirim setelah kontrol diperbarui, sedangkan ON_EN_UPDATEdipanggil tepat sebelum diperbarui.

Penangan peta pesan dijelaskan di bagian Keterangan dari CEditdokumentasi 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_CHANGElagi 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 CEditkontrol 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