Sdílet prostřednictvím


Tisknout pomocí náhledu

V programování ve Windows Forms je běžné, že kromě tiskových služeb nabízí i náhled tisku. Snadný způsob, jak do aplikace přidat náhled tisku, je použít ovládací prvek v kombinaci s PrintPreviewDialog logikou PrintPage zpracování událostí pro tisk souboru.

Zobrazení náhledu textového dokumentu pomocí ovládacího prvku PrintPreviewDialog

  1. V prostředí Visual Studio použijte podokno Průzkumníka řešení a poklikejte na formulář, z něhož chcete tisknout. Tím se otevře vizuální návrhář.

  2. V podokně panelu nástrojů poklikejte na komponentu i na komponentu a přidejte je do formuláře.

  3. Buď do formuláře přidejte Button, nebo použijte tlačítko, které už je ve formuláři.

  4. V návrháři vizuálu formuláře vyberte tlačítko. V podokně Vlastnosti vyberte tlačítko filtru událostí a poklikáním na událost Click vygenerujte obslužnou rutinu události.

  5. Kód události Click by měl být viditelný. Mimo rozsah obslužné rutiny události přidejte dvě privátní řetězcové proměnné do třídy pojmenované documentContents a stringToPrint.

    // Declare a string to hold the entire document contents.
    private string documentContents="";
    
    // Declare a variable to hold the portion of the document that
    // is not printed.
    private string stringToPrint="";
    
    ' Declare a string to hold the entire document contents.
    Private documentContents As String
    ' Declare a variable to hold the portion of the document that
    ' is not printed.
    Private stringToPrint As String
    
  6. Zpět v kódu obslužné rutiny události Click nastavte vlastnost DocumentName na dokument, který chcete vytisknout, a otevřete a přečtěte obsah dokumentu do řetězce, který jste přidali dříve.

    string docName = "testPage.txt";
    string docPath = @"C:\";
    string fullPath = System.IO.Path.Combine(docPath, docName);
    printDocument1.DocumentName = docName;
    stringToPrint = System.IO.File.ReadAllText(fullPath);
    
    Dim docName As String = "testPage.txt"
    Dim docPath As String = "C:\Users\v-rsatao\Desktop\"
    Dim fullPath As String = System.IO.Path.Combine(docPath, docName)
    
    PrintDocument1.DocumentName = docName
    stringToPrint = System.IO.File.ReadAllText(fullPath)
    
  7. Stejně jako při tisku dokumentu použijte v obslužné rutině události PrintPage vlastnost Graphics třídy PrintPageEventArgs a obsah souboru k výpočtu řádků na stránku a vykreslení obsahu dokumentu. Po nakreslení každé stránky zkontrolujte, zda se jedná o poslední stránku, a nastavte HasMorePages vlastnost PrintPageEventArgs odpovídajícím způsobem. Událost PrintPage se vyvolává, dokud HasMorePages není false. Po dokončení vykreslování dokumentu resetujte řetězec, který se má vykreslit. Také se ujistěte, že událost PrintPage je přidružená k metodě zpracovávání událostí.

    Poznámka:

    Pokud jste v aplikaci implementovali tisk, možná už byly dokončeny kroky 5 a 6.

    V následujícím příkladu kódu se obslužná rutina události používá k tisku souboru "testPage.txt" ve stejném písmu použitém ve formuláři.

    void PrintDocument1_PrintPage(object sender, PrintPageEventArgs e)
    {
        int charactersOnPage = 0;
        int linesPerPage = 0;
    
        // Sets the value of charactersOnPage to the number of characters
        // of stringToPrint that will fit within the bounds of the page.
        e.Graphics.MeasureString(stringToPrint, this.Font,
            e.MarginBounds.Size, StringFormat.GenericTypographic,
            out charactersOnPage, out linesPerPage);
    
        // Draws the string within the bounds of the page.
        e.Graphics.DrawString(stringToPrint, this.Font, Brushes.Black,
        e.MarginBounds, StringFormat.GenericTypographic);
    
        // Remove the portion of the string that has been printed.
        stringToPrint = stringToPrint.Substring(charactersOnPage);
    
        // Check to see if more pages are to be printed.
        e.HasMorePages = (stringToPrint.Length > 0);
    
        // If there are no more pages, reset the string to be printed.
        if (!e.HasMorePages)
            stringToPrint = documentContents;
    }
    
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
    
        Dim charactersOnPage As Integer = 0
        Dim linesPerPage As Integer = 0
    
        ' Sets the value of charactersOnPage to the number of characters 
        ' of stringToPrint that will fit within the bounds of the page.
        e.Graphics.MeasureString(stringToPrint, Me.Font, e.MarginBounds.Size,
            StringFormat.GenericTypographic, charactersOnPage, linesPerPage)
    
        ' Draws the string within the bounds of the page.
        e.Graphics.DrawString(stringToPrint, Me.Font, Brushes.Black,
            e.MarginBounds, StringFormat.GenericTypographic)
    
        ' Remove the portion of the string that has been printed.
        stringToPrint = StringToPrint.Substring(charactersOnPage)
    
        ' Check to see if more pages are to be printed.
        e.HasMorePages = stringToPrint.Length > 0
    
        ' If there are no more pages, reset the string to be printed.
        If Not e.HasMorePages Then
            stringToPrint = documentContents
        End If
    
    End Sub
    
  8. Nastavte vlastnost Document ovládacího prvku PrintPreviewDialog na komponentu PrintDocument ve formuláři.

    printPreviewDialog1.Document = printDocument1;
    
    PrintPreviewDialog1.Document = PrintDocument1
    
  9. Volání metody ShowDialog na ovládacím prvku PrintPreviewDialog. Obvykle byste volali ShowDialog z metody zpracování událostí tlačítka Click. Všimněte si následujícího zvýrazněného kódu. Volání ShowDialog vyvolá událost PrintPage a zobrazí výstup v ovládacím prvku PrintPreviewDialog. Když uživatel vybere ikonu tisku v dialogovém okně, vyvolá se událost PrintPage znovu a odešle výstup do tiskárny místo dialogového okna náhledu. Řetězec se proto resetuje na konci procesu vykreslování v kroku 4.

    Následující příklad kódu ukazuje Click metodu zpracování událostí pro tlačítko ve formuláři. Metoda zpracování událostí volá metody ke čtení dokumentu a zobrazení dialogového okna náhledu tisku.

    private void Button1_Click(object sender, EventArgs e)
    {
        string docName = "testPage.txt";
        string docPath = @"C:\";
        string fullPath = System.IO.Path.Combine(docPath, docName);
        printDocument1.DocumentName = docName;
        stringToPrint = System.IO.File.ReadAllText(fullPath);
    
        printPreviewDialog1.Document = printDocument1;
    
        printPreviewDialog1.ShowDialog();
    }
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
        Dim docName As String = "testPage.txt"
        Dim docPath As String = "C:\Users\v-rsatao\Desktop\"
        Dim fullPath As String = System.IO.Path.Combine(docPath, docName)
    
        PrintDocument1.DocumentName = docName
        stringToPrint = System.IO.File.ReadAllText(fullPath)
    
        PrintPreviewDialog1.Document = PrintDocument1
    
        PrintPreviewDialog1.ShowDialog()
    
    End Sub
    

Viz také