Dave the Golfer Ответов: 3

Как масштабировать форму, чтобы она соответствовала размеру бумаги формата А4 для печати


В моем приложении у меня есть несколько оконных форм, которые нужно распечатать.
У всех конечных пользователей есть экраны разного размера, самый низкий из которых-1366 x 768.
Я попробовал использовать PrintForm, но программа печатает только то, что находится на экране, поэтому формы должны быть маленькими и поэтому заполнять только часть листа формата А4.
Поэтому я хочу иметь возможность захватить форму и масштабировать ее до формата А4 для печати.
Я скопировал некоторый код из интернета и изменил его для своего использования, но он, похоже, не масштабирует форму, хотя и печатает ее.
Есть ли у кого-нибудь идеи, как я могу это сделать?

Пожалуйста, имейте в виду, что я полный дилетант в этом деле. Производство программного обеспечения для секции пожилых людей гольф-клуба.

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

Код, который я использую, выглядит следующим образом

Public Class TeamSelect12
    'Define your print object
    Private PrintDoc1 As PrintDocument = New PrintDocument
    Private PrintPreviewDialog1 As PrintPreviewDialog = New PrintPreviewDialog
    Private PageSetupDialog1 As PageSetupDialog = New PageSetupDialog

    'Print Button Code
    Private Sub PrtTSBut_Click(sender As System.Object, e As System.EventArgs) Handles PrtTSBut.Click

        PDFTeamBut.Visible = False 'Hides button
        PrtTSBut.Visible = False 'Hides button
        Me.Refresh()

        With PageSetupDialog1
            'Assign the document to use
            .Document = PrintDoc1
            'Enable printer button
            .AllowPrinter = True
            .EnableMetric = True
            ' Initialize the dialog's PrinterSettings property to hold user
            ' defined page settings.
            .PageSettings = New System.Drawing.Printing.PageSettings
            ' Initialize dialog's PrinterSettings property to hold user
            ' set printer settings.
            .PrinterSettings = New System.Drawing.Printing.PrinterSettings
        End With

        PrintPreviewDialog1.Document = PrintDoc1
        AddHandler PrintDoc1.PrintPage, AddressOf PDoc_PrintPage
        Dim margins As New Margins(20, 20, 20, 40)
        PrintDoc1.DefaultPageSettings.Margins = margins
        PrintPreviewDialog1.ShowDialog()

        'Replace buttons back on form
        PrtTSBut.Visible = True
        PDFTeamBut.Visible = True
        'Hide form
        Me.Hide()
        InputForm.Show()  ' Return to input form
    End Sub

    'Print Handler And Graphics print method With scaling
    Private Sub PDoc_PrintPage(sender As Object, e As PrintPageEventArgs)
        PrintToGraphics(e.Graphics, e.MarginBounds)
    End Sub
    Public Sub PrintToGraphics(Graphics As Graphics, bounds As Rectangle)
        'Print the control's view to a Graphics object.
        '<param name="graphics">Graphics object to draw on.</param>
        '<param name="bounds">Rectangle to print in.</param>

        'Draw the control and contents to a bitmap 
        Dim Bitmap As Bitmap = New Bitmap(Me.Width, Me.Height)
        Me.DrawToBitmap(Bitmap, New Rectangle(0, 0, Bitmap.Width, Bitmap.Height))

        'Assign Print Bounds to target rectangle
        Dim PrtWidth, PrtHeight, PrtLeft, PrtTop As Integer
        PrtWidth = bounds.Width
        PrtHeight = bounds.Height
        PrtLeft = bounds.Left
        PrtTop = bounds.Top
        Dim target As Rectangle = New Rectangle(PrtLeft, PrtTop, PrtWidth, PrtHeight)
        'Scale bitmap to fit target
        Dim xScale As Double = Bitmap.Width / PrtWidth
        Dim yScale As Double = Bitmap.Height / PrtHeight
        If xScale < yScale Then
            target.Width = Int(xScale * target.Width / yScale)
        Else
            target.Height = Int(yScale * target.Height / xScale)
        End If
        'Draw the bitmap
        Graphics.PageUnit = GraphicsUnit.Display
        Graphics.DrawImage(Bitmap, target)
    End Sub

3 Ответов

Рейтинг:
10

Dave the Golfer

Сохраненные данные в excel и распечатанные из excel


Рейтинг:
1

RickZeeland

Может быть, вы можете использовать библиотеку PDF, например PDFsharp: Главная страница фонда PDFsharp и MigraDoc - PDFsharp & MigraDoc[^]
Или ItextSharp: GitHub - itext/itextsharp: .NET-порт библиотеки iText[^]


Рейтинг:
0

OriginalGriff

Не печатайте форму вообще: вы можете сделать это, захватив экран в виде изображения и нарисовав это изображение в формате А4, но на некоторых экранах оно будет выглядеть как мусор, а на других-нечитаемым.

Вместо этого нарисуйте информацию, которую должен отображать экран, на PrintDocument: таким образом, вы можете сделать вывод одинаковым независимо от того, какой пользователь его напечатал, поскольку у вас есть полный контроль над размером шрифта и положением всего. Кроме того, если какой - либо из ваших элементов управления формой прокручивается, процесс захвата будет захватывать только видимый бит, поэтому все, что прокручивается вне поля зрения, не будет напечатано-выполняя эту работу должным образом, вы можете точно решить, что будет напечатано, какого размера оно будет напечатано и куда оно пойдет.

Документация MS для PrintDocument показывает основы печати текста: Класс PrintDocument (System.Рисование.Печатание)[^]