Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Stampanje vise strana kroz Graphics u C#

[es] :: .NET :: .NET Desktop razvoj :: Stampanje vise strana kroz Graphics u C#

[ Pregleda: 2052 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

ALGHEN
Beograd / Zlatibor

Član broj: 65866
Poruke: 33
*.smin.sezampro.yu.

Sajt: www.ghc.rs


Profil

icon Stampanje vise strana kroz Graphics u C#02.11.2005. u 15:37 - pre 225 meseci
Stampam kroz Graphics.DrawString i slicno ali nikako ne mogu da izvedem da odstampa vise strana kako treba. Koliko sam shvatio trebalo bi da se to formulise sa bool vrednosti HasMorePages, ali ja jednostavno nikako ne uspevam da kontrolisem to. Ili odstampa jednu stranu, i ne prenese ostatak podataka na drugu ili vise strana, ili stampa jednu istu stranu beskonacno. Negde debelo gresim.



Evo koda, po internetu su sve iste :( :



Code:
public void ThePrintDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs ev)

       {

           float leftMargin = ev.MarginBounds.Left;

           float topMargin = ev.MarginBounds.Top;

           Font printFont = new Font("Arial", 12, FontStyle.Regular);

           SolidBrush brush = new SolidBrush(Color.Black);

           float yPosition = 10;





           // Stampa se podatak iz baze kroz petlju dok ima redova...



           float pozicijaTeksta = leftMargin;

           for (int i = 0; i < ds_print.Tables[0].Rows.Count; i++)

           {

               String tekst = ds_print.Tables[0].Rows/.ItemArray[1].ToString();

               ev.Graphics.DrawString(tekst, printFont, brush, leftMargin, yPosition, new StringFormat());

               yPosition = yPosition + 20;

           }



           // Ovde bi trebalo da se definise da li ima jos strana

           ev.HasMorePages = false;

           brush.Dispose();

       }






Definisanje da li ima jos strana i da to odradi ispravno mi nikako ne polazi za rukom...



Da li neko moze da mi objasni kako da kontrolisem ovo???



Da li treba da racunam stalno visinun graphics-a, pa ako prelazi PageBounds da toznaci da ide na sledecu, ali ni to nisam uspeo da uradim...



Molim za bilo kakvu pomoc!



Unapred hvala...



[Ovu poruku je menjao ALGHEN dana 03.11.2005. u 00:44 GMT+1]
 
Odgovor na temu

Oliver Klaćik
Vice President, Thunder Road Software
Inc.
Stara Pazova

Član broj: 34059
Poruke: 242
80.93.231.*

Sajt: www.thunderroadsoftware.c..


Profil

icon Re: Stampanje vise strana kroz Graphics u C#02.11.2005. u 18:41 - pre 225 meseci
Evo ti citat iz knjige "Razvoj Windows aplikacija".

Citat:
Da biste odštampali grafiku koja ima više strana, morate ručno da podelite posao na strane i implementirate odgovarajuću logiku. Na primer, sledeći metod koristi dve strane za crtanje elipse koja je dva puta duža od strane:


Code:
 bool FirstPagePrinted = false;
// This method must handle the PrintPage event
public void PrintBigEllipse(object sender, 
   System.Drawing.Printing.PrintPageEventArgs e)
{
   if (FirstPagePrinted == false)
   {
      FirstPagePrinted = true;
      e.HasMorePages = true;
      e.Graphics.DrawEllipse(Pens.Black, new Rectangle(0, 0, 
         e.PageBounds.Width, e.PageBounds.Height * 2));
   }
   else
   {
      e.HasMorePages = false;
      FirstPagePrinted = false;
      e.Graphics.DrawEllipse(Pens.Black, new Rectangle(0, 
         -(e.PageBounds.Height), e.PageBounds.Width, 
         e.PageBounds.Height * 2));
   }


Citat:
U ovom primeru korišćenja je promenljiva FirstPagePrinted koja prati da li je u toku štampanje prve ili druge strane. Obratite pažnju na to da je ova promenljiva deklarisana izvan metoda. Da smo je deklarisali unutar metoda, ponovo bi se inicijalizovala pri svakom izvršavanju metoda, tako da bi uvek imala vrednost false. Dok program štampa stranu po stranu, on svaki put ponovo crta sliku, menjajuću poziciju pravougaonika elipse kako bi pravilno orijentisao elipsu preko obe strane.


Nadam se da ti je ovo pomoglo...
Oliver 'FAQ' Klaćik
 
Odgovor na temu

ALGHEN
Beograd / Zlatibor

Član broj: 65866
Poruke: 33
*.smin.sezampro.yu.

Sajt: www.ghc.rs


Profil

icon Re: Stampanje vise strana kroz Graphics u C#02.11.2005. u 22:39 - pre 225 meseci
Hvala Olivere...

Evo sta sam resio, ako bi me neko pitao kako, ne bih znao da mu objasnim:

Code:

        public void PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            pen = new Pen(this.pBrush);
                int jedan_red_visine = (int)e.Graphics.MeasureString("String", pFont).Height;
            ukupna_visina = jedan_red_visine * ukupno_redova;
            int ukupno_strana = (ukupna_visina / e.PageBounds.Height)+1;
            visina_stringa = (int)e.Graphics.MeasureString("String", pFont).Height;
            int prvi_red = Form1.red;
            int poslednji_red = Form1.red + 50;

            if ((trenutna_strana <= ukupno_strana) && (poslednji_red<ukupno_redova))
            {
                for (red = prvi_red; red < poslednji_red; red++)
                {
                    e.Graphics.DrawRectangle(pen, 1, 5, 500, 10);
                    if (red < ukupno_redova)
                    {
                        e.Graphics.DrawString(red.ToString() + ". " + ds_print.Tables[0].Rows[red].ItemArray[1].ToString(), pFont, pBrush, new PointF(0, visina_stringa));
                        visina_stringa = visina_stringa + jedan_red_visine;
                    }
                    Form1.red = red;
                }
                ukupna_visina = ukupna_visina + jedan_red_visine;
                trenutna_strana++;
                FirstPagePrinted = true;
                e.HasMorePages = true;
            }
            else
            {
                for (red = prvi_red; red < poslednji_red; red++)
                {
                    if (red < ukupno_redova)
                    {
                        e.Graphics.DrawString(red.ToString() + ". " + ds_print.Tables[0].Rows[red].ItemArray[1].ToString(), pFont, pBrush, new PointF(0, visina_stringa));
                        visina_stringa = visina_stringa + jedan_red_visine;
                    }
                    Form1.red = red;
                }
                ukupna_visina = ukupna_visina + jedan_red_visine;
                trenutna_strana++;
                FirstPagePrinted = true;
                e.HasMorePages = false;
            }

            prvi_red = prvi_red + 50;
            Form1.red = prvi_red;
        }


Morao sam da se lomim sa "drzanjem" odredjenog reda, da bi znao odakle treba da nastavi da stampa, jer sam imao veliki problem sto mi je stampao uvek od pocetka na svakoj strani.
Onda sam morao da proveravam dal je trenutni red manji ili jednak broju reda u DataSet-u, jer ako predje preko, "puche" program...
Itd, itd,...

Evo i koda mog mucenickog, pa ako nekome koristi...

Hvala Oliveru jos jedanput na pomoci, dovoljno mi je bilo da produzim...



[Ovu poruku je menjao ALGHEN dana 03.11.2005. u 00:44 GMT+1]
 
Odgovor na temu

Oliver Klaćik
Vice President, Thunder Road Software
Inc.
Stara Pazova

Član broj: 34059
Poruke: 242
80.93.231.*

Sajt: www.thunderroadsoftware.c..


Profil

icon Re: Stampanje vise strana kroz Graphics u C#03.11.2005. u 08:45 - pre 225 meseci
Nema na čemu. Tu smo da bi pomagali jedni drugima...
Oliver 'FAQ' Klaćik
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
*.telekom.yu.



+104 Profil

icon Re: Stampanje vise strana kroz Graphics u C#15.06.2007. u 19:20 - pre 205 meseci
Jeste da kasno odgovaram na temu, ali posle malo mučenja našao sam "bolje" rešenje pa da podelim to sa drugima.

Moj problem je što imam dosta objekata, linija, slika i sl. da odštampam, tako da mi se od gore predloženo rešenja dizala kosa na glavi (ko će ceo kod da prepravlja).

Princip kako odštampati neku komplikovanu grafiku na nekoliko strana je sledeći:

1. iscrtati kompletnu sliku kao da se radi o jednoj veeeeelikoj strani
2. Štampati 1. stranu i postaviti HasMorePages na True
3. Pošto se ista procedura poziva za 2 stranu ponovo iscrtati kompletnu sliku kao da se radi o velikoj strani
4. Pomeriti iscrtanu sliku za dimenziju jedne strane i po potrebi postaviti HasMorePages na True ....
5. ponoviti korake 3 i 4

Kao što primećujete ovde je problem što se za svaku stranu iscrtava cela slika opet, ali i to se može rešiti sa nekim buffer-om.

U prilogu je deo koda koji koristim za pomeranje grafike. Za sad sam samo stavio da se pomera po horizontali, pa vi dodajte ostatak ako vam je hitno. Kad završim ceo kod postaviću kompletno rešenje.

Code:

dim _PrinterCurrentPage as integer
Private Sub PreviewPrint()
        Try
            Dim PrintSettings As New PrintDialog
            PrintSettings.Document = _PrintDocument
            PrintSettings.ShowDialog()
            _PrinterCurrentPage = 1
            Dim printPreviewDialog1 As New PrintPreviewDialog()
            printPreviewDialog1.Document = _PrintDocument
            printPreviewDialog1.FormBorderStyle = FormBorderStyle.Fixed3D
            printPreviewDialog1.ShowDialog()
        Catch exp As Exception
            System.Console.WriteLine(exp.Message.ToString())
        End Try
    End Sub

    Private Sub _PrintDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles _PrintDocument.PrintPage


        Dim m As New Drawing2D.Matrix
        m.Translate(-1 * e.PageSettings.PrintableArea.Width * (_PrinterCurrentPage - 1), 1)  ' pomeramo sliku za širinu jedne strane
        e.Graphics.Transform = m

' Iscrtava kompletnu sliku
        Draw(e.Graphics)

' stavljeno da dokument ima fiksno 10 strana
        If _PrinterCurrentPage < 10 Then
            e.HasMorePages = True
            _PrinterCurrentPage += 1
        Else
' ovo mora da se stavi na 1 jer kad iz printpreview prozora kliknete na štampu ponovo se poziva ova procedura
'  i ako ne stavite da se "nalazite" na 1. strani odštampaće samo jednu stranu
            _PrinterCurrentPage = 1
        End If
    End Sub

Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Stampanje vise strana kroz Graphics u C#

[ Pregleda: 2052 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.