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

Вниз

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

 
Vasian ©   (2005-07-27 17:04) [0]

как правильно создать виртуальную канву (Tcanvas)? И задать ее свойства, типа font.size:= и тд.


 
jack128 ©   (2005-07-27 17:21) [1]

Canvas := TCanvas.Create;
try
 Canvas.Handle := CreateCompatibleDC(0);
 ...
 ...
finally
 if Canvas.Handle <> 0 then
   DeleteDC(Canvas.Handle);
 FreeAndNil(Canvas);
end;


 
Ega23 ©   (2005-07-27 17:30) [2]

В принципе, TPaintBox - и есть "голый" canvas. С некоторыми "наворотами"


 
jack128 ©   (2005-07-27 17:39) [3]

Ega23 ©   (27.07.05 17:30) [2]
В принципе, TPaintBox - и есть "голый" canvas. С некоторыми "наворотами"


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


 
Джо ©   (2005-07-27 17:45) [4]


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

Я обычно делаю так:

var
 Bmp: TBitmap;
...
 Bmp := TBitmap.Create;
 try
   ...
   Bmp.Canvas // etc

или же создаю TMetafile & TMetafileCanvas.


 
Vasian ©   (2005-07-27 17:49) [5]


> А человеку, как я понял нужна канва "в памяти", без привязки
> к какому то окну..

Да так и есть.
Всем спасибо за ответы, буду пробовать


 
pasha_golub ©   (2005-07-27 18:50) [6]

А смысл в виртуальном канвасе, если потом это не будет где-либо отображаться...


 
Ega23 ©   (2005-07-27 18:52) [7]

2 pasha_golub ©   (27.07.05 18:50) [6]

Да вот мне тоже как-то непонятно. Т.е. я понимаю задачу, когда есть какой-то битмап сложный, ты на нём чего-то нарисовал, что-то сделал и только потом на экран вывел. А так... Не понимаю...


 
pasha_golub ©   (2005-07-27 18:53) [8]

Ega23 ©   (27.07.05 18:52) [7]
Ну, и я о том же..


 
jack128 ©   (2005-07-27 20:14) [9]

Ega23 ©   (27.07.05 18:52) [7]
Т.е. я понимаю задачу, когда есть какой-то битмап сложный

а если нету готового битмапа(картинки), изображение программно рисуется, то зачем этот битмап вообще создовать??


 
palva ©   (2005-07-27 20:56) [10]

А если не надо выводить? Типа CGI-программа (консольная) рисует график или круговую диаграмму, делает дополнительную попиксельную обработку типа водяных знаков а затем сканируя Pixels при помощи самодельной процедуры отдает результат клиенту в виде GIF.


 
Eraser ©   (2005-07-27 21:19) [11]

Vasian ©   (27.07.05 17:04)  
как правильно создать виртуальную канву


Реальных полотен для рисования пока что компьютер делать не умеет, по крайней мере без спец. дивайсов.


 
Vasian ©   (2005-07-28 02:12) [12]



> pasha_golub ©   (27.07.05 18:50) [6]
> А смысл в виртуальном канвасе, если потом это не будет где-либо
> отображаться...


Эту канву потом на принтер.Если все рисовать в канву принтера, то потом, копируя ее фрагмент на продолжение листа, копия уже нарисованного фрагмента не пропечатывается (Printer.Canvas.Copyrect(rect2,Printer.canvas,rect1)), т.е. начальный рисунок есть, а копии фрагмента нет. Или что-то не правильно делаю?


 
ЮЮ ©   (2005-07-28 03:02) [13]

>а копии фрагмента нет

Чтобы на канвасе что-то было, на нем надо постоянно рисовать, TPaintBox тому пример. Тем более принтер, ибо "рисование" на его канвасе должно "порождать" соответствующие команды принтера, имно.

Чтобы нарисованное на канвасе хранилось, следует использовать Canvas TBitmap-а. Но тут наверняка будут свои проблемы в связи с разными характеристиками его канваса и канваса принтера.

З.Ы. Проще выполнить процедуру рисования дважды с разным отступом по вертикальной оси


 
Джо ©   (2005-07-28 03:03) [14]


>  [12] Vasian ©   (28.07.05 02:12)

Если на принтер, то рисовать лучше всего на канве метафайла (TMetafileCanvas), как я и советовал в [4]. Потому какЮ возможно, придется делать StretchDraw.


 
Джо ©   (2005-07-28 03:10) [15]


> [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;


 
Vasian ©   (2005-07-28 07:07) [16]


> Чтобы нарисованное на канвасе хранилось

Разве не хранится? Печать то начинается после enddoc.


> З.Ы. Проще выполнить процедуру рисования дважды с разным
> отступом по вертикальной оси

Не, не проще - код большой, захламлять код программы не очень охота.


 
ЮЮ ©   (2005-07-28 07:54) [17]

>Не, не проще - код большой, захламлять код программы не очень охота.

Так ведь не Copy+Paste предлагается, а

Procedure DrawOnCanvas(Canvas: TCanvas; Layout: TPoint)
begin
 здесь, собственно код, учитывающий, что левый-верхний угол задан (Layout)
end;

DrawOnCanvas(Printer.Canvas, Point(0, 0));
DrawOnCanvas(Printer.Canvas, TPoint(0, <вертикальное смещение>));

Сразу заложился и на то, вдруг захочется и горизонтальное смещение :)


 
имя   (2005-07-28 10:39) [18]

Удалено модератором


 
ЮЮ ©   (2005-07-28 10:45) [19]

Товарищи модераторы, разрешите Ивану Пантелееву читать сообщения, а то он всё пишет, пишет ... :)


 
Vasian ©   (2005-07-29 05:41) [20]

Получилось через 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-29 05:43) [21]


>  [20] Vasian ©   (29.07.05 05:41)

Используй GetDeviceCaps для получения различной информации о принтере. Например, количество точек на дюйм, размер печатаемой области и прочее.


 
Vasian ©   (2005-07-29 07:34) [22]


> Джо ©   (29.07.05 05:43) [21]


Спасибо. На примере работает, буду вставлять в исходник проги.



Страницы: 1 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.045 c
4-1119809266
andrew_john
2005-06-26 22:07
2005.08.21
Уменьшение задержки


1-1122705542
Igit
2005-07-30 10:39
2005.08.21
Неправильно читается файл


11-1105541859
Help
2005-01-12 17:57
2005.08.21
Есть аналог Form1.Activate?


1-1122889264
sCORpio80
2005-08-01 13:41
2005.08.21
Вернуть параметр из MDI-Child


14-1122814320
Alexander Panov
2005-07-31 16:52
2005.08.21
просмотр форумов с кпк