Umieszczenie obiektów Label na Image nie sprawi, że będzie je można wydrukować, gdyż po pierwsze Image nie może przejąć kontroli nad żadnym obiektem, gdyż nie posiada własnej powierzchni, po drugie, drukowanie odbywa się na powierzchni typu TCanvas.
Skorzystałeś prawdopodobnie z porady
Drukowanie grafiki, powinieneś więc zauważyć, że grafika z obiektu jest przerysowywana na powierzchnię Canvas drukarki:
Printer()->Canvas->CopyRect(Rect(10, 10, x, y), Bmp->Canvas, Rect(0, 0, Bmp->Width, Bmp->Height));
a to oznacza, że kopiowany jest nie cały obiekt lecz zawartość tegoż obiektu, co więcej kopiowana jest zawartość płótna Canvas tegoż obiektu. Obiekty Label nie dziedziczą klasy TCanvas więc nie można ich drukować tak jak grafiki, ale można pobrać ich zawartość i wydrukować jako tekst na tym samym płótnie co grafikę, ale żeby grafika nie zakryła tekstu, to najpierw wrzucasz na płótno Canvas drukarki grafikę a potem na t samo płótno wrzucasz tekst.
Wyobraź sobie drukowanie na płótnie Canvas drukarki jak malowanie obrazu na zwykłym płótnie (kartce papieru), najpierw malujesz na typ płótnie obraz, a potem umieszczasz na obrazie napis, gdybyś zrobił odwrotnie to zamalowałbyś tekst obrazem.
W dużym uproszczeniu może t wyglądać tak:
- Kod: Zaznacz cały
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Assign(Image1->Picture->Bitmap); // Image musi zawierać bitmapę, jeżeli nie należy dokonać konwersji
Printer()->BeginDoc();
int x = Printer()->PageWidth; // długość strony.
int y = Printer()->PageHeight; // wysokość strony.
int width;
int height;
if((x / Bmp->Width) < (y / Bmp->Height))
{
width = Bmp->Width * ((x / Bmp->Width) + 0.5);
height = Bmp->Height * ((x / Bmp->Width) + 0.5);
}
else
{
height = Bmp->Height * ((y / Bmp->Height) + 0.5);
width = Bmp->Width * ((y / Bmp->Height) + 0.5);
}
Printer()->Canvas->CopyRect(Rect(10, 10, width, height), Bmp->Canvas, Rect(0, 0, Bmp->Width, Bmp->Height)); // <- tutaj Image
Printer()->Canvas->Brush->Style = bsClear; // usuwanie tła spod tekstu - tło przeźroczyste
Printer()->Canvas->TextOut(100, 200, Label1->Caption); // <-- tutaj Label->Caption
Printer()->EndDoc();
delete Bmp;
To jak sobie wypozycjonujesz tekst na grafice zależy w głównej mierze od tego jaki algorytm skalujący i pozycjonujący opracujesz.