Как сделать прокрутку текста в поле редактирования?

Я делаю собственное поле редактирования, используя прямое 2D и прямую запись. Покраска вещей (коробка) выполнена в прямом 2D. Я беру ввод из сообщения WM_CHAR и добавляю его в строку. Эта строка записывается в поле. Теперь проблема заключается в том, что всякий раз, когда ввод текста превышает длину текстового поля, он автоматически прокручивается вниз, и теперь вводимый текст не отображается в текстовом поле. Итак, как прокручивать текст, чтобы он всегда находился в текстовом поле.

вот изображение, показывающее поле редактирования

вот изображение, которое показывает проблему


person user3696177    schedule 04.11.2015    source источник


Ответы (2)


Я полагаю, что вы использовали «IDWriteTextFormat::SetTextAlignment», чтобы выровнять текст по центру поля макета. Точно так же вы можете использовать «IDWriteTextFormat::SetParagraphAlignment» для управления вертикальным выравниванием текста.

Но он не может делать то, что вы назвали «текст всегда находится в текстовом поле». Вы должны изменить размер шрифта, чтобы он соответствовал статическому блоку макета. «Прокрутка» здесь не поможет.

person Ruslan Garipov    schedule 16.11.2015

Все зависит от того, что вы хотите с ним делать и насколько сложным должен быть ваш контроль. Если есть ограничение отображать только одну строку, вы можете попробовать принудительно включить режим переноса DWRITE_WORD_WRAPPING_NO_WRAP. Если вы хотите, чтобы он был многострочным, и вы хотите использовать только один шрифт, вы можете вычислить высоту строки один раз, а затем в новой строке отобразить следующую строку вместо текущей; аналогично на ВК_УП например можно прокрутить на одну строку назад. Дело в том, что при использовании многострочного элемента управления естественно ожидать, что он будет отображать части вашего текста, кратные высоте строки.

В любом случае вы должны реализовать прокрутку самостоятельно, например. обновление цели рендеринга и отображение только ее части за раз. Это не работа DirectWrite или D2D.

person bunglehead    schedule 01.02.2016