Добавление текста в Win32 EditBox в C ++ - PullRequest
3 голосов
/ 26 августа 2011

У меня есть EditBox HWND tbLog и следующая функция (которая не работает):

void appendLogText(char* newText)
{
  int len = GetWindowTextLength(tbLog);

  char* logText = new char[len + strlen(newText) + 1];
  GetWindowText(tbLog, logText, len);

  strcat(logText, newText);

  SendMessage(tbLog, WM_SETTEXT, NULL, (LPARAM)TEXT(logText));

  delete[] logText;
}

, и я называю это так:

appendLogText("Put something in the Edit box.\r\n");
appendLogText("Put something else in the Edit box.\r\n");

First ofвсе, что на самом деле делает TEXT()?Я пробовал с / без него: (LPARAM)logText и (LPARAM)TEXT(logText), и насколько я вижу, разницы нет.

Во-вторых, что я делаю неправильно в своей функции добавления?Если я закомментирую строку delete, то при первом запуске функции добавления я получаю мусор, который появляется в моем окне редактирования, после чего следует сообщение.При втором запуске программа вылетает.Если я не закомментировал это, то он падает даже в первый раз.

Ответы [ 2 ]

10 голосов
/ 26 августа 2011

Я бы переписал эту функцию на C следующим образом:

void appendLogText(LPCTSTR newText)
{
  DWORD l,r;
  SendMessage(tbLog, EM_GETSEL,(WPARAM)&l,(LPARAM)&r);
  SendMessage(tbLog, EM_SETSEL, -1, -1);
  SendMessage(tbLog, EM_REPLACESEL, 0, (LPARAM)newText);
  SendMessage(tbLog, EM_SETSEL,l,r);
}

Важно сохранить и восстановить существующее выделение, иначе элемент управления станет очень раздражающим для тех, кто хочет выделить и скопировать некоторыетекст вне элемента управления.

Кроме того, использование LPCTSTR обеспечивает возможность вызова функции при сборке с использованием многобайтового или юникодного набора символов.

Макрос TEXT был не на своем местеи должен использоваться для переноса строковых литералов:

LPCTSTR someString = TEXT("string literal");

Операционные системы Windows NT изначально имеют кодировку Unicode, поэтому создание многобайтовых приложений неэффективно.Использование TEXT () для строковых литералов и LPTSTR вместо char * помогает в этом преобразовании в Unicode.Но на самом деле, вероятно, было бы наиболее эффективно просто явно переключиться на программирование в юникоде на окнах: вместо char, strlen, std :: string используйте wchar_t, std :: wstring, wsclen и L "строковые литералы".

Переключение настроек сборки ваших проектов на Unicode заставит все функции Windows API ожидать строки Unicode.


Мое очень запоздалое внимание было обращено к тому, что передача -1 в качестве WPARAM для EM_SETSEL просто отменяет выборлюбой выбор, но не перемещает точку вставки.Таким образом, ответ должен быть изменен на (также не проверенный):

void appendLogText(HWND hWndLog, LPCTSTR newText)
{
  int left,right;
  int len = GetWindowTextLength(hWndLog);
  SendMessage(hWndLog, EM_GETSEL,(WPARAM)&left,(LPARAM)&right);
  SendMessage(hWndLog, EM_SETSEL, len, len);
  SendMessage(hWndLog, EM_REPLACESEL, 0, (LPARAM)newText);
  SendMessage(hWndLog, EM_SETSEL,left,right);
}
0 голосов
/ 26 августа 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...