В первом блоке вашего оператора if
в комментарии предполагается, что вы не знаете, как распечатать все элементы управления. У вас есть несколько разных вариантов. Если вы просто хотите напечатать каждый элемент управления в форме, как он выглядит, вы можете просто использовать метод DrawToBitmap
самого Form
. Это создаст растровое изображение всей клиентской области формы, включая все содержащиеся в ней элементы управления.
Если в форме по-прежнему есть некоторые элементы управления, которые вы не хотите печатать, даже когда пользователь выбирает «Печатать все», вам нужно будет вызывать методы DrawToBitmap
для каждого отдельного элемента управления. Вы можете настроить цикл так, чтобы вам не нужно было писать строку кода для каждого элемента управления, но на самом деле нет другого хорошего варианта.
Я подозреваю, что у вас будут проблемы со вторым блоком elseif
, работающим так, как вы ожидаете. Вспомните, что я сказал выше, вам нужно создать временные растровые изображения, а затем нарисовать в этих растровых изображениях? Метод DrawToBitmap
принимает два параметра:
растровое изображение: a System.Drawing.Bitmap
, для которого необходимо нарисовать изображение элемента управления в
targetBounds: a System.Drawing.Rectangle
, который описывает границы элемента управления, который будет отображаться
В показанном вами коде отсутствуют оба этих параметра. В этом случае второй (targetBounds
) является простым - поскольку вы хотите нарисовать весь элемент управления, все, что вам нужно сделать, это указать его ClientRectangle
свойство для этого параметра.
Для первого (bitmap
) параметра вам нужно сделать, как я упоминал выше, и создать новое Bitmap
изображение, объявив временную переменную. Затем вам нужно вызвать метод DrawToBitmap
с указанным временным растровым изображением.
Может быть, я могу быть яснее с примером. Измените приведенный выше код, чтобы он выглядел так:
'Declare some class-level variables to hold images of the controls to print
Private bmpDirections1 As System.Drawing.Bitmap
Private bmpDirections2 As System.Drawing.Bitmap
Private bmpDirections3 As System.Drawing.Bitmap
Private bmpDirections4 As System.Drawing.Bitmap
Private Sub btnprint_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnprint.Click
If rbprintall.Checked = True Then
'Add code to print all here
ElseIf rbprintdirections.Checked = True Then
'Draw lbldirections control to bitmap variable named bmpDirections1
bmpDirections1 = New Bitmap(lbldirections.Width, lbldirections.Height)
lbldirections.DrawToBitmap(bmpDirections1, lbldirections.ClientRectangle)
'Draw lbldirections2 control to bitmap variable named bmpDirections2
bmpDirections2 = New Bitmap(lbldirections2.Width, lbldirections2.Height)
lbldirections2.DrawToBitmap(bmpDirections2, lbldirections2.ClientRectangle)
'Draw lbldirections3 control to bitmap variable named bmpDirections3
bmpDirections3 = New Bitmap(lbldirections3.Width, lbldirections3.Height)
lbldirections3.DrawToBitmap(bmpDirections3, lbldirections3.ClientRectangle)
'Draw lbldirections4 control to bitmap variable named bmpDirections4
bmpDirections4 = New Bitmap(lbldirections4.Width, lbldirections4.Height)
lbldirections4.DrawToBitmap(bmpDirections4, lbldirections4.ClientRectangle)
Else
MessageBox.Show("You must select one of the above options!")
End If
End Sub
Единственное, что нужно помнить, это то, что вам нужно вызывать Dispose
метод для каждой переменной растрового изображения, когда вы закончите использовать ее.Метод Dispose
«высвобождает ресурсы, принадлежащие образу», что означает, что он освобождает используемую память.Нет смысла хранить эти большие изображения, если вы не собираетесь использовать их снова.Таким образом, вы, вероятно, должны сделать это после завершения задания на печать.После удаления объекта растрового изображения вы больше не сможете использовать содержащееся в нем изображение, но вы всегда можете создать растровый объект new и назначить его переменной (как показано в приведенном выше коде).В следующий раз, когда пользователь нажмет кнопку «Печать».