![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вывод содржимого Tcanvc на печать. [D6, D7, WinXP]
алексей с. © (2007-02-13 08:20:00)Здравствуте!
возникла у меня следующая проблема: есть достаточно сложный и грамоздкий алгоритм вывода изображения(линии , круги, ...) на Tcanvs обьекта Timage, мне все это дело теперь надо распечатть. Пошел я таким путем: заминил в коде image1.canvs на printer.canvs , однако это не работает. вопрос подскажите есть ли другие способы печати Tcanvs обьекта Timage. спасибо!
Алексей С. (2007-02-13 22:59:00) [1]Всем спасибо, решил проблему следующим образом (надыбал код с заморского сайта)
Первая процедура - масштабирует и рисует на канве.
Вторая выводит на печать
procedure DrawImage(Canvas: TCanvas; DestRect: TRect; ABitmap: TBitmap);
var
Header, Bits: Pointer;
HeaderSize: DWORD;
BitsSize: DWORD;
begin
GetDIBSizes(ABitmap.Handle, HeaderSize, BitsSize);
Header := AllocMem(HeaderSize);
Bits := AllocMem(BitsSize);
try
GetDIB(ABitmap.Handle, ABitmap.Palette, Header^, Bits^);
StretchDIBits(Canvas.Handle, DestRect.Left, DestRect.Top,
DestRect.Right, DestRect.Bottom,
0, 0, ABitmap.Width, ABitmap.Height, Bits, TBitmapInfo(Header^),
DIB_RGB_COLORS, SRCCOPY);
finally
FreeMem(Header, HeaderSize);
FreeMem(Bits, BitsSize);
end;
end;
procedure PrintImage(Image: TImage; ZoomPercent: Integer);
// if ZoomPercent=100, Image will be printed across the whole page
var
relHeight, relWidth: integer;
begin
Screen.Cursor := crHourglass;
Printer.BeginDoc;
with Image.Picture.Bitmap do
begin
if ((Width / Height) > (Printer.PageWidth / Printer.PageHeight)) then
begin
// Stretch Bitmap to width of PrinterPage
relWidth := Printer.PageWidth;
relHeight := MulDiv(Height, Printer.PageWidth, Width);
end
else
begin
// Stretch Bitmap to height of PrinterPage
relWidth := MulDiv(Width, Printer.PageHeight, Height);
relHeight := Printer.PageHeight;
end;
relWidth := Round(relWidth * ZoomPercent / 100);
relHeight := Round(relHeight * ZoomPercent / 100);
DrawImage(Printer.Canvas, Rect(0, 0, relWidth, relHeight), Image.Picture.Bitmap);
end;
Printer.EndDoc;
Screen.cursor := crDefault;
end;
алексей с. (2007-02-13 10:26:00) [2]спасибо.
RASkov (2007-02-13 10:16:00) [3]> [8] алексей с. (13.02.07 10:09)
http://www.delphimaster.ru/cgi-bin/forum.pl?n=18&id=1171016071
Посмотри последний мой пост, может поможет...
алексей с. (2007-02-13 10:09:00) [4]вот кстати координаты я не масштабировал, думал потумолчанию все проставлено, спасибо, домой приду - попробую...
TRUNK (2007-02-13 10:02:00) [5]
> алексей с. (13.02.07 09:51) [5]
принтер выводит беспорядочныйи набор символов
А координаты промасштабировать не забыл?
> алексей с. (13.02.07 09:54) [6]
а вообще есть ли другой спослб печати, не через обьект Tprinter
Есть. Например, использовать CreateDC, BitBlt.
алексей с. (2007-02-13 09:54:00) [6]а вообще есть ли другой спослб печати, не через обьект Tprinter
алексей с. (2007-02-13 09:51:00) [7]:)
там алгоритм сложный... и на одном из его участков появляется ошибка, принтер выводит беспорядочныйи набор символов, а должен графику. (я просто с сотового, поэтому и ошибок много :)
)
TRUNK (2007-02-13 09:44:00) [8]А поподробнее, что именно происходит? Принтер печатает пустой лист или даже не пытается?
evvcom (2007-02-13 09:42:00) [9]> [2] алексей с. (13.02.07 09:39)
> относительно этого все было сдела правильно.....
Судя по твоим "Tcanvs" и "сдела", очень сомневаюсь. Думаю, ты чего-то опять недописал. :)
алексей с. (2007-02-13 09:39:00) [10]в том то и дело, что нет, относительно этого все было сдела правильно.....
TRUNK (2007-02-13 09:27:00) [11]А про Printer.BeginDoc, Printer.EndDoc не забыл?