![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как правильно создать виртуальную канву (Tcanvas)?
Vasian © (2005-07-27 17:04:00)как правильно создать виртуальную канву (Tcanvas)? И задать ее свойства, типа font.size:= и тд.
Vasian (2005-07-29 07:34:00) [1]
> Джо © (29.07.05 05:43) [21]
Спасибо. На примере работает, буду вставлять в исходник проги.
Джо (2005-07-29 05:43:00) [2]
> [20] Vasian © (29.07.05 05:41)
Используй GetDeviceCaps для получения различной информации о принтере. Например, количество точек на дюйм, размер печатаемой области и прочее.
Vasian (2005-07-29 05:41:00) [3]Получилось через metacanvas, с двойным обращением к stretchdraw, но проблема стала в том, что при этом размер текста и графики сильно отличается, если учесть, что нужно подгонять размер метаканвы под канву принтера, а текст (его много в разных местах) должен быть в определенном месте, которое уже подобрано, т.е. не сдвигаться относительно края, при печати на разных принтерах. Можно, конечно, снять размеры канвы принтера обращением к Begindoc, но после этого прога ругается.
procedure TForm1.Button3Click(Sender: TObject);
var
Metafile: TMetafile;
MetaCanvas: TMetafileCanvas;
Rct1,rct2: TRect;
begin
Metafile := TMetafile.Create;
try
MetaCanvas := TMetafileCanvas.Create(Metafile,0);
try
metacanvas.Font.Size:=8;
metacanvas.Pen.Style:=pssolid;
metacanvas.Pen.Width:=2;
metacanvas.Rectangle(0,0,2000,2000);
metacanvas.TextOut(0,0,'Text on Canvas');
RCT1:=rect(0,0,2000,1000);
RCT2:=rect(0,1000,2000,2000);
finally
// нарисованное на канве, сохраняется в метафайла
// только после ее удаления. Именно здесь :)
MetaCanvas.Free;
end;
// Выводим на принтер, растягивая на лист
Printer.BeginDoc;
try
Printer.Canvas.StretchDraw(Rct1,Metafile);
Printer.Canvas.StretchDraw(Rct2,Metafile);
finally
Printer.EndDoc;
end;
finally
Metafile.Free;
end;
end;
ЮЮ (2005-07-28 10:45:00) [4]Товарищи модераторы, разрешите Ивану Пантелееву читать сообщения, а то он всё пишет, пишет ... :)
(2005-07-28 10:39:00) [5]Удалено модератором
ЮЮ (2005-07-28 07:54:00) [6]>Не, не проще - код большой, захламлять код программы не очень охота.
Так ведь не Copy+Paste предлагается, а
Procedure DrawOnCanvas(Canvas: TCanvas; Layout: TPoint)
begin
здесь, собственно код, учитывающий, что левый-верхний угол задан (Layout)
end;
DrawOnCanvas(Printer.Canvas, Point(0, 0));
DrawOnCanvas(Printer.Canvas, TPoint(0, <вертикальное смещение>));
Сразу заложился и на то, вдруг захочется и горизонтальное смещение :)
Vasian (2005-07-28 07:07:00) [7]
> Чтобы нарисованное на канвасе хранилось
Разве не хранится? Печать то начинается после enddoc.
> З.Ы. Проще выполнить процедуру рисования дважды с разным
> отступом по вертикальной оси
Не, не проще - код большой, захламлять код программы не очень охота.
Джо (2005-07-28 03:10:00) [8]
> [14] Джо © (28.07.05 03:03)
Пример:
procedure TForm1.Button1Click(Sender: TObject);
var
Metafile: TMetafile;
MetaCanvas: TMetafileCanvas;
Rct: TRect;
begin
Metafile := TMetafile.Create;
try
MetaCanvas := TMetafileCanvas.Create(Metafile,0);
try
//
// здесь рисуем на созданой канве метафайла
//
finally
// нарисованное на канве, сохраняется в метафайла
// только после ее удаления. Именно здесь :)
MetaCanvas.Free;
end;
// Выводим на принтер, если нужно растягивая на лист
Rct.Left := ...
Rct.Top := ...
//....
Printer.BeginDoc;
try
Printer.Canvas.StretchDraw(Rct,Metafile);
finally
Printer.EndDoc;
end;
finally
Metafile.Free;
end;
end;
Джо (2005-07-28 03:03:00) [9]
> [12] Vasian © (28.07.05 02:12)
Если на принтер, то рисовать лучше всего на канве метафайла (TMetafileCanvas), как я и советовал в [4]. Потому какЮ возможно, придется делать StretchDraw.
ЮЮ (2005-07-28 03:02:00) [10]>а копии фрагмента нет
Чтобы на канвасе что-то было, на нем надо постоянно рисовать, TPaintBox тому пример. Тем более принтер, ибо "рисование" на его канвасе должно "порождать" соответствующие команды принтера, имно.
Чтобы нарисованное на канвасе хранилось, следует использовать Canvas TBitmap-а. Но тут наверняка будут свои проблемы в связи с разными характеристиками его канваса и канваса принтера.
З.Ы. Проще выполнить процедуру рисования дважды с разным отступом по вертикальной оси
Vasian (2005-07-28 02:12:00) [11]
> pasha_golub © (27.07.05 18:50) [6]
> А смысл в виртуальном канвасе, если потом это не будет где-либо
> отображаться...
Эту канву потом на принтер.Если все рисовать в канву принтера, то потом, копируя ее фрагмент на продолжение листа, копия уже нарисованного фрагмента не пропечатывается (Printer.Canvas.Copyrect(rect2,Printer.canvas,rect1)), т.е. начальный рисунок есть, а копии фрагмента нет. Или что-то не правильно делаю?
Eraser (2005-07-27 21:19:00) [12]Vasian © (27.07.05 17:04)
как правильно создать виртуальную канву
Реальных полотен для рисования пока что компьютер делать не умеет, по крайней мере без спец. дивайсов.
palva (2005-07-27 20:56:00) [13]А если не надо выводить? Типа CGI-программа (консольная) рисует график или круговую диаграмму, делает дополнительную попиксельную обработку типа водяных знаков а затем сканируя Pixels при помощи самодельной процедуры отдает результат клиенту в виде GIF.
jack128 (2005-07-27 20:14:00) [14]Ega23 © (27.07.05 18:52) [7]
Т.е. я понимаю задачу, когда есть какой-то битмап сложный
а если нету готового битмапа(картинки), изображение программно рисуется, то зачем этот битмап вообще создовать??
pasha_golub (2005-07-27 18:53:00) [15]Ega23 © (27.07.05 18:52) [7]
Ну, и я о том же..
Ega23 (2005-07-27 18:52:00) [16]2 pasha_golub © (27.07.05 18:50) [6]
Да вот мне тоже как-то непонятно. Т.е. я понимаю задачу, когда есть какой-то битмап сложный, ты на нём чего-то нарисовал, что-то сделал и только потом на экран вывел. А так... Не понимаю...
pasha_golub (2005-07-27 18:50:00) [17]А смысл в виртуальном канвасе, если потом это не будет где-либо отображаться...
Vasian (2005-07-27 17:49:00) [18]
> А человеку, как я понял нужна канва "в памяти", без привязки
> к какому то окну..
Да так и есть.
Всем спасибо за ответы, буду пробовать
Джо (2005-07-27 17:45:00) [19]
> как правильно создать виртуальную канву (Tcanvas)?
Я обычно делаю так:
var
Bmp: TBitmap;
...
Bmp := TBitmap.Create;
try
...
Bmp.Canvas // etc
или же создаюTMetafile& TMetafileCanvas.
jack128 (2005-07-27 17:39:00) [20]Ega23 © (27.07.05 17:30) [2]
В принципе, TPaintBox - и есть "голый" canvas. С некоторыми "наворотами"
Это не виртуальный канвас, а вполне реальный. Который запрашивается у родителя пайнт бокса. А человеку, как я понял нужна канва "в памяти", без привязки к какому то окну..