Печать прокручиваемой формы
У меня есть форма с возможностью прокрутки, которую я хотел бы напечатать полностью.
Я уже пытался использовать этот код для печати:
Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
Me.PrintForm.PrintAction = Printing.PrintAction.PrintToPreview
Me.PrintForm.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)
End Sub
И результат не совсем точен.
Чтобы продемонстрировать мою проблему, вот несколько фотографий:
Это результат, который я хочу (конечно, я хочу, чтобы он также печатал весь прокручиваемый контент)
Как вы можете видеть, это изображение содержит всю ширину, необходимую мне для изображения, но, поскольку это изображение на экране печати, оно не содержит области с возможностью прокрутки, которую я хотел бы иметь в моей печатной версии формы.
и это то, что я получаю из своего кода:
Как вы можете видеть здесь, я получаю только около 60% ширины формы и 50% высоты, и, конечно же, я не получаю область с возможностью прокрутки.
Меня не волнует качество, я просто хочу напечатать всю форму, включая область с прокруткой.
5 ответов
Я думаю, что ваш ответ в статье
Все, что вам нужно, это обратиться к библиотеке FormPrinting (или импортировать исходный код в ваше решение).
Private Sub btnPrint_Click(object sender, EventArgs e)
{
var fp = new FormPrinting.FormPrinting(this);
fp.Print();
}
сделаю работу печати.
Я проверил библиотеку, не имея проблем с прокручиваемым содержимым, таким как изображения и....
В этой строке:
PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)
Это выглядит как PrintOption.Scrollable
только будет работать, если у вас есть прокручиваемая форма. У вас есть прокручиваемый элемент управления здесь (вероятно, Panel
), внутри формы. В этом случае его площадь не будет расширена на принтер. Для сравнения:
Прокручиваемый контроль:
печатает как:
Прокручиваемая форма:
печатает как:
Согласно этому официальному ответу Microsoft, захват прокручиваемого элемента управления невозможен при PrintForm
, Если вы используете PrintDocument и некоторую пользовательскую кодировку, вы можете сделать это для простых случаев, таких как прокручиваемый TextBox. В вашем случае вам может потребоваться еще больше пользовательского кодирования. обращение PrintDocument1.PrintPage
Похоже, лучшее место для начала, если вы до этого.
Основываясь на том, что вы показываете... похоже, прокручиваемая область - это контейнер, похожий на Panel. Если это так, то печать формы не проблема, это печать прокручиваемого элемента управления.
Взгляните на этот проект, чтобы создать растровое изображение из элемента управления: http://www.codeproject.com/Articles/35734/Print-a-WinForms-User-Control
РЕДАКТИРОВАТЬ: Если подумать, я не думаю, что код по этой ссылке также решает проблему с прокруткой.
Я думаю, что вам нужно будет сделать одну из двух вещей: 1) Временно изменить размер панели настолько большой, чтобы полосы прокрутки исчезли, а затем изменить ее размер 2) Создать элемент управления (возможно, форму "Версия для печати"), который не имеет вложенные прокручиваемые элементы и изящно разбираются с такими вещами, как нумерация страниц.
Вариант № 2 может показаться большой работой, но я думаю, что вы могли бы довольно быстро сделать что-то вроде: создать новую панель, клонировать каждый элемент управления, который вы хотите распечатать и добавить его на панель (изменяя размеры по мере необходимости, чтобы избежать прокрутки), распечатать панель, затем утилизируйте панель.
У меня была похожая проблема, которую я смог решить без каких-либо дополнительных библиотек или расширений. Это просто с помощью метода DrawToBitmap, доступного в большинстве элементов управления Forms.
Dim ctrlColl As ControlCollection
Dim i As Integer = 0
' Get collection of controls
ctrlColl = Me.Controls
' create bitmap array
Dim Bitmaps(ctrlColl.Count - 1) As Bitmap
' remove controls you have hidden before printing
For Each ctrl As Control In ctrlColl
If Not ctrl.Visible Then
ctrlColl.Remove(ctrl)
End If
Next
' Loop through controls
For Each ctrl As Control In ctrlColl
' create bitmap from control.DrawToBitmap
Bitmaps(i) = New Bitmap(ctrl.Width, ctrl.Height)
ctrl.DrawToBitmap(Bitmaps(i), ctrl.ClientRectangle)
i = i + 1
Next
' Print each bitmap in array
i = 0
For Each bmp As Bitmap In Bitmaps
e.Graphics.DrawImage(bmp, New Point(ctrlColl(i).Location.X, ctrlColl(i).Location.Y))
i = i + 1
Next
End Sub
Проверьте на форуме MSDN кода здесь код такой
На панели инструментов перейдите на вкладку PowerPacks в Visual Basic и перетащите компонент PrintForm на форму.
Компонент PrintForm будет добавлен в панель компонентов.
В окне "Свойства" установите для свойства PrintAction значение PrintToPrinter.
Добавьте следующий код в соответствующий обработчик событий (например, в обработчик событий Click для кнопки печати).
PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)
и тут возник тот же вопрос, что и у вас и был ответ.