Delphi: рассчитать высоту прямоугольника, необходимую для текста с переносом слов

Delphi Rio 10.3.1 + GR32 (TextoutW + DT_WORDBREAK)

Я хочу нарисовать текст на TBitmap32, используя TextoutW из библиотеки GR32, и я хочу рассчитать необходимую высоту для размещения текста с переносом слов с учетом параметра MaxWidth и определенного шрифта.

Как я могу рассчитать необходимый Rect для этого?

Я думаю, это зависит от используемого вами бэкэнда GDI. С помощью TGDIBackend.TextoutW выполняется вызов функции Winapi DrawTextW, которая предлагает поддержку для вычисления выходного прямоугольника. Однако интерфейс к TGDIBackend.TextoutW передает прямоугольник по значению, а не как параметр var. Чтобы справиться с этим, вам нужно напрямую вызвать функцию Winapi DrawTextW.

David Heffernan 07.05.2019 10:26

Я всегда получаю 0, что я делаю неправильно? "DrawTextW(bTray.Handle, PChar(OriginalTitle), Length(OriginalTitle), r, DT_CALCRECT или DT_LEFT или DT_TOP или DT_WORDBREAK);"

hikari 07.05.2019 13:43

Какова ценность bTray.Handle?

David Heffernan 07.05.2019 13:49

Я использовал дескриптор формы, мой плохой, мне пришлось использовать canvas.handle (DC). Но теперь, как мне перевести логические единицы в реальные пиксели?

hikari 07.05.2019 14:03

Подожди. Разве вы не рисуете на поверхности GR32?

David Heffernan 07.05.2019 14:08

на TBitmap32, который я затем передаю на TBitmap, который затем загружается в TImage в форме

hikari 07.05.2019 14:09

Звучит как один шаг слишком много. Вы, безусловно, можете рисовать прямо из объекта GR32 в свой элемент управления изображением. Или сделайте это в окне с краской или даже в OnPaint формы. Во всяком случае, я не уверен, что вы вообще подразумеваете под логическими координатами. Вы ничего не сказали о каком-либо отображении координатного пространства.

David Heffernan 07.05.2019 14:28

Из MSDN (DrawTextW) «Если функция завершается успешно, возвращаемое значение представляет собой высоту текста в логических единицах».

hikari 07.05.2019 15:33

Это нормально, вы можете использовать его, если вы не применяли никаких преобразований к контексту устройства, например. режим карты MM_TEXT.

Sertac Akyuz 07.05.2019 16:03

Спасибо, заработало. Отправьте ответ с помощью DrawTextW, чтобы принять его.

hikari 07.05.2019 16:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
221
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Метод TextoutW из GR32, по крайней мере, для бэкэнда VCL, оборачивает функцию Windows DrawTextW. Эта функция Windows API предоставляет метод для вычисления выходного прямоугольника с помощью флага DT_CALCRECT. Однако интерфейс GR32 не возвращает вычисленный прямоугольник вызывающей стороне.

Поэтому вместо этого я подозреваю, что вам нужно вызвать DrawTextW напрямую, передав соответствующие флаги и контекст устройства (HDC) поверхности GR32.

Другие вопросы по теме