2016-11-22 4 views
-2

Поэтому в основном я пытаюсь получить текст из текстового поля, как я понимаю, вы получите указатель от GetWindowText я прав? Я не мог поместить этот текст в длинный символ, поэтому мне пришлось использовать int, а окно сообщения не принимало ints, поэтому мне пришлось преобразовать в длинный символ, а затем обратно указатель (&)? для отображения текста в окне сообщения, и что только распечатанный мне кучу ерундыПолучение текста из элемента управления EDIT с помощью WinAPI

случай WM_CREATE:

textbox1 = CreateWindow(L"EDIT", 
      L"X0", WS_BORDER | WS_CHILD | WS_VISIBLE, 
      50, 120, 50, 20, 
      hwnd, NULL, NULL, NULL); 

случай WM_COMMAND:

case 111:{   
TCHAR buff[1024]; 
int text = GetWindowText(textbox1, buff, 1024); 
TCHAR textS = (TCHAR)text; 
MessageBox(hwnd, &textS, &textS, MB_OKCANCEL | MB_ICONEXCLAMATION);} 
+1

Снимите 'TCHAR ТЕКСТЫ = (TCHAR) text; 'и просто используйте' buff'. –

+0

[From MSDN] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms633520 (v = vs.85) .aspx): «Если функция завершается успешно, возвращаемое значение - это длина , в символах, скопированной строки, не включая завершающий нулевой символ. " Где вы видите «вы получаете указатель из GetWindowText»? – andlabs

+0

oh Я использовал эту функцию по-другому, так как Ричард сказал, что мне просто нужен «buff» для печати, что было неожиданным для меня, теперь все имеет смысл – sanxe

ответ

1

Возвращаемое значение GetWindowText() - это длина скопированного текста (не включая нулевой ограничитель). Вы присваиваете этому типу значение одному символу TCHAR, а затем передаете адрес памяти этого единственного символа в MessageBox(). Это просто неправильно. MessageBox() ожидает указатель на символьную строку с нулем в конце, так что вы должны передать скопированный TCHAR[] буфер вместо:

TCHAR buff[1024] = {0}; 
GetWindowText(textbox1, buff, 1024); 
MessageBox(hwnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION); 

В качестве альтернативы используйте динамически выделенный буфер вместо:

int len = GetWindowTextLength(textbox1) + 1; 
TCHAR *buff = new TCHAR[len]; 
len = GetWindowText(textbox1, buff, len); 
buff[len] = 0; 
MessageBox(hwnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION); 
delete[] buff; 
1

Используйте (wchar_t/TCHAR):

int cTextLength; // text length 
cTextLength = GetWindowTextLength(hWndEdit);// get text length 
wchar_t * textS = new wchar_t[cTextLength + 1]; //dynamically allocate buffer 
// get text from an edit and store it into a buffer variable 
GetWindowText(hWndEdit, textS, cTextLength + 1); 
// display the message 
MessageBox(NULL, textS, textS, MB_OKCANCEL | MB_ICONEXCLAMATION); 
delete[] textS; // free the allocated memory 
+0

'GetWindowTextLength()' возвращает 'int', а не' size_t'. И этот код переполнит буфер, если текст больше 1023 символов. Если вы собираетесь использовать 'GetWindowTextLength()', то либо динамически выделять 'textS' на основе указанной фактической длины, либо, по крайней мере, использовать' min() ', чтобы ограничить значение' cTextLength' до 1023 max. –

+0

Справа вы Реми. Я обновил ответ в соответствии с вашими инструкциями. Я не уверен, должно ли оно быть 'new wchar_t [cTextLength];' или 'new wchar_t [cTextLength + 1];'? –

+0

Длина, возвращаемая 'GetWindowTextLength()', не включает в себя нуль-терминатор, но размер, переданный в 'GetWindowText()', делает, поэтому выделение символов 'cTextLength' и последующая передача' cTextLength + 1' неверна. Также не забудьте освободить выделенную память. –

Смежные вопросы