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