0

我正在开发一个小型 GUI 计算器项目,我需要在编辑控件的内容中添加一些内容。我目前使用的功能是:

int CharControl = 256;

void AddToEditMainText(char WhatToAdd[CharControl]) {
    char CurrText[CharControl] = "";
    GetDlgItemText(MainWindow, EDIT_MAIN, CurrText, CharControl);
    char NewText[CharControl] = "";
    malloc(strlen(NewText) + strlen(WhatToAdd) + 1);
    strcpy_s(NewText, CurrText);
    strcat_s(NewText, WhatToAdd);
    SendMessage(EditMain, WM_SETTEXT, NULL, LPARAM((LPCSTR)&NewText));
}

我对 C++ 比较陌生,所以这是我的第一个 GUI 项目。任何帮助是极大的赞赏。谢谢。

4

2 回答 2

2

您没有将结果分配malloc()给任何东西,因此您正在泄漏内存。你应该做更多这样的事情:

void AddToEditMainText(char *WhatToAdd)
{
    int iLen = GetWindowTextLen(EditMain) + strlen(WhatToAdd) + 1;
    char *NewText = malloc(iLen);
    if (NewText)
    {
        GetWindowText(EditMain, NewText, iLen);
        strcat_s(NewText, iLen, WhatToAdd);
        SetWindowText(EditMain, NewText);
        free(NewText);
    }
}

我会建议一种不同的方法,它不需要您在附加到当前文本之前检索它:

void AddToEditMainText(char *WhatToAdd)
{
    DWORD dwStart, dwEnd;
    SendMessage(EditMain, EM_GETSEL, WPARAM(&dwStart), LPARAM(&dwEnd));
    int iLen = GetWindowTextLength(EditMain);
    SendMessage(EditMain, EM_SETSEL, iLen, iLen);
    SendMessage(EditMain, EM_REPLACESEL, TRUE, LPARAM(WhatToAdd));
    SendMessage(EditMain, EM_SETSEL, WPARAM(dwStart), LPARAM(dwEnd));
}
于 2014-08-28T01:12:36.607 回答
1

让我们改变一些事情:

void AddToEditMainText(char *WhatToAdd)

在函数参数的上下文中,字符数组和指针是一回事。即使传递的参数是给定长度的 char 数组,也没关系,所以我们不要混淆。

但我们可以做得更好。这个问题被标记为 C++,而不是 C。在 C++ 中,我们想认为我们已经在低级字节抛掷之上取得了一些进展。当我们谈论字符串时,我们现在谈论的是 std::string:

void AddToEditMainText(const std::string &WhatToAdd)

我对 MS-Windows API 不是很熟悉,但很明显“GetDlgItemText”是一个从现有对话框控件中提取文本的 C API 函数。不确定您是否保证返回的字符串会更少,或者会被截断为 256 字节的缓冲区。这实际上很重要,但是对于 C++ 的介绍性环境,这并不重要。

GetDlgItemText() 使用的字符缓冲区是如此...... C-ish。char 缓冲区在 C++ 中是一个非常古怪的概念。getDlgItemText 返回后,我们不要浪费任何时间,把它变成一个漂亮、漂亮、std::string:

std::string CurrTextStr=CurrText;

现在,再一次,在 C++ 中,我们不必为诸如分配内存之类的琐碎细节而烦恼,并确保在使用后释放它。std::string 会为我们做这件事:

std::string combinedString=CurrTextStr + WhatToAdd;

这不容易吗?无需计算各种缓冲区的大小。那是……上个世纪。我们处于现代时代,“+”运算符将为我们做这件事。最后,由于 SendMessage() 是另一个古怪的 C 库 API,我们必须深入讨论它的级别,我想......

SendMessage(EditMain, WM_SETTEXT, NULL, LPARAM((LPCSTR)combinedString.c_str()));

哦,别忘了在顶部的某处粘贴一个“#include <string>”,以引入 std::string 的定义。

于 2014-08-28T01:15:33.530 回答