Podgląd wydruku

0

Witam,
Przeglądnąłem forum, temat się pojawił kilkakrotnie ale niestety nadal nie znalazlem odpowiedzi na pytanie. W jaki sposób zrobić podgląd wydruku w C++ Builder bez używania płatnych komponentów. Drukowanie realizuję w ten sposób:

        Printer()->Canvas->TextOutA(k1+10,mTop,"Data zak.");
        k1 += Printer()->Canvas->TextWidth("2007-01-01")+mLeft+20;
//7 linia
        Printer()->Canvas->MoveTo(k1,mTop);
        Printer()->Canvas->LineTo(k1,mBottom);

Jest to przykładowy kod drukowania, teraz chce zrobic podgląd... jeśli rysuje to samo na formie to jest za duże. To już wiem że chodzi o to że drukarka ma większe GDI. Moje pytanie: jak to zrealizować żeby na formie lub jakimś innym komponencie położonym na formie dało się zrobić proporcjonalny podgląd? Który będzie odzwierciedlał rozłożenie tekstu na kartce. Przepraszam za lamerstwo, ale drukowanie w c++ realizuje poraz pierwszy.

Głównie chodzi mi o to żebym po płótnie mógł rysować tak samo jak po płutnie drukarki a proporcje żeby były zachowane.

0

Sprawa raczej prosta - musisz odpowiednio przeskalowac to co rysujesz po Canvasie podgladu. Poczytaj o DPI, LOGPIXELX, LOGPIXELY

0

Jeżeli rysujesz na TImage to Image1->Proportional=true zrobi przeskalowanie z Ciebie (ale tylko do podglądu). Jeżeli zamierzasz edytować to przeskaluj sam

0

Świetnie o to mi chodziło

Image1->Propotional = true; 

Możesz mi napisać jeszcze proszę w jaki sposób zrobić zoom do tego? Chodzi o to żeby było troszke mniejsze np.

0

Proportional jest do tego żeby rozmiar bitmapy dostosował się do rozmiaru Obrazka widocznego na formie. Więc zmniejszyć możesz np. Image1->Width-=20; lub Image1->Height-=20;. Ale pamiętaj że bitmapę tylko widać w pomniejszeniu, w rzeczywistości jest dalej taka wielka. Możesz się o tym przekonać np. zapisując ją do pliku.

0

Dalej mam jednak problem z tym drukowaniem... Image przyjmuje za dużą szerokość;/ a jeśli szerokość zmieniam tak jak wyżej to mi ucina częśc tego co ma namalować.

Tak wygląda drukowanie na drukarce: (jak zrobić podgląd do tego?:/)

mLeft = 15;
mTop = 15;
mBottom = Printer()->PageHeight;
mRight = Printer()->PageWidth;
wiersz = mTop;
int k1 = mLeft;
mBottom = (Printer()->Canvas->TextHeight("AAA") + 20) *(Form1->ListView1->Items->Count+1);
Printer()->BeginDoc();
//1 linia
        Printer()->Canvas->MoveTo(mLeft,mTop);
        Printer()->Canvas->LineTo(mLeft,mBottom);
// I kolumna L.Dz.
        kolumna[0] = k1+10;
        Printer()->Canvas->TextOutA(k1+10,mTop,"L.dz.");
        k1 += Printer()->Canvas->TextWidth("D-III-5500-0000/07/MK")+mLeft+20;
//2 linia
        Printer()->Canvas->MoveTo(k1,mTop);
        Printer()->Canvas->LineTo(k1,mBottom);
// II kolumna RSD
        kolumna[1] = k1+10;
        Printer()->Canvas->TextOutA(k1+10,mTop,"RSD");
        k1 += Printer()->Canvas->TextWidth("0000/07")+mLeft+20;
//3 linia
        Printer()->Canvas->MoveTo(k1,mTop);
        Printer()->Canvas->LineTo(k1,mBottom);
// III kolumna Ds
        kolumna[2] = k1+10;
        Printer()->Canvas->TextOutA(k1+10,mTop,"Ds");
        k1 += Printer()->Canvas->TextWidth("1Ds.0000/07")+mLeft+20;
//4 linia
        Printer()->Canvas->MoveTo(k1,mTop);
        Printer()->Canvas->LineTo(k1,mBottom);
// IV kolumna SC
        kolumna[3] = k1+10;
        Printer()->Canvas->TextOutA(k1+10,mTop,"SC");
        k1 += Printer()->Canvas->TextWidth("0000/07")+mLeft+20;
//5 linia
        Printer()->Canvas->MoveTo(k1,mTop);
        Printer()->Canvas->LineTo(k1,mBottom);
// V kolumna Data wszczęscia
        kolumna[4] = k1+10;
        Printer()->Canvas->TextOutA(k1+10,mTop,"Data wsz.");
        k1 += Printer()->Canvas->TextWidth("2007-01-01")+mLeft+20;
//6 linia
        Printer()->Canvas->MoveTo(k1,mTop);
        Printer()->Canvas->LineTo(k1,mBottom);
// VI kolumna Data zakończenia
        kolumna[5] = k1+10;
        Printer()->Canvas->TextOutA(k1+10,mTop,"Data zak.");
        k1 += Printer()->Canvas->TextWidth("2007-01-01")+mLeft+20;
//7 linia
        Printer()->Canvas->MoveTo(k1,mTop);
        Printer()->Canvas->LineTo(k1,mBottom);

// VII kolumna Dane prowadzącego
        kolumna[6] = k1+10;
        Printer()->Canvas->TextOutA(k1+10,mTop,"Dane prowadzącego");

        // obliczanie pozostałego miejsca
                 int tmp = (Printer()->PageWidth - k1) / 2;
        k1 += tmp;
//8 linia
        Printer()->Canvas->MoveTo(k1,mTop);
        Printer()->Canvas->LineTo(k1,mBottom);
// VIII kolumna Sposób zakończenia
        kolumna[7] = k1+10;
        Printer()->Canvas->TextOutA(k1+10,mTop,"Sposób zakończenia");
        k1 += tmp - 25;
//9 linia
        Printer()->Canvas->MoveTo(mRight,mTop);
        Printer()->Canvas->LineTo(mRight,mBottom);
// koniec nagłówków kolumn
wiersz += Printer()->Canvas->TextHeight("AAA") +10;
//linia pozioma
        Printer()->Canvas->MoveTo(mLeft, wiersz);
        Printer()->Canvas->LineTo(mRight,wiersz);
        wiersz+=10;
0
wojtekkk napisał(a)

Image przyjmuje za dużą szerokość;

Image, czy Bitmap? Bitmap nie ma prawa Ci nic uciąć, może jedynie zakryć!

0

Image jest za szeroki... tzn inaczej, jak przypiszę do

Image->Width = Printer()->PageWidth;

to jest za szerokie bo się GDI nie zgadza z tego co gdzies wyczytałem, a kiedy obliczę wg

float XD=GetDeviceCaps(Printer()->Handle,LOGPIXELSX)/25.4*(zoom/100.0);

i wtedy ustawię rozmiar podglądu to czcionka prawdopodobnie jest nie proporcjonalna bp szerokosc kilku kolumn jest ustalana wg szerokości tekstu ktory tam sie znajdzie, może napiszcie mi jak ustawić rozmiar czionki proporcjonalnie do rozmiaru na drukarce? dzięki za dotychczasowe posty;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1