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 に答える