Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];

Вниз

DrawText   Найти похожие ветки 

 
REA   (2004-02-16 17:14) [0]

Не удается получить размер текста для DC принтера.
Код такой:

Canvas := TCanvas.Create;
Try
If Printer.Printers.Count>0 Then
Begin
Printer.GetPrinter(PChar(@Device[0]), PChar(@Driver[0]), PChar(@Port[0]), DevMode);
Canvas.Handle := CreateDC(PChar(@Driver[0]), PChar(@Device[0]), Nil, @DevMode);
End Else
Canvas.Handle := GetDC(0);
Canvas.Font := FFont;
rc := Rect(0, 0, 0, 0);
SetMapMode(Canvas.Handle, MM_TEXT); // Handle тут корректный
Windows.DrawText(Canvas.Handle, PChar(FCaption), Length(FCaption), rc, LabelFormat Or DT_NOCLIP Or DT_CALCRECT);
// Возвращается размер относительно разрешения экрана, а не принтера (!???)
XRes := GetDeviceCaps(Canvas.Handle, LOGPIXELSX)/MillimetersInInch; // Разрешение как положено принтеру
YRes := GetDeviceCaps(Canvas.Handle, LOGPIXELSY)/MillimetersInInch;
sz.cx := Ceil(rc.Right/XRes);
sz.cy := Ceil(rc.Bottom/YRes);
Finally
Canvas.Free;
End;


 
jel   (2004-02-16 17:33) [1]

А Canvas и Form.Canvas часом не путаются. Переименовать бы, для верности.


 
REA   (2004-02-16 17:45) [2]

Это не TForm. Не путаются ни с чем, т.к. разрешение дается от принтера, а размер текста не тот.


 
MBo   (2004-02-16 17:59) [3]

Printer.BeginDoc;
Printer.Canvas.Font := Memo1.Font;//arial 24
SetMapMode( Printer.Canvas.Handle, MM_TEXT);
Windows.DrawText( Printer.Canvas.Handle, PChar("AAAAAAAAA"), 9, rc,
DT_NOCLIP or DT_CALCRECT);
Caption:=IntToStr(rc.Right-rc.Left);
//получается 702 для принтера (600dpi), 63 для экрана

Printer.EndDoc;


 
REA   (2004-02-16 18:11) [4]

А вот мне как раз и не надо BeginDoc EndDoc. Мне надо при дизайне.

Вообще проблема в следующем: если устанавливать размер текста для экрана и переводить в миллиметры с округлением до большего, то при печати на принтер в заданном rc слова все-равно сползают на следующую строку.
На экране: !Это длинный текст!
На принтере:
!Это длинный !
текст
Т.е. эффект как будто размер текста в мм на принтере и экране разный. (Расстояние между ! в мм одинаковое)


 
MBo   (2004-02-16 18:18) [5]

>мне как раз и не надо BeginDoc EndDoc
Без этого мне долго воспроизводить ситуацию ;)

>как будто размер текста в мм на принтере и экране разный
DrawText не совсем точно считает.
У Фень Юаня в книге есть пример функции, рассчитывающей размер строки более точно (c учетом GetCharABCWidth)


 
REA   (2004-02-16 18:25) [6]

Хм. а без Фень Юаня? Придется наверно накинуть миллиметр с запасом просто и не мучаться - эта функция просто для удобства пользователя - автоподбор размера текста, но он его может и мышью поставить. Хотя может оказаться, что на экране и принтере при одном и том же размере прямоугольника текст выровняется по разному.
Спасибо за информацию.


 
MBo   (2004-02-16 18:28) [7]

Кроме того, шрифт с одним названием (логический) может соответствовать РАЗНЫМ физическим шрифтам для экрана и для принтера, разныые метрики могут быть.

Вот Peter Below пишет:
If you need exact WYSIWYG then you have to place each character individually


 
REA   (2004-02-17 09:07) [8]

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

Шрифт вроде как используется уже после создания в Delphi, т.е. Handle уже получен, но я правда не разбирался делает ли FontMapper где то подстановки потом.

Спасибо за информацию.
А нет ли плиз ссылочек на эти книжечки?


 
MBo   (2004-02-17 09:12) [9]

О тонкостях печати - попробуй покопаться на www.tamaracka.com - правда, не очень понятно, по каким ключевым слвам лучше искать

>А нет ли плиз ссылочек на эти книжечки?
Феня в эл. виде не существует.


 
REA   (2004-02-17 09:53) [10]

А Петя?


 
MBo   (2004-02-17 10:07) [11]

Он книжек не писал, но очень активен в borland news-группах, приведенная выдержка - оттуда (поиск по тамарке).
Подробностей он не приводит.
Сборник его ответов есть на codecentral.borland.com под номерами
19374 и 21249



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.008 c
4-94241
volser
2003-12-21 18:34
2004.02.29
Эмуляция нажатия клавиши


4-94242
volser
2003-11-06 12:23
2004.02.29
Hook мыши


1-93906
SergP
2004-02-15 20:38
2004.02.29
Нужно ли уничтожать созданые объекты при закрытии приложения


3-93772
Val12
2004-02-03 17:49
2004.02.29
ExportGrid4ToExcel


4-94243
Matrex
2003-12-21 19:31
2004.02.29
Свойства папки (файла)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский