GDI и GDI Plus - вывод текста
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.08.22 09:26
Оценка:
Здравствуйте!

Что-то они как-то по-разному работают, .

HDC — MapMode н еустанавливал — дефолтный MM_TEXT. Для него создаю объект Gdiplus::Graphics.

1) Когда создаю фонт
а) Для HDC — LOGFONT lf.lfHeight — про это поле пишут, что in logical units — Ок
б) Для Graphics — Gdiplus::Font — задаю Gdiplus::UnitWorld — Specifies world coordinates, a nonphysical unit. Почему-то размер шрифта получается больше, чем для простого GDI. Умножил на 0.9 — стало совпадать, у меня, но не факт, что так же будет на других мониторах. В чем проблема?

Есть еще такие юниты:
UnitWorld — Specifies world coordinates, a nonphysical unit.
UnitDisplay — Specifies display units. For example, if the display device is a monitor, then the unit is 1 pixel.
UnitPixel — Specifies that a unit is 1 pixel.
UnitPoint — Specifies that a unit is 1 point or 1/72 inch.
UnitInch — Specifies that a unit is 1 inch.
UnitDocument — Specifies that a unit is 1/300 inch.
UnitMillimeter — Specifies that a unit is 1 millimeter.

Но они вроде как не особо мне подходят


2) Вывожу текст функцией TextOut и Gdiplus::DrawString.
Почти всё хорошо, за исключением того, что Gdiplus::DrawString выводит текст правее, чем TextOut. У меня на мониторе — на 5 мм вправо.
Какого Хэ?
Маньяк Робокряк колесит по городу
Re: GDI и GDI Plus - вывод текста
От: qaz77  
Дата: 24.08.22 11:09
Оценка: 6 (1)
Здравствуйте, Marty, Вы писали:
Почему-то размер шрифта получается больше, чем для простого GDI. Умножил на 0.9 — стало совпадать, у меня, но не факт, что так же будет на других мониторах. В чем проблема?

Есть подозрение, что дело в знаке LOGFONT::lfHeight.
Положительные значения соответствуют размеру "ячейки" (cell), а отрицательные — символа.
Обычно размеры шрифтов пересчитываются из поинтов и DPI в логические юниты и с минусом ставятся в LOGFONT.
Задание размера ячейки — это какая-то экзотика.
Re[2]: GDI и GDI Plus - вывод текста
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.08.22 11:14
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Почему-то размер шрифта получается больше, чем для простого GDI. Умножил на 0.9 — стало совпадать, у меня, но не факт, что так же будет на других мониторах. В чем проблема?


Q>Есть подозрение, что дело в знаке LOGFONT::lfHeight.


Точно так! Спасибо

А нет мыслей, почему сдвиг?
Маньяк Робокряк колесит по городу
Re[3]: GDI и GDI Plus - вывод текста
От: qaz77  
Дата: 24.08.22 11:22
Оценка:
Здравствуйте, Marty, Вы писали:
M>А нет мыслей, почему сдвиг?

Координаты точно в одной системе?
Нет всяких сдвигов начала координат (SetWindowOrg/SetViewportOrg)?
Re[4]: GDI и GDI Plus - вывод текста
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.08.22 11:24
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Здравствуйте, Marty, Вы писали:

M>>А нет мыслей, почему сдвиг?

Q>Координаты точно в одной системе?


Ну, я явно ничего не делаю в DoPaint


Q>Нет всяких сдвигов начала координат (SetWindowOrg/SetViewportOrg)?


Я такого не делаю
Маньяк Робокряк колесит по городу
Re[3]: GDI и GDI Plus - вывод текста
От: qaz77  
Дата: 24.08.22 13:08
Оценка:
Здравствуйте, Marty, Вы писали:
M>А нет мыслей, почему сдвиг?

У GDI+ объекта есть метод Font::GetLogFontW.
Может посмотреть в отладчике, что GDI структура LOGFONT заполнена эквивалентно.

