Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.29;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
1-93857
xobbit
2004-02-16 02:52
2004.02.29
TTabSheet(Page control) в Рантайм


3-93782
gonzales
2004-02-03 15:18
2004.02.29
Составление запроса с вычитанием одного поля из другого


1-93891
Alex_rar
2004-02-18 14:09
2004.02.29
Создание картинок


9-93748
Александр Ф.
2003-08-17 17:47
2004.02.29
ПОмОГИТЕ МНЕ! Делаю 1-ю игрушку


1-93839
uu
2004-02-16 18:49
2004.02.29
Задержка при завершении программы