Возникли проблемы при объединении CStrings в приложении MFC Calculator

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, и я не могу понять, почему.

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"
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]