В целом мало информации.
Где код? Скриншот текста со смещением?
Re[4]: GDI и GDI Plus - вывод текста
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.08.22 13:50
Оценка:
Здравствуйте, qaz77, Вы писали:

M>>А нет мыслей, почему сдвиг?


Q>У GDI+ объекта есть метод Font::GetLogFontW.

Q>Может посмотреть в отладчике, что GDI структура LOGFONT заполнена эквивалентно.

Надо попробовать. Хотя, не очень понятно, как это может повлиять


Q>В целом мало информации.

Q>Где код?

Кода слишком много


Q>Скриншот текста со смещением?


  GDI

  GDI+
Маньяк Робокряк колесит по городу
Re[5]: GDI и GDI Plus - вывод текста
От: qaz77  
Дата: 24.08.22 14:14
Оценка:
Здравствуйте, Marty, Вы писали:
Q>>Скриншот текста со смещением?

Да, смещение не маленькое, на округления не спишешь...
Для GDI интерпретация x, y зависит от текущего выравнивания (SetTextAlign/GetTextAlign).
Я бы посмотрел вывод в точку (0, 0) для обоих случаев, чтобы исключить сдвиг и коэффициент масштабирования.

Еще заметил странность на скриншотах.
На GDI текст со сглаживанием, а линии фигур — нет.
На GDI+ все наоборот, текст без сглаживания, а линии симпатичные.
Re[6]: GDI и GDI Plus - вывод текста
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.08.22 14:24
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>>>Скриншот текста со смещением?


Q>Да, смещение не маленькое, на округления не спишешь...


Угу


Q>Для GDI интерпретация x, y зависит от текущего выравнивания (SetTextAlign/GetTextAlign).


Такого не нашел, добавил
        Gdiplus::StringFormat stringFormat = Gdiplus::StringFormat(0,0);
        stringFormat.SetAlignment(Gdiplus::StringAlignmentNear);
        stringFormat.SetLineAlignment(Gdiplus::StringAlignmentNear);
        stringFormat.SetFormatFlags(Gdiplus::StringFormatFlagsNoWrap);
        stringFormat.SetHotkeyPrefix(Gdiplus::HotkeyPrefixNone);


Не помогло

Заметил, что для шрифта меньшего размера смещение меньше


Q>Я бы посмотрел вывод в точку (0, 0) для обоих случаев, чтобы исключить сдвиг и коэффициент масштабирования.


Смещение осталось


Q>Еще заметил странность на скриншотах.


Ага

Q>На GDI текст со сглаживанием, а линии фигур — нет.

Q>На GDI+ все наоборот, текст без сглаживания, а линии симпатичные.

На GDI+ можно выключить антиалиасинг, тогда линии станут такие же, как и в случае GDI, а вот почему GDI+ текст так по-уродски выводится — хз
Маньяк Робокряк колесит по городу
Re[6]: GDI и GDI Plus - вывод текста
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.08.22 15:52
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>На GDI текст со сглаживанием, а линии фигур — нет.


А это, кстати, наверное SystemParametersInfo с SPI_SETFONTSMOOTHING может отключить (в 10ке видимо по умолчанию включено, на более ранних виндах, помню, шрифты не так красиво рисовались), но не понятно, почему GDI+ без него
Маньяк Робокряк колесит по городу
Re[6]: GDI и GDI Plus - вывод текста
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 25.08.22 02:45
Оценка: 3 (1)
Здравствуйте, qaz77, Вы писали:

Q>Да, смещение не маленькое, на округления не спишешь...


Нашел тут — https://stackoverflow.com/questions/54024997/how-to-properly-left-align-text-with-drawstring

Use TextRenderer.DrawText. However, it's part of Windows Forms. So it won't be available neither in .NET Standard nor .NET Core.

Use Graphics.DrawString with the magic option StringFormat.GenericTypographic. It magically removes the padding.


https://docs.microsoft.com/en-us/windows/win32/api/gdiplusstringformat/nf-gdiplusstringformat-stringformat-generictypographic
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.