Форум — Ответы     (  К темам )
 ?  Adler: Печать PaintBox->Canvas на принтер (04-03-2003 15:15:22)
Подскажите ответ на:

void __fastcall TMainForm::PrintReport()
{
TPaintBox* Box = new TPaintBox(Application);

// статическа часть рисования (линии, тексты) Box->Canvas->TextOut(),
// Box->Canvas->LineTo();

// динамическая часть вставляется различный текст из базы
Printer()->BeginDoc();
DataModule1->ADOQuery2->First();
while(DataModule1->ADOQuery2->Eof){
if(BoxsHeight<=Printer()->PageHeight){

// Как нарисовать этот паинт бокс

}
else
Printer()->NewPage();

DataModule1->ADOQuery2->Next();
} // end while

Printer()->EndDoc();

}
 Георгий (07-03-2003 14:45:35)
попробуй PaintBox положить на панель (Panel) и написать следующее:

this->Panel1->PaintTo(Printer()->Handle,10,10);

по идее должно напечатать (мне проверить не начем).
 Andrew (10-03-2003 11:34:26)
Немного не совсем по теме, но думаю будет интересно.

Я для отладки печати использую любой PS-принтер. Печатаешь в файл, а потом полученный файл конвертишь Acrobat Distiller'ом в PDF и смотришь Acrobat'ом.
В принципе можно настроить так, что конвертация и показ происходит автоматически.
 Devnvd (10-03-2003 13:05:21)
Для печати рисуйте предварительно в Bitmap. Если рисунок содержит немного элементов, то можно рисовать сразу с помощью Canvas принтера.
void __fastcall TMainForm::PrintReport()
{
TPrinter Prntr = Printer();
Graphics::TBitmap *Box=new Graphics::TBitmap;
//Установите необходимые размеры
Box->Width=...;
Box->Height=...;

// статическа часть рисования (линии, тексты) Box->Canvas->TextOut(),
// Box->Canvas->LineTo();

// динамическая часть вставляется различный текст из базы
Prntr->BeginDoc();
DataModule1->ADOQuery2->First();
while(DataModule1->ADOQuery2->Eof){
if(BoxsHeight<=Prntr->PageHeight){

// Как нарисовать этот паинт бокс
Prntr->Canvas->Draw(x,y,Box);
// Или
Prntr->Canvas->StretchDraw(RectPrinter,Box);
// Или
Prntr->Canvas->CopyRect(RectPrinter,Box->Canvas,RectBitmap);
}
else
Prntr->NewPage();

DataModule1->ADOQuery2->Next();
} // end while

Prntr->EndDoc();

}

Удобнее рисовать предварительно в метафайл, так как он хорошо масштабируется, если фонты использовать TrueType.

void GetMetafile(TMetafile *pMetafile, bool id_emf)
{
TMetafileCanvas *pCanvas=0;
if(pMetafile){ delete pMetafile; pMetafile=0; }
pMetafile = new TMetafile;
pMetafile->Enhanced=id_emf; //WMF или EMF
//Размеры
pMetafile->Width=8300;
pMetafile->Height=4250;

pCanvas = new TMetafileCanvas(pMetafile,0);

// Рисуете с помощью pCanvas
Draw_Box(pCanvas);

if(pCanvas){ delete pCanvas; pCanvas=0; }
}

Напечатать можно также как и битмап

Prntr->Canvas->Draw(x,y,pMetafile);
// Или
Prntr->Canvas->StretchDraw(RectPrinter,pMetafile);