Strona 1 z 1

Drukowanie poważyny problem,z jednoczesnym obrazem i tekstem

Nowy postNapisane: środa, 28 stycznia 2009, 23:48
przez dawiddawido
Witam
Zaczne od of ale trudno :D . Chciałem wszystkich przywitać na forum, oczywiście jest mi znane bo to jest moje kolejne konto na forum, (mam nadzieje żę tym razem adres się nie zmieni :P )

Oki a wracając do tematu.

Mam obiekt typu TImage na którym wyświetlam obraz. Na nim jeszcze dodatkowo mam chyba z 6 TLabel-ów . Używałem porady ze strony cyfrowego barona , ale udaje mi sie tylko wydrukować zawartość TImage.

I teraz moje pytanie, czy da się jakoś zrobic abym mógł wydrukować zawartość Timage i te label-e ?
Jestem skłonny nawet zapisać sobie wcześniej widok tego zestawienia (zawartość image i labelów, ) jako plik bmp , który po wydrukowaniu zostanie usuniety.
pozdro

Re: Drukowanie poważyny problem,z jednoczesnym obrazem i tekstem

Nowy postNapisane: czwartek, 29 stycznia 2009, 10:20
przez Cyfrowy Baron
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.

Re: Drukowanie poważyny problem,z jednoczesnym obrazem i tekstem

Nowy postNapisane: piątek, 30 stycznia 2009, 23:55
przez dawiddawido
A czy da się jakoś zrobić aby textout ustawić przeźroczystość ?

Chodzi mi oczywiście o to aby pod tekstem nie zostawało białe tło. Nie wygląda to zbyt sympatycznie na grafice

Re: Drukowanie poważyny problem,z jednoczesnym obrazem i tekstem

Nowy postNapisane: sobota, 31 stycznia 2009, 13:25
przez Cyfrowy Baron
Masz to przecież podane w przykładowym kodzie. Najpierw usuwasz tło spod tekstu, a potem umieszczasz tekst:

Kod: Zaznacz cały
Printer()->Canvas->Brush->Style = bsClear; // usuwanie tła spod tekstu - tło przeźroczyste
Printer()->Canvas->TextOut(100, 200, Label1->Caption); // <-- tutaj Label->Caption

Re: Drukowanie poważyny problem,z jednoczesnym obrazem i tekstem

Nowy postNapisane: sobota, 31 stycznia 2009, 13:42
przez dawiddawido
Sorry faktycznie
Nie zauważyłem :D

Przyjrzałem się temu i robiłem stąd ten problem , gdybym skopiował pewnie nie było by problemu :P

Wielkie dzięki