I think the problem in your code is that you tried to modify the string (concatenating _T("1")
) after calling GetBuffer()
but before calling ReleaseBuffer()
. Moreover, you have unbalanced GetBuffer()
/ReleaseBuffer()
calls.
Assuming that m_display
is a CEdit
instance, you can try code like this (worked for me):
void CcalculatorDlg::OnBnClickedButton1()
{
// Get current text from edit control
// (assume a single-line edit control)
CString grabData;
m_display.GetWindowText(grabData);
// Concatenate "1"
grabData += L'1';
// Update edit control text
m_display.SetWindowText(grabData);
}
If you have a multi-line edit control and you want to grab the first (top-most) line using CEdit::GetLine()
, you can use code like this (note that according to MSDN documentation, EM_GETLINE
doesn't NUL
-terminate the copied line, so you have to explicitly specify line length to ReleaseBuffer()
):
//
// Read first line from edit control
//
CString grabData;
static const int kMaxBufferLength = 80;
wchar_t* buffer = grabData.GetBuffer(kMaxBufferLength + 1);
// Note '+ 1' for NUL string terminator (it seems that EM_GETLINE, which is
// wrapped by CEdit::GetLine(), doesn't NUL-terminate the returned string).
const int grabDataLength = m_display.GetLine(0, buffer, kMaxBufferLength);
grabData.ReleaseBuffer(grabDataLength);
// *After* calling ReleaseBuffer(), you can modify the string, e.g.:
grabData += L'1'; // concatenate "1"