Этот код выводит пустую страницу:
if (dlgPrint->Execute())
{
TPrinter *Prntr=Printer();
Prntr->BeginDoc();
Prntr->Canvas->Draw(0,0,(TGraphic*)GetFormImage());
Prntr->EndDoc();
}
Этот код так же печатает пустую страницу:
if (dlgPrint->Execute())
{
TPrinter *Prntr=Printer();
Prntr->BeginDoc();
Image2->Picture->Assign(GetFormImage());
Prntr->Canvas->Draw(0,0,Image2->Picture->Graphic);
Prntr->EndDoc();
}
Этот код работает

, печатает форму!:
if (dlgPrint->Execute())
{
TPrinter *Prntr=Printer();
Prntr->BeginDoc();
Form1->PaintTo(Prntr->Handle, 0, 0);
Prntr->EndDoc();
}
Но непонятно, как картинку формы растягивать на весь лист?
Нашел
пример, приведенный
Devnvd, но там так же печатается пустая страница (C++ Builder 5.0, OS Windows XP Servise Pack 3):
HDC hdcPRN;
TRect r;
int cxPix,cyPix,csxPix,csyPix;
if(!PrintDialog1->Execute())return;
TPrinter *pPrinter = Printer();
//Далее растянем рисунок на страничку с сохранением
//пропорций
hdcPRN=pPrinter->Handle;
cxPix=GetDeviceCaps(hdcPRN,HORZRES);
cyPix=GetDeviceCaps(hdcPRN,VERTRES);
csxPix=GetDeviceCaps(Canvas->Handle,HORZRES);
csyPix=GetDeviceCaps(Canvas->Handle,VERTRES);
r.Left=0; r.Top=0;
r.Right=cxPix*ClientWidth/csxPix;
r.Bottom=r.Right*ClientHeight/ClientWidth;
if(r.Bottom >=cyPix)
{
r.Bottom=cyPix*ClientHeight/csyPix;
r.Right=r.Bottom*ClientWidth/ClientHeight;
}
pPrinter->BeginDoc(); //стартуем печать
//Получим картинку формы
Graphics::TBitmap *FormImage = GetFormImage();
//рисуем на принтер свою картинку
pPrinter->Canvas->StretchDraw(r,FormImage); //Если поставить вместо "FormImage" - "Image1->Picture->Graphic" - работет. В чем причина?
//Удаляем картинку
delete FormImage;
//Заканчиваем печать
pPrinter->EndDoc();
Интерсно, что
BitBlt работате, а
StretchBlt нет.
//BitBlt - работает
BitBlt(Prntr->Canvas->Handle, 0, 0,Form1->Width, Form1->Height, GetWindowDC(Form1->Handle), 0, 0, SRCCOPY);
//StretchBlt - не работает
StretchBlt(Prntr->Canvas->Handle,0,0,1024,768,GetWindowDC(Form1->Handle),0,0,Form1->ClientWidth,Form1->ClientHeight,SRCCOPY);