Я бы переписал эту функцию на 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);
}