Форум: "Основная";
Текущий архив: 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