Delphi Rio 10.3.1 + GR32 (TextoutW + DT_WORDBREAK)
Я хочу нарисовать текст на TBitmap32, используя TextoutW из библиотеки GR32, и я хочу рассчитать необходимую высоту для размещения текста с переносом слов с учетом параметра MaxWidth и определенного шрифта.
Как я могу рассчитать необходимый Rect для этого?
Я всегда получаю 0, что я делаю неправильно? "DrawTextW(bTray.Handle, PChar(OriginalTitle), Length(OriginalTitle), r, DT_CALCRECT или DT_LEFT или DT_TOP или DT_WORDBREAK);"
Какова ценность bTray.Handle?
Я использовал дескриптор формы, мой плохой, мне пришлось использовать canvas.handle (DC). Но теперь, как мне перевести логические единицы в реальные пиксели?
Подожди. Разве вы не рисуете на поверхности GR32?
на TBitmap32, который я затем передаю на TBitmap, который затем загружается в TImage в форме
Звучит как один шаг слишком много. Вы, безусловно, можете рисовать прямо из объекта GR32 в свой элемент управления изображением. Или сделайте это в окне с краской или даже в OnPaint формы. Во всяком случае, я не уверен, что вы вообще подразумеваете под логическими координатами. Вы ничего не сказали о каком-либо отображении координатного пространства.
Из MSDN (DrawTextW) «Если функция завершается успешно, возвращаемое значение представляет собой высоту текста в логических единицах».
Это нормально, вы можете использовать его, если вы не применяли никаких преобразований к контексту устройства, например. режим карты MM_TEXT.
Спасибо, заработало. Отправьте ответ с помощью DrawTextW, чтобы принять его.





Метод TextoutW из GR32, по крайней мере, для бэкэнда VCL, оборачивает функцию Windows DrawTextW. Эта функция Windows API предоставляет метод для вычисления выходного прямоугольника с помощью флага DT_CALCRECT. Однако интерфейс GR32 не возвращает вычисленный прямоугольник вызывающей стороне.
Поэтому вместо этого я подозреваю, что вам нужно вызвать DrawTextW напрямую, передав соответствующие флаги и контекст устройства (HDC) поверхности GR32.
Я думаю, это зависит от используемого вами бэкэнда GDI. С помощью
TGDIBackend.TextoutWвыполняется вызов функции WinapiDrawTextW, которая предлагает поддержку для вычисления выходного прямоугольника. Однако интерфейс кTGDIBackend.TextoutWпередает прямоугольник по значению, а не как параметр var. Чтобы справиться с этим, вам нужно напрямую вызвать функцию WinapiDrawTextW.