1
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,我不知道为什么。

4

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"
于 2013-01-14T16:28:08.567 回答