Как добавить символ [256] к содержимому элемента управления для редактирования?

Я работаю над небольшим проектом калькулятора 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 ++, так что это мой первый проект с графическим интерфейсом. Любая помощь с благодарностью. Благодарю.

0

Решение

Давайте изменим несколько вещей:

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. Буфер символов — такая странная концепция в C ++. После того, как getDlgItemText вернется, давайте не будем тратить время впустую, а превратим его в красивый, красивый std :: string:

std::string CurrTextStr=CurrText;

Теперь, опять же, в C ++ нам не нужно беспокоиться о таких мелких деталях, как выделение памяти и ее освобождение после использования. std :: string сделает это за нас:

std::string combinedString=CurrTextStr + WhatToAdd;

Разве это не легко? Не нужно рассчитывать размеры разных буферов. Это так … в прошлом веке. Мы находимся в современной эпохе, где оператор «+» сделает это за нас. И, наконец, поскольку SendMessage () является еще одним странным API библиотеки C, и мы должны обсудить его уровень, я полагаю …

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

О, и не забудьте вставить «#include <строка>»где-то наверху, чтобы получить определение std :: string.

1

Другие решения

Вы не присваиваете результат 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));
}
2

По вопросам рекламы [email protected]