Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вычислить размер шрифта  (Прочитано 16655 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AlexCasual
Помогающий

by
Offline Offline

« : 25-01-2012 16:10 » 

С помощью функции GetTextExtentPoint32() определяю размер выводимой строки,как можно получить размер шрифта в пикселях для данной строки?При использовании функции GetTextMetrics() параметр tmHeight совпадает с параметром cx в GetTextExtentPoint32()...но как его перевести в пиксели и будет ли именно это размер шрифта?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 25-01-2012 17:05 » 

AlexCasual, вообще-то, функция GetTextExtentPoint32 и так в пикселах размеры строки возвращает
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 25-01-2012 19:10 » 

Насколько помню, высота строки в метриках задана от базовой линии до верхнего края строки и не учитывает подстрочных элементов символов. Это на случай, если нужна высота глифа.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
AlexCasual
Помогающий

by
Offline Offline

« Ответ #3 : 25-01-2012 19:41 » 

Суть в том,что по получаю высоту строки равную 51,исходя из логики,что функции возвращают значения в пикселях,получается 51 пиксель размер шрифта,но визуально на экране эта строка тянет максимум на 12px...Может я чего-то не допонимаю?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 25-01-2012 21:09 » 

Насчет базовой линии я ошибся. То было в Win9x.

Цитата
All sizes are specified in logical units; that is, they depend on the current mapping mode of the display context.

http://msdn.microsoft.com/en-us/library/dd145183%28v=vs.85%29.aspx
« Последнее редактирование: 25-01-2012 21:11 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #5 : 26-01-2012 03:50 » 

AlexCasual, возможно над контекстом устройства проводились трансформации SetWorldTransform, ModifyWorldTransform
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 26-01-2012 10:46 » 

Суть в том,что по получаю высоту строки равную 51,исходя из логики,что функции возвращают значения в пикселях,получается 51 пиксель размер шрифта,но визуально на экране эта строка тянет максимум на 12px...Может я чего-то не допонимаю?

А что значит "тянет максимум на 12px"? Откуда берутся эти самые 12px? Можно сделать скриншот и замерить точно. Или может 12 это всё-таки не px, а кегль?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #7 : 26-01-2012 11:15 » 

В общето функция GetTextExtentPoint32 возвращает размер не в пикселах, а в логических координатах. Попробуй применить LPtoDP.
Записан
AlexCasual
Помогающий

by
Offline Offline

« Ответ #8 : 30-01-2012 11:43 » 

Джон, замерял по сделанному скриншоту...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 30-01-2012 12:34 » 

А под 12 ты понимаешь кегль?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
AlexCasual
Помогающий

by
Offline Offline

« Ответ #10 : 30-01-2012 12:47 » 

Джон, нет,пикселей...

Добавлено через 4 минуты и 15 секунд:
Короче у меня реальная проблема - есть координаты слов(строк) текста и параметры шрифта(GetTextMetrics) снятого с контекста DC,я хочу по этим координатам составить человеческий текст,записывая его по координатам и соответствующим шрифтом в pdf  - результат - в некоторых случаях между отдельными словами образуются большие разрывы(пробелы),которых в действительности быть не должно...Думаю,что проблема в установке размера шрифта,но не могу придти к однозначному выводу по этой проблеме...Ааааа!
« Последнее редактирование: 30-01-2012 12:52 от AlexCasual » Записан
zubr
Гость
« Ответ #11 : 30-01-2012 15:36 » 

AlexCasual, вот ты получил контекст, как я понимаю из перехваченной GDI-функции выводящей текст., и по его координатам пытаешься скопировать в свой контекст. Но какие преобразования до момента твоего перехвата получил перехваченный контекст ты учитываешь?
Записан
AlexCasual
Помогающий

by
Offline Offline

« Ответ #12 : 30-01-2012 17:36 » 

zubr, копирование в контекст происходит без проблем,но я потом хочу получить файл с форматированным текстом,который выводился через DrawText,ExtTextOut и т.д....для этого выбрал формат pdf и библиотеку для работы с ним.Но не получается правильно позиционировать текст по имеющимся координатам в pdf,я полагаю,что я что-то не догоняю в преобразованиях координат и размерностей,в частности при выбое необходимого шрифта...
Записан
zubr
Гость
« Ответ #13 : 30-01-2012 18:00 » new

AlexCasual, судя по всему, ты не понимаешь о чем я тебе говорю.
Как я понимаю ты просто перехватываешь все текстовые GDI-функции. Но ведь программа, которая выводит текст может использовать какие то преобразования над контекстом устройства, кроме того что что то рисует или выводит текст. К примеру может выполнять такие функции как SetWorldTransform, SetViewportOrgEx, ModifyWorldTransform и т. п. А еще есть регионы и клиппинг, которые также необходимо учитывать. Чтобы твоя система корректно работала, надо перехватывать практически все GDI-функции, в которых выполнять все те действия над твоим контекстом, которые программа выполняет над своим, тогда в твоем контексте будут корректные координаты и размеры текста. Также в функциях, где в качестве параметра указаны логические координаты, необходимо использовать преобразование LPtoDP.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines