2013-01-14 60 views
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(); 

} 

有麻烦串联CStrings我试图让使用MFC一个基本的计算器应用程序,和我有一些麻烦的数量输入。在MFC计算器应用程序

上面是按下“1”按钮时的代码。我希望它能够读取显示控件中已经显示的内容,然后像真正的计算器那样在其末尾添加1。但是我无法让它工作。

基本上第一个按钮按下它的作品,并将空白显示(编辑控制)更改为1.但是,然后连续按不会继续添加1,我不明白为什么。

回答

1

我想在你的代码的问题是你的努力调用ReleaseBuffer()之前修改(串联_T("1"))字符串调用GetBuffer()。此外,您有不平衡的呼叫。

假设m_displayCEdit例如,你可以尝试这样的代码(为我工作):

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(),你可以使用这样的代码行(注意:according to MSDN documentationEM_GETLINENUL -terminate复制的线,所以你必须明确指定线路长度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"