none
Verzweifelter Versuch, eine Druckausgabe zu realisieren...wer kann helfen?? RRS feed

  • Frage

  • Hallo,

    ich habe vor ca. 10 Jahren eine grafische Sonder-Applikation in VB6 geschrieben und muss diese nun erneuern - in vb.net 2013.

    Da ich mich noch sehr schwer tue, was den Umstieg von VB6 angeht, hoffe ich auf eine kurze und einfache Hilfestellung bei der Vervollständigung eines Druckbefehls. Ich blicke da wirklich nicht durch - auch nach stundenlangem Herumprobieren. <<schäm>>

    Folgende Codezeilen habe ich aus einem Beispiel übernommen, um überhaupt annähernd zu verstehen, wie es funktionieren könnte:

        Public WithEvents mDoc As New PrintDocument()
        Public mFont As New Font("Courier New", 12)
    
        Public Sub PictureBoxPreviewAndPrint_Click(sender As Object, e As EventArgs) Handles PictureBoxPreviewAndPrint.Click
            Call mDoc_PrintPage(Me, )
        End Sub
    
        Public Sub mDoc_PrintPage(ByVal sender As Object, _
         ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
         Handles mDoc.PrintPage
            Dim xPos As Single = e.MarginBounds.Left
            Dim yPos As Single = e.MarginBounds.Top
            Dim lineHeight As Single = mFont.GetHeight(e.Graphics)
    
            With e.Graphics
                .DrawString("This is a test", _
               mFont, Brushes.Black, xPos, yPos)
                yPos += lineHeight
                .DrawString("This is another test", _
               mFont, Brushes.Black, xPos, yPos)
                xPos += .MeasureString("This is another test", mFont).Width
                .DrawString("Here's some more text", _
               mFont, Brushes.Black, xPos, yPos)
                xPos = e.MarginBounds.Left
            End With
    
            Dim psdlg As New PageSetupDialog()
            psdlg.Document = mDoc
            psdlg.ShowDialog()
    
            Dim prprvdlg As New PrintPreviewDialog()
            prprvdlg.Document = mDoc
            prprvdlg.WindowState = FormWindowState.Maximized
            prprvdlg.ShowDialog()
    
            Dim prdlg As New PrintDialog()
            prdlg.Document = mDoc
            If prdlg.ShowDialog = DialogResult.OK Then
                mDoc.Print()
            End If
        End Sub
    

    Ich verstehe einfach nicht, welches Argument für 'ByVal e As System.Drawing.Printing.PrintPageEventArgs' ich beim Aufrufen des Subs mDoc.PrintPage angeben muss:

    Call mDoc_PrintPage(Me, ????? )

    Wenn mir das irgend jemand kurz begreiflich machen könnte, wäre ich seeeeehr dankbar!!

    Samstag, 9. November 2013 19:27

Antworten

  • Den PrintPage-Handler muss man nicht aufrufen. Es würde im Normalfall auch nicht viel bringen. Sobald du mDoc.Print() aufrufst, wird der PrintPage-Handler automatisch ausgeführt. Das wäre dann der letzte Schritt von 2.
    Das Dokument (mDoc) enthält auch die eingestellten Druckerdaten usw. Darum brauchst du dich also auch nicht kümmern.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Samstag, 9. November 2013 20:38
    Moderator

Alle Antworten

  • Hallo,
    das Drucken ist eigentlich garnicht so schwer ;)

    Die PrintPageEventArgs haben eine Eigenschaft Graphics. Das Graphics-Objekt kannst du bemalen. Beispielsweise mittels DrawString oder FillRectangle. Gucke einfach mal die Liste in IntelliSense oder hier durch.
    Alles was du zeichnest wird anschließend mit ausgedruckt.

    Hier noch ein kleines Beispiel dazu:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'Normalerweise ein Button-Klick-Event o.ä.
            'Alternativ mit dem PrintPreviewDialog machen
            PrintDialog1.Document = PrintDocument1 'Dokument zuweisen
            If PrintDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then 'Setup-Dialog anzeigen
                PrintDocument1.Print() 'Dokument drucken
            End If
    
        End Sub
    
        Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            'Ausdruck zeichnen
            e.Graphics.DrawString("String", SystemFonts.CaptionFont, Brushes.AliceBlue, New PointF(50, 50))
        End Sub


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Samstag, 9. November 2013 19:53
    Moderator
  • Hi Koopakiller,

    erst einmal vielen Dank für die turboschnelle Antwort!! Verstehen tu ich das aber leider immer noch nicht.

    Kurze Erläuterung meinerseits, wie ich den Codeaufbau verstanden habe:

    1.) Neues Drucker-Dokument erzeugen:

         Public WithEvents mDoc As New PrintDocument()

    2.) Sub zum Erzeugen aller Grafiken und Texte, die ausgedruckt werden sollen:

     Public Sub mDoc_PrintPage(ByVal sender As Object, _
        
    ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
        
    Handles mDoc.PrintPage
           
    Dim xPos As Single = e.MarginBounds.Left
           
    Dim yPos As Single = e.MarginBounds.Top
           
    Dim lineHeight As Single = mFont.GetHeight(e.Graphics)

           
    With e.Graphics
               
    .DrawString("This is a test", _
               mFont
    , Brushes.Black, xPos, yPos)
                yPos
    += lineHeight
               
    .DrawString("This is another test", _
               mFont
    , Brushes.Black, xPos, yPos)
                xPos
    += .MeasureString("This is another test", mFont).Width
               
    .DrawString("Here's some more text", _
               mFont
    , Brushes.Black, xPos, yPos)
                xPos
    = e.MarginBounds.Left
           
    End With

    ==> Anzeigen des SeitenSetupDialoges:
           
    Dim psdlg As New PageSetupDialog()
            psdlg
    .Document = mDoc
            psdlg
    .ShowDialog()

    ==> Anzeigen des Vorschaudialoges:

            Dim prprvdlg As New PrintPreviewDialog()
            prprvdlg
    .Document = mDoc
            prprvdlg
    .WindowState = FormWindowState.Maximized
            prprvdlg
    .ShowDialog()

    ==> Anzeigen des DruckDialoges:

            Dim prdlg As New PrintDialog()
            prdlg
    .Document = mDoc
           
    If prdlg.ShowDialog = DialogResult.OK Then
                mDoc
    .Print()
           
    End If
       
    End Sub

    3.) Aufrufen des Sub zum Drucken nach Betätigung eines Buttons:

    PublicSubPictureBoxPreviewAndPrint_Click(sender AsObject, e AsEventArgs) HandlesPictureBoxPreviewAndPrint.Click

    CallmDoc_PrintPage(Me, )  ===> Was muss ich hier für das Argument 'e' angeben????

    End Sub

    So langsam glaube ich, ich bin blöd, aber ich bekomm's nicht raus :o(

    Samstag, 9. November 2013 20:30
  • Den PrintPage-Handler muss man nicht aufrufen. Es würde im Normalfall auch nicht viel bringen. Sobald du mDoc.Print() aufrufst, wird der PrintPage-Handler automatisch ausgeführt. Das wäre dann der letzte Schritt von 2.
    Das Dokument (mDoc) enthält auch die eingestellten Druckerdaten usw. Darum brauchst du dich also auch nicht kümmern.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Samstag, 9. November 2013 20:38
    Moderator
  • OMG!! Na, darauf wäre ich auch nach einer Woche Herumprobieren nicht gekommen - DANKE für den Tipp!!

    Samstag, 9. November 2013 20:55