Я делаю собственное поле редактирования, используя прямое 2D и прямую запись. Покраска вещей (коробка) выполнена в прямом 2D. Я беру ввод из сообщения WM_CHAR и добавляю его в строку. Эта строка записывается в поле. Теперь проблема заключается в том, что всякий раз, когда ввод текста превышает длину текстового поля, он автоматически прокручивается вниз, и теперь вводимый текст не отображается в текстовом поле. Итак, как прокручивать текст, чтобы он всегда находился в текстовом поле.
Как сделать прокрутку текста в поле редактирования?
Ответы (2)
Я полагаю, что вы использовали «IDWriteTextFormat::SetTextAlignment», чтобы выровнять текст по центру поля макета. Точно так же вы можете использовать «IDWriteTextFormat::SetParagraphAlignment» для управления вертикальным выравниванием текста.
Но он не может делать то, что вы назвали «текст всегда находится в текстовом поле». Вы должны изменить размер шрифта, чтобы он соответствовал статическому блоку макета. «Прокрутка» здесь не поможет.
Все зависит от того, что вы хотите с ним делать и насколько сложным должен быть ваш контроль. Если есть ограничение отображать только одну строку, вы можете попробовать принудительно включить режим переноса DWRITE_WORD_WRAPPING_NO_WRAP
. Если вы хотите, чтобы он был многострочным, и вы хотите использовать только один шрифт, вы можете вычислить высоту строки один раз, а затем в новой строке отобразить следующую строку вместо текущей; аналогично на ВК_УП например можно прокрутить на одну строку назад. Дело в том, что при использовании многострочного элемента управления естественно ожидать, что он будет отображать части вашего текста, кратные высоте строки.
В любом случае вы должны реализовать прокрутку самостоятельно, например. обновление цели рендеринга и отображение только ее части за раз. Это не работа DirectWrite или D2D.