Compartir a través de


Impresión mediante la vista previa de impresión (Windows Forms para .NET)

Es habitual en la programación de Windows Forms ofrecer una vista previa de impresión además de los servicios de impresión. Una forma sencilla de agregar servicios de vista previa de impresión a la aplicación es usar un control PrintPreviewDialog en combinación con la lógica de control de eventos de PrintPage para imprimir un archivo.

Para mostrar una vista previa de un documento de texto con un control PrintPreviewDialog

  1. En Visual Studio, use el panel Explorador de soluciones y haga doble clic en el formulario desde el que desea imprimir. Se abre el diseñador visual.

  2. En el panel Cuadro de herramientas, haga doble clic en los componentes PrintDocument y PrintPreviewDialog para agregarlos al formulario.

  3. Agregue un elemento Button al formulario o use un botón que ya esté en el formulario.

  4. En el diseñador visual del formulario, seleccione el botón. En el panel Propiedades, seleccione el botón de filtro Evento y, a continuación, haga doble clic en el evento Click para generar un controlador de eventos.

  5. Debería mostrarse el código de evento Click. Fuera del ámbito del controlador de eventos, agregue dos variables de cadena privadas a la clase denominada documentContents y 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. De nuevo en el código del controlador de eventos Click, establezca la propiedad DocumentName en el documento que quiere imprimir y abra y lea el contenido del documento en la cadena que agregó previamente.

    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. Igual que haría para imprimir el documento, en el controlador de eventos PrintPage , use la propiedad Graphics de la clase PrintPageEventArgs y el contenido del archivo para calcular las líneas por página y representar el contenido del documento. Una vez dibujada cada página, compruebe si es la última página y establezca la propiedad HasMorePages de PrintPageEventArgs como corresponda. El evento PrintPage se produce hasta que HasMorePages es false. Cuando el documento haya terminado de representarse, restablezca la cadena que se va a representar. Además, asegúrese de que el evento PrintPage está asociado con su método de control de eventos.

    Nota

    Si ha implementado la impresión en la aplicación, puede que ya haya completado los pasos 5 y 6.

    En el ejemplo de código siguiente, se usa el controlador de eventos para imprimir el archivo "testPage.txt" con la misma fuente que se usa en el formulario.

    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. Establezca la propiedad Document del control PrintPreviewDialog en el componente PrintDocument del formulario.

    printPreviewDialog1.Document = printDocument1;
    
    PrintPreviewDialog1.Document = PrintDocument1
    
  9. Llame al método ShowDialog en el control PrintPreviewDialog . Tenga en cuenta el código resaltado que se muestra a continuación; normalmente, llamaría a ShowDialog desde el método de control de eventos Click de un botón. Al llamar a ShowDialog se genera el evento PrintPage y la salida se representa en el control PrintPreviewDialog . Cuando el usuario selecciona el icono de impresión del cuadro de diálogo, se vuelve a generar el evento PrintPage y la salida se envía a la impresora en lugar de al cuadro de diálogo de vista previa. Por tanto, la cadena se restablece al final del proceso de representación en el paso 4.

    En el siguiente ejemplo de código se muestra el método de control de eventos Click para un botón del formulario. El método de control de eventos llama a los métodos para leer el documento y mostrar el cuadro de diálogo de vista previa de impresión.

    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
    

Vea también