Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Вниз

как правильно создать виртуальную канву (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.036 c
1-1122841454
ronyn
2005-08-01 00:24
2005.08.21
Табуляция из одного Edit в другой


14-1122483433
Димаска
2005-07-27 20:57
2005.08.21
IRC в E-Mule


14-1122408089
MailMan
2005-07-27 00:01
2005.08.21
Пирамиды которые строят сверху вниз


1-1122550878
Priest
2005-07-28 15:41
2005.08.21
Как сменить фон для неактивного OLEConteiner


3-1121240176
Uran
2005-07-13 11:36
2005.08.21
Как скопировать строку в ADOQuery?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский