Что нового

Элементы GUI Проблема с текстом в GDI plus

Пост номер 2 был отмечен как лучший ответ.

Sergy

Новичок
Сообщения
24
Репутация
1
Есть маленькая беда.
Берём из справки пример от функции _GDIPlus_GraphicsMeasureString и текст "Hello world" заменяем на "ужасы" и видим, что не отображается последняя буква.

Код:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>

Example()

Func Example()
    Local $hGUI, $hGraphic, $hBrush, $hFormat, $hFamily, $hFont, $tLayout, $aInfo
    Local $sString = "ужасы"  ; трогал только эту строку

    ; Create GUI
    $hGUI = GUICreate("GDI+", 400, 300)
    GUISetState(@SW_SHOW)

    ; Draw a string
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF00007F)
    $hFormat = _GDIPlus_StringFormatCreate()
    $hFamily = _GDIPlus_FontFamilyCreate("Arial")
    $hFont = _GDIPlus_FontCreate($hFamily, 12, 2)
    $tLayout = _GDIPlus_RectFCreate(140, 110, 0, 0)
    $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sString, $hFont, $tLayout, $hFormat)
    _GDIPlus_GraphicsDrawStringEx($hGraphic, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)

    ; Loop until the user exits.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    ; Clean up resources
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
EndFunc   ;==>Example


Выглядит вот так:
1588718252383.png


Как с таким бороться? Заранее не угадаешь, в каком случае потеряется символ.
 

joiner

Модератор
Локальный модератор
Сообщения
3 354
Репутация
581
проблема в том, что функция MeasureString в структуре дает дробные данные ширины и высоты. следующая функция их округляет в меньшую сторону, а значит обрезается текст
если их округлить правильно, то все ок

пример
Код:
Func Example()
    Local $hGUI, $hGraphic, $hBrush, $hFormat, $hFamily, $hFont, $tLayout, $aInfo
    Local $sString = "ужасы"

    ; Create GUI
    $hGUI = GUICreate("GDI+", 400, 300)
    GUISetState(@SW_SHOW)

    ; Draw a string
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF00007F)
    $hFormat = _GDIPlus_StringFormatCreate()
    $hFamily = _GDIPlus_FontFamilyCreate("Arial")
    $hFont = _GDIPlus_FontCreate($hFamily, 12, 2)
    $tLayout = _GDIPlus_RectFCreate(140, 110, 0, 0)
    $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sString, $hFont, $tLayout, $hFormat)
    Local $tRectF = DllStructCreate("float X;float Y;float Width;float Height", DllStructGetPtr($aInfo[0]))
    DllStructSetData($tRectF, 3, Ceiling(DllStructGetData($tRectF, 3))); округляем число в большую сторону. попробуй заменить Ceiling на Floor
    DllStructSetData($tRectF, 4, Ceiling(DllStructGetData($tRectF, 4))); округляем число в большую сторону. попробуй заменить Ceiling на Floor
    _GDIPlus_GraphicsDrawStringEx($hGraphic, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    ; Clean up resources
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
EndFunc   ;==>Example
 
Последнее редактирование:
Автор
S

Sergy

Новичок
Сообщения
24
Репутация
1
Спасибо! В приведённом варианте проверил на основном проекте - всё отлично, ничего никуда не пропадает при разных шрифтах.
 
Верх