void CcalculatorDlg::OnBnClickedButton1()
{
CString grabData = _T("");
m_display.GetLine(0,grabData.GetBuffer(10),10);
grabData += _T("1");
m_display.SetWindowTextW(grabData.GetBuffer());
grabData.ReleaseBuffer();
}
Я пытаюсь создать базовое приложение калькулятора, используя MFC, и у меня возникли некоторые проблемы с числовым вводом.
Выше приведен код для нажатия кнопки «1». Я хочу, чтобы он прочитал то, что уже отображается в элементе управления отображением, а затем добавил 1 в конец, как это делают настоящие калькуляторы. Однако я просто не могу заставить его работать.
По сути, первое нажатие кнопки работает и изменяет пустой экран (управление редактированием) на 1. Но затем последовательные нажатия не продолжают добавлять 1, и я не могу понять, почему.
Я думаю, что проблема в вашем коде в том, что вы пытались изменить строку (объединение _T("1")
) после призвание GetBuffer()
но до призвание ReleaseBuffer()
, Кроме того, у вас есть неуравновешенный GetBuffer()
/ReleaseBuffer()
звонки.
При условии, что m_display
это CEdit
Например, вы можете попробовать такой код (работал для меня):
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);
}
Если у вас есть многострочный элемент управления и вы хотите захватить первую (самую верхнюю) строку, используя CEdit::GetLine()
Вы можете использовать такой код (обратите внимание, что согласно документации MSDN, EM_GETLINE
не NUL
-определить скопированную строку, поэтому вы должны явно указать длину строки 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"
Других решений пока нет …