Tisk na jeden klik   otázka

VB.NET, WinForms, Tisk

Dobrý den.

poradil by prosím někdo zkušenější jak vyřešit problém s tiskem grafiky ? Mám hotovou jednoduchou aplikaci ve VB 2005 která kreslí grafické obrazce na PictureBox. Vše funguje bezva jen nyní nastal zádrhel. Přidal jsem btnPrint a potřeboval bych docílit toho aby po kliknutí na něj, došlo k "sejmutí" grafiky která se právě nachází v Pictureboxu a bez jakéhokoliv ptaní došlo rovnou k jejímu vytištění na default nastavené tiskárně.

Neumím si poradit hlavně s tím jak sejmout tu grafiku a poslat ji na tiskárnu.

Díky moc za jakoukoliv radu nebo nasměrování.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Tisk se na platformě .NET realizuje stejně jako vykreslování jakékoliv jiné grafiky - pomocí objektu System.Drawing.Graphics. K samotnému tisku slouží komponenta System.Drawing.Printing.PrintDocument. Je nutné nastudovat alespoň základní použití těchto objektů, jinak nemá cenu se o cokoliv snažit.

http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Pane, díky moc za link a vysvětlení jak to s tiskem grafiky funguje.

Komponentu PrintDocument jsem v Toolboxu našel, jen mě napoprvé zmátlo to slovo Document v názvu.

Jen ještě drobnost, chápu to s tím vykreslováním do "e vrstvy tisku" jen šlo by i nějak zařídit když už ta vektorová grafika je zobrazena na Pictureboxu (řekněme 5 různých trojúhelníků) sejmout ji jako celek (třeba jako bitmapu) a to potom tisknout zase jako celek? např. s roztažením na celý formát papíru (A4)

Nebo je nutné vše "znovu vykreslit" s tím, že se to jakoby jen nasměruje místo na PictureBox na "e.Printer vrstvu"?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ta grafika není vektorová, ale bitmapová - založená na grafickém subsystému GDI+ (nativně vykreslovat vektorovou grafiku dokáže pouze WPF). Na tiskárnu můžete obsah PictureBoxu vykreslit velmi jednoduše. Na objekt Graphics od tiskárny vykreslíte pomocí e.Graphics.DrawImage obrázek PictureBoxu (který představuje vlastnost Image). Ten můžete jednou z přetížených verzí metody DrawImage vykreslit tak, aby byl roztažen přes celou stránku (po zadání výšky a šířky bude roztažen automaticky). Pokud chcete zachovat jeho původní velikost bez deformace, použijete DrawImageUnscaled.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

To je přesně to co jsem potřeboval. Díky moc !

Ano, máte pravdu, grafika je bitmapová.

Tisk na tiskárnu mi už funguje, jen mám ještě potíž s tím jak sejmout grafiku kterou kreslím v PictureBox1_Paint.

Pro lepší názornost přiložím kousek kódu:

Dim ElipsaVisible As Boolean = False
    Dim ccc As Image
    
    '--- vznikl požadavek vykreslit elipsu ---
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ElipsaVisible = True
        Me.Refresh()
    End Sub

    '--- vlastní vykreslení elipsy na PictureBox ---
    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        If ElipsaVisible = True Then e.Graphics.DrawEllipse(Pens.Red, 50, 50, 100, 50)
    End Sub

    '--- vznikl požadavek vytisknout obsah Pictureboxu ---
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        '--- tohle sice projde ale při tisku vyskočí chybové hlášení že ccc = NULL ---
        'ccc = Me.PictureBox1.Image

        '--- když použiji tuto konstrukci, tak se vytisknou pruhy což je ok ale chybí ta elipsa ---
        Dim flag As New Bitmap(200, 100)
        Dim flagGraphics As Graphics = Graphics.FromImage(flag)
        Dim red As Integer = 0
        Dim white As Integer = 11
        While white <= 100
            flagGraphics.FillRectangle(Brushes.Red, 0, red, 200, 10)
            flagGraphics.FillRectangle(Brushes.White, 0, white, 200, 10)
            red += 20
            white += 20
        End While
        PictureBox1.Image = flag

        ccc = flag

        '--- spustit tisk ---
        Me.PrintDocument1.Print()

    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        e.Graphics.DrawImage(ccc, 100, 100)
    End Sub

Nemůžu přijít na to proč se mi ta elipsa ztratí při tisku.

Asi je to hloupost ale pořád mi v tom ještě něco uniká.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Elipsa není součástí obrázku, který tisknete. Buď ji tam musíte vykreslit po nakreslení "vlajky" anebo přidat vlajku v Paint PictureBox s podmínkou, že obrázek vlajky již je vykreslený

e.Graphics.DrawImage(ccc, 0, 0)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback