Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Печать графики [D7]


fog ©   (2006-10-18 20:18:00) 

ДВС. Имеется прога рисующая кривую (график) в канве на экране - его необходимо распечатать.
Вопрос - как правильно организовать вывод на принтер (по-возможности - без API) и, если через TPrinter, то куда и когда воткнуть отрисовку в канву принтера с учетом границ.
Можно без кода, только последовательность действий.


Virgo_Style   (2006-10-19 19:07:00) [1]

fog   (19.10.06 18:37) [7]
Вот еще бы учесть границы из PageSetupDialog в канве принтера и было бы замечательно?!


про соответствие пикселей и дюймов см. [2]


fog   (2006-10-19 18:37:00) [2]

2 Barloggg>

Спасибо.
Вот еще бы учесть границы из PageSetupDialog в канве принтера и было бы замечательно?!


Barloggg   (2006-10-19 09:09:00) [3]


> Можно ли отрисовать график в канве принтера


можно.
и даже нужно.

просто растягивать картинку по размеры канвы - рискуем получить квадраты.

кстати разрешение принтера можно узнать напрямую у его канвы :)
Printer.Canvas.font.<не помню дальше>

лично я оперировал textheight для расстановки линий между строчками текста. т.е. конкретно делал полуторный интервал :)
никаких конкретных цифр. будет работать на любом принтере с любым разрешением.


fog   (2006-10-19 00:11:00) [4]

2 Shopot >
Уточняю.
Можно ли отрисовать график в канве принтера, а потом сделать следующее

Printer.BeginDoc;
Printer.Canvas.Refresh;
Printer.EndDoc;

или вместо Canvas.Refresh вставлять процедуру отрисовки?
Не могу проверить - нет принтера...


Shopot   (2006-10-18 23:34:00) [5]

>fog

А из-за чего ты думаешь у тебя будут большие искажения?
И смысл первого твоего вопроса становится непонятным после
вот этого:
>и выводится на экран с поправкой на разрешение


fog   (2006-10-18 21:30:00) [6]

2 Shopot>
Спасибо, но это я уже читал у Пачеко (D4, гл. 10).
StretchDraw годится для картинки - у меня будут большие искажения, поэтому график перерисовывается в Printer.Canvas также как и выводится на экран с поправкой на разрешение.


Virgo_Style   (2006-10-18 21:12:00) [7]

Дополню - dpi можно найти с помощью GetDeviceCaps(Printer.Handle, LogPixelsX)и
GetDeviceCaps(Printer.Handle, LogPixelsY).

И лучше, imho, все считать в физических единицах для однообразного вида на всех принтерах.


Shopot   (2006-10-18 21:00:00) [8]

Канва с графиком допустим называется - GraphCanvas. Тогда

Printer.Canvas.StretchDraw(Rect(0, 0, 100, 100), TGraphic(GraphCanvas));

И всё!!! Только вместо 100, 100 нужно поставить реальные числа.
Т.е. 100 - это число пикселей. Определяем текущее разрешение принтера
к примеру у нас вышло 300dpi (точек на дюйм бумаги или на 2,5 см по
нашему). Размер А4 примерно 21х29 см. Тогда чтобы отпечаток получился
на всю ширину страницы нужно: (21 см / 2,5 см) * 300 dpi = 2520.
(29 см / 2,5 см) * 300 dpi = 3480.

И получается
Printer.Canvas.StretchDraw(Rect(0, 0, 2520, 3480), TGraphic(GraphCanvas));

Но слева и сверху, а также справа и снизу можно отступить примерно по 150
точек для полей.
Printer.Canvas.StretchDraw(Rect(150, 150, 2520 - 150, 3480 - 150), TGraphic(GraphCanvas));


Наверх

Титульная страница Поиск, карта сайта Написать письмо