Как добавить текст к существующему тексту в статическом контроле в win32

Я делаю программу в win32 c, используя Visual Studio RC, и я не могу понять, как выполнить эту, казалось бы, простую задачу. У меня есть статический текстовый элемент управления, элемент управления редактированием и кнопка. Когда пользователь нажимает кнопку, я не хочу, чтобы программа брала текст в элементе управления редактирования и добавляла его к тому, что находится в статическом текстовом поле. После большой головной боли и различных попыток я все еще не могу заставить это работать. Я могу нормально извлечь текст из элемента управления редактированием, но любая попытка добавить его в статический элемент управления приводит к сбою. Ну, на самом деле, просто чтобы уточнить, я могу настроить текст нормально; это просто добавление к существующему тексту, который приводит к сбою программы. Может ли кто-нибудь опубликовать код, который позволит мне сделать это с помощью GetWindowText() и SetWindowText() (или что-то еще, если это предпочтительнее). Вот что у меня есть:

SendMessage(hwndEditControl, WM_GETTEXT,255,(LPARAM)editbuffer);
GetWindowText(hwndTextControl, (LPWSTR)allText, GetWindowTextLength(hwndTextControl));
//function to add data, please create on
SetWindowText(hwndTextControl, (LPCWSTR)allText);}
//where
static TCHAR*       editbuffer = new TCHAR; //feel free to change these declarations
static TCHAR*       allText    = new TCHAR;

Любая помощь высоко ценится! Спасибо!


person Iowa15    schedule 29.07.2012    source источник
comment
Ваши буферы имеют длину в один символ... Почему бы не просто обычный массив?   -  person chris    schedule 29.07.2012
comment
поэтому объявите их: новый TCHAR [СУММА]   -  person Iowa15    schedule 29.07.2012
comment
могу ли я динамически выделить их с помощью malloc   -  person Iowa15    schedule 29.07.2012
comment
Если вы хотите учитывать фактическую длину, вы должны это сделать, учитывая, что new не C.   -  person chris    schedule 29.07.2012
comment
Хорошо, спасибо. Также не могли бы вы просто указать, где я перепутал WCHAR и TCHAR, чтобы я мог это исправить.   -  person Iowa15    schedule 29.07.2012
comment
Ваши буферы - это TCHAR, и вы приводите их к WCHAR при вызове функций. Если вы используете TCHAR, они уже будут WCHAR, если они нужны функции.   -  person chris    schedule 29.07.2012
comment
Хорошо спасибо. А также как бы я добавил два буфера, предполагая, что я динамически выделил их оба с помощью malloc. Я пытался использовать strcat_s, но это не сработало, вероятно, из-за того, что мои буферы имеют длину в один символ.   -  person Iowa15    schedule 29.07.2012
comment
У вас должно быть достаточно памяти, выделенной для длины текста в поле редактирования в одном буфере, плюс один для нуля, и длина обоих вместе взятых (плюс один) в другом буфере. Вы также должны использовать соответствующую (TCHAR) версию strcat.   -  person chris    schedule 29.07.2012
comment
что-то похожее на strcat_s (buf1, malloc(sizeof(buf1) + sizeof(buf2) + 1), buf2); ?   -  person Iowa15    schedule 29.07.2012
comment
Если у вас C99, вы можете использовать VLA, но в остальном это больше похоже на TCHAR *editBuffer = malloc (sizeof(TCHAR) * (editboxTextLength + 1)); TCHAR *all = malloc (sizeof(TCHAR) * (editboxTextLength + staticTextLength + 1)); copyEditToEditBuffer(); copyStaticToAllBuffer(); appendEditBufferToAllBuffer();   -  person chris    schedule 29.07.2012
comment
Хорошо, большое спасибо за помощь. Если вы поставите это как ответ, я обязательно приму его завтра   -  person Iowa15    schedule 29.07.2012
comment
Я беспокоюсь о слепках. Они не должны быть необходимы. Если вы считаете необходимым преобразовать TCHAR* в LPWSTR, то, скорее всего, вы испортили среду сборки.   -  person Adrian McCarthy    schedule 29.07.2012
comment
Да, слепки остались от моих предыдущих попыток. Я забыл избавиться от них   -  person Iowa15    schedule 29.07.2012


Ответы (1)


Вы резервируете только один символ для своих строковых буферов. Итак, вместо

static TCHAR*       editbuffer = new TCHAR;
static TCHAR*       allText    = new TCHAR;

вам нужно зарезервировать гораздо больше памяти, например:

static TCHAR*       editbuffer = new TCHAR[255];
static TCHAR*       allText    = new TCHAR[255];

что даст вам строковые буферы, которые могут содержать 254 символа и завершающий нулевой символ.

Однако я бы рекомендовал вам просто зарезервировать память в стеке внутри вашей функции:

void OnButtonClick()
{
    TCHAR editbuffer[255] = {0};
    TCHAR allText[255] = {0};
    ...
}
person Stefan    schedule 29.07.2012