Question

void CcalculatorDlg::OnBnClickedButton1()
{
    CString grabData = _T("");
    m_display.GetLine(0,grabData.GetBuffer(10),10);
    grabData += _T("1");
    m_display.SetWindowTextW(grabData.GetBuffer());
    grabData.ReleaseBuffer();

}

I am trying to make a basic calculator application using MFC, and I am having some trouble with the number inputs.

Above is the code for when the "1" button is pressed. I want it to read in what's already being displayed in the display control, and then add a 1 onto the end of it like real calculators do. However I just can't get it to work.

Basically the first button press it works and changes the blank display (edit control) to a 1. But then successive presses don't continue to add 1's, and I cannot figure out why.

Was it helpful?

Solution

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"
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top