Форум: "Основная";
Текущий архив: 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.009 c