Преобразование высоты LogFont в размер шрифта в пунктах - PullRequest
4 голосов
/ 31 мая 2010

У меня есть структура LOGFONT. Теперь все, что я хотел бы сделать, это получить связанный размер шрифта в пунктах с высоты LOGFONT.

Ответы [ 2 ]

11 голосов
/ 31 мая 2010

Когда режим отображения равен mm_Text (что обычно и происходит), и когда поле lfHeight положительное, оно уже дает высоту в точках.Когда оно отрицательное, единицами измерения являются пиксели. MSDN для LogFont дает формулу для преобразования между ними:

lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

Есть 72 точки на дюйм.GetDeviceCaps говорит о количестве пикселей на дюйм на данном устройстве.Инвертируйте формулу, чтобы получить пиксели из точек:

PointSize := MulDiv(-lfHeight, 72, GetDeviceCaps(hDC, LogPixelsY);

Важно понимать, что вам нужен контекст устройства.Размер шрифта не существует независимо от носителя, на котором они появляются.Высота пикселя шрифта на экране будет отличаться от высоты пикселя шрифта на принтере.Используйте свойство Handle любого холста, на который вы планируете рисовать.

1 голос
/ 01 сентября 2011

Я также нахожу это немного запутанным.Вот несколько вещей, которые я узнал.;)

  1. Изучите два младших бита lfPitchAndFamily, чтобы определить тип шрифта.
  2. Для шрифтов с фиксированным шагом используйте GetTextMetrics и структуру TEXTMETRIC.
  3. Для шрифтов с переменным шагом (true-type и т. Д.) Используйте GetOutlineTextMetrics и структуру OUTLINETEXTMETRIC.Убедитесь, что вы правильно выровняли структуру.Кроме того, структура имеет переменный размер.Вызовите функцию один раз, чтобы получить размер, выделите место, затем снова вызовите функцию, чтобы заполнить структуру.
  4. Оттуда вы можете найти правильную информацию о подъеме, спуске и другую информацию о размере.

Имейте в виду, что это рекомендуемые значения, и не все процедуры отображения будут использовать их должным образом.Например, я нахожусь в процессе выяснения правильного метода определения требуемой высоты статического элемента управления диалогового окна для данной строки текста.Похоже, что Microsoft следовала своей собственной документации.;) Не то чтобы документация была настолько ясной или полной, для начала.

...