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

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

как правильно создать виртуальную канву (Tcanvas)?


Страницы:   1 2

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. С некоторыми "наворотами"


Это не виртуальный канвас, а вполне реальный. Который запрашивается у родителя пайнт бокса. А человеку, как я понял нужна канва "в памяти", без привязки к какому то окну..


Страницы:   1 2

Наверх

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