Debsbond008 Ответов: 2

Я работаю над одним проектом. VB.NET (windows form) проект. У меня есть форма, и я должен распечатать ее содержимое.


Я создал форму, которая имеет метки, текстовые поля с текстом, PictureBox с изображением, кнопки, DateTimePicker и изображение в качестве фона формы. Я хочу напечатать все эти вещи, то есть форму, кроме кнопок и границы формы.
Я использовал управление PrintDocunt, управление PrintDialog и управление PrintForm.
Элемент управления PrintDocument печатает пустой документ, а элемент управления PrintForm-обрезанную форму с кнопками и границами формы. В результате в документе появились кнопки и границы формы, а picturebox был обрезан, чего я не хочу.

Примечание: *Я использую Visual Studio Community 2017 с базой данных Access 2016.
*VB как язык программирования.
*Использовать контроль использования printform у меня установлен Visual Studio и модули Powerpacks 12.0.
*Приложение не имеет никаких ошибок и/или исключений. Поэтому я не опубликовал полный код.
*Единственная проблема заключается в том, что печать пустого документа и обрезанного документа.

Что я уже пробовал:

- Этот код печатает чистый документ.
Private Sub Print_btn_Click(sender As Object, e As EventArgs) Handles Print_btn.Click
        PrintDialog1.Document = PrintDocument1
        PrintDialog1.PrinterSettings = PrintDocument1.PrinterSettings
        PrintDialog1.AllowSomePages = True

        If PrintDialog1.ShowDialog = DialogResult.OK Then
            PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings
            PrintDocument1.Print()
        End If
    End Sub

- Этот код печатает обрезанный документ с кнопками и рамками формы
Private Sub Print_btn_Click(sender As Object, e As EventArgs) Handles Print_btn.Click
        If PrintDialog1.ShowDialog = DialogResult.OK Then
            PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings
            PrintForm1.Print()
        End If
    End Sub

2 Ответов

Рейтинг:
8

Debsbond008

Я получил решение от идеи OriginalGriff об использовании обработчика для печати документа.Событие printpage и Google.
Шаг 1: получите изображение всей формы.
Шаг 2. Обрезайте сгенерированное изображение и получите изображение клиентской области/ формы без границы.
Шаг 3. Распечатайте Изображение.
Код для кнопки печати и PrintDocument.Событие PrintPage

Private Sub Print_btn_Click(sender As Object, e As EventArgs) Handles Print_btn.Click
        PrintPreviewDialog1.Document = PrintDocument1
        PrintDocument1.OriginAtMargins = False
        AddHandler PrintDocument1.PrintPage, AddressOf PrintDocument1_PrintPage
        PrintPreviewDialog1.ShowDialog()
    End Sub

    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim print_bmp As Bitmap = GetClientareaImage(Me)
        e.Graphics.DrawImage(print_bmp, 0, 0)
    End Sub


Код для получения изображения клиентской области.
**Я использую модули для объявления функций и подсистем, которые требуются глобально для этого проекта..
Module Image_processor

    Public Function GetControlImage(ByVal ctrl As Control) As Bitmap
        Dim ctrl_bmp As New Bitmap(ctrl.Width, ctrl.Height)
        ctrl.DrawToBitmap(ctrl_bmp, New Rectangle(0, 0, ctrl.Width, ctrl.Height))
        Return ctrl_bmp
    End Function

    Public Function GetClientareaImage(ByVal frm As Form) As Bitmap
        Using Cropped_frm As Bitmap = GetControlImage(frm)
            Dim Border As Point = frm.PointToScreen(New Point(0, 0))
            Dim client_x As Integer = Border.X - frm.Left
            Dim client_y As Integer = Border.Y - frm.Top
            Dim client_wd As Integer = frm.ClientSize.Width
            Dim client_ht As Integer = frm.ClientSize.Height

            Dim client_bmp As New Bitmap(client_wd, client_ht)
            Using client_graph As Graphics = Graphics.FromImage(client_bmp)
                client_graph.DrawImage(Cropped_frm, 0, 0, New Rectangle(client_x, client_y, client_wd, client_ht), GraphicsUnit.Pixel)
            End Using
            Return client_bmp
        End Using

    End Function
End Module


Thaks много CodeProject, OriginalGriff и кодеров


Рейтинг:
0

OriginalGriff

Да, это будет - потому что вы не установили обработчик для Объект printdocument.Событие PrintPage (System.Рисование.Печатание)[^] где и происходит фактическая работа по печати содержимого документа.

Ссылка включает в себя базовый пример.


Debsbond008

Спасибо OriginalGriff за ответ. Предоставленная ссылка использует текстовый файл, который уже сохранен в компьютере и печатает текстовый файл. На самом деле я хочу здесь распечатать все компоненты формы такими, какие они есть, за исключением кнопок и границ формы.
Например, если моя форма имеет 4 метки слева, 4 текстовых поля посередине, 1 PictureBox справа и 4 кнопки внизу формы, то все метки, текстовые поля, PictureBox будут напечатаны, кроме 4 кнопок.
**Я не хочу сохранять форму в виде файла и использовать ее для дальнейшей печати.
*Но я понимаю, что для этого мне нужно использовать обработчик PrintPageEvent.