Вопрос пользователя касается работы стандартного многострочного текстового контрола Windows, который ведет себя необычно при запросе строк. Когда активирована переноска слов, контролл принимает логические строки, но возвращает экранные строки при запросе EM_GETLINE. Однако при изменении размера окна и пересчете текста, контролл корректно распределяет текст, основываясь на исходных символах перевода строки (CR-LF).
Проблема заключается в том, что строки, запрошенные через EM_GETLINE, не содержат символов перевода строки. Кажется, что контролл хранит их внутри, но не возвращает при запросе EM_GETLINE. Получить эти символы можно, запросив весь текст контрола через WM_GETTEXT.
Пользователь пытается найти способ запросить части текста между соседними переводом строк без необходимости получения всего текста и его последующего разделения.
Подтвержденный ответ
Для получения оригинальных логических строк в многострочном текстовом контроле Windows, необходимо использовать функцию WM_GETTEXT, которая возвращает весь текст контрола, включая символы перевода строк. Функция EM_GETLINE предназначена для получения экранных строк и не включает символы перевода строк, если включена переноска слов.
Альтернативный ответ
Альтернативных способов запроса текста между логическими строками, кроме получения всего текста и его последующего разделения, в стандартном многострочном текстовом контроле Windows не существует.
Пример кода
program WindowsEditControl;
uses
Winapi.Windows, Winapi.Messages, System.SysUtils;
const
IDM_EXIT = 100;
GAP = 10;
var
hEdit: HWND;
hFnt: HFONT;
function GetTxt(hEdit: HWND): string;
var
Len: Integer;
begin
Len := SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0);
SetLength(Result, Len + 1); // +1 для символа перевода строки
if Len > 0 then
SendMessage(hEdit, WM_GETTEXT, Length(Result), LPARAM(PChar(Result)));
end;
function WndFunc(h: HWND; iMessage: UINT; w: WPARAM; l: LPARAM): LRESULT; stdcall;
var
nWidth, nHeight: NativeUInt;
i, j: Integer;
s: string;
begin
case iMessage of
WM_CREATE: begin
// Инициализация контрола и добавление текста
// ...
// Вывод всего текста, включая логические строки
MessageBox(h, PWideChar(GetTxt(hEdit)), 'Whole text', 0);
end;
// Обработка других сообщений
// ...
end;
end;
begin
// Инициализация класса окна
// ...
// Создание и отображение окна
// ...
// Основной цикл обработки сообщений
// ...
end.
Приведенный выше код демонстрирует, как получить текст из многострочного текстового контрола Windows, включая переводы строк, с помощью функции WM_GETTEXT.
Пользователь столкнулся с проблемой в стандартном многострочном текстовом контроле Windows, где функция `EM_GETLINE` не возвращает символы перевода строк, в отличие от функции `WM_GETTEXT`, которая включает их в возвращаемый текст, и ищ
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS