Печать прокручиваемой формы

У меня есть форма с возможностью прокрутки, которую я хотел бы напечатать полностью.

Я уже пытался использовать этот код для печати:

    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 кода здесь код такой

  1. На панели инструментов перейдите на вкладку PowerPacks в Visual Basic и перетащите компонент PrintForm на форму.

  2. Компонент PrintForm будет добавлен в панель компонентов.

  3. В окне "Свойства" установите для свойства PrintAction значение PrintToPrinter.

Добавьте следующий код в соответствующий обработчик событий (например, в обработчик событий Click для кнопки печати).

PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)

и тут возник тот же вопрос, что и у вас и был ответ.

Другие вопросы по тегам