Проблемы при выводе на печать

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Проблемы при выводе на печать

Сообщение edyapd » 19.01.2012 (Чт) 11:36

Для того чтобы распечатать форму пользуюсь PrintForm2.Print()
Но столкнулся с тем что не у всех есть Microsoft.VisualBasic.PowerPacks.Vs.dll
А без него не открывается форма где присутствует PrintForm.Print
Объяснять что надо скачать еще и данный файл в мои задачи как то не входит.
Можно его как то запихать внутрь исполняемого файла?

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Проблемы при выводе на печать

Сообщение Admiralisimys » 19.01.2012 (Чт) 11:55

edyapd если возможны изменения в подсистеме печати приложения, предложу подготовить и напечатать документ с помощью средств печати WinForms.
Примеры
viewtopic.php?f=2&t=43566
ftp://charlespetzold.com/ProgWinVB/Printing/

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: Проблемы при выводе на печать

Сообщение edyapd » 19.01.2012 (Чт) 12:55

Admiralisimys К сожалению я еще слаб в VB чтобы разобраться в этих примерах без комментариев.
На данный момент у меня есть форма на которой в нужных местах расположены Label. При вызове формы я в них копирую те данные которые надо вывести на печать. И вызываю PrintForm2.Print().
Всё это можно переделать без проблем, так как я еще только пытаюсь понять способы вывода.
Но в приведеных примерах я даже не смог понять куда мне запихнуть свои данные?

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Проблемы при выводе на печать

Сообщение Admiralisimys » 19.01.2012 (Чт) 17:36

edyapd в таком случаи, советую начать с азов ftp://charlespetzold.com/ProgWinVB/Line ... tableForm/
Вот документация к данному коду http://netlib.narod.ru/library/book0039/ch05_04.htm (там примеры по C#).
Способ хорош, но для печати данных с элементов размещённый на форме (или самих элементов), их надо опросить.
В этой теме viewtopic.php?f=2&t=26657&start=0#wrap Nord777 приводить частный пример для одного элемента типа TextBox.

Вариант в лоб - принтскринить форму и отправляя её на печать.
В упомянутой теме asharky приводится пример принтскрина с помощью .NET средств.
А ниже следующий код, основанный на PrintableForm, воспользуется возможностями Win32 по этому вопросу.
Код: Выделить всё
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Runtime.InteropServices  'DllImport req

Class PrintSample
    Inherits Form

    <DllImport("user32.dll")> Private Shared Function GetDC(ByVal hWnd As IntPtr) As IntPtr
    End Function
    <DllImport("gdi32.dll")> Private Shared Function CreateCompatibleDC(ByVal hDc As IntPtr) As IntPtr
    End Function
    <DllImport("gdi32.dll")> Private Shared Function CreateCompatibleBitmap(ByVal hDc As IntPtr, _
                                ByVal nWidth As Integer, ByVal nHeight As Integer) As IntPtr
    End Function
    <DllImport("gdi32.dll")> Private Shared Function SelectObject(ByVal hDc As IntPtr, _
                                                                  ByVal hGdiObj As IntPtr) As IntPtr
    End Function
    <DllImport("gdi32.dll")> Private Shared Function BitBlt(ByVal hdcDest As IntPtr, _
                                                            ByVal nXDest As Integer, _
                                                            ByVal nYDest As Integer, _
                                                            ByVal nWidth As Integer, _
                                                            ByVal nHeight As Integer, _
                                                            ByVal hdcSrc As IntPtr, _
                                                            ByVal nXSrc As Integer, _
                                                            ByVal nYSrc As Integer, _
                                                            ByVal dwRop As UInteger) As IntPtr
    End Function

    <DllImport("user32.dll")> Private Shared Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Integer
    End Function

    <DllImport("gdi32.dll")> Private Shared Function DeleteDC(ByVal hdc As IntPtr) As IntPtr
    End Function

    <DllImport("gdi32.dll")> Private Shared Function DeleteObject(ByVal hObject As IntPtr) As IntPtr
    End Function

    Private Const SRCCOPY As UInteger = &HCC0020
    Private iForm As Image

    <STAThread()> Shared Sub Main()
        Application.EnableVisualStyles()
        Application.Run(New PrintSample())
    End Sub

    Sub New()
        Text = "Print Sample"

        Dim lbl As New Label()
        lbl.Parent = Me
        lbl.Dock = DockStyle.Left
        lbl.AutoSize = True
        lbl.Text = "Label1 Text"

        lbl = New Label()
        lbl.Parent = Me
        lbl.Dock = DockStyle.Right
        lbl.AutoSize = True
        lbl.Text = "Label2 Text"
    End Sub

    Private Sub GetScreenCapture_Win32(ByVal hWnd As IntPtr, ByVal x As Integer, ByVal y As Integer, _
                                       ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal bCur As Boolean)
        Dim hWinDC As IntPtr = GetDC(hWnd)
        Dim wCdc As IntPtr = CreateCompatibleDC(hWinDC)
        Dim hBmp As IntPtr = CreateCompatibleBitmap(hWinDC, nWidth, nHeight)

        SelectObject(wCdc, hBmp)
        BitBlt(wCdc, 0, 0, nWidth, nHeight, hWinDC, x, y, SRCCOPY)

        iForm = Image.FromHbitmap(hBmp)

        ReleaseDC(hWnd, hWinDC)
        DeleteDC(wCdc)
        DeleteObject(hBmp)
    End Sub

    Protected Overrides Sub OnClick(ByVal ea As System.EventArgs)
        GetScreenCapture_Win32(Nothing, Me.Location.X, Me.Location.Y, _
                Me.Size.Width, Me.Size.Height, False)
        Dim prndoc As New Printing.PrintDocument()
        prndoc.DocumentName = Text
        AddHandler prndoc.PrintPage, AddressOf PrintDocumentOnPrintPage
        prndoc.Print()
    End Sub

    Sub PrintDocumentOnPrintPage(ByVal obj As Object, _
                             ByVal ppea As Printing.PrintPageEventArgs)
        Dim grfx As Graphics = ppea.Graphics
        Dim szf As SizeF = grfx.VisibleClipBounds.Size
        If iForm IsNot Nothing Then
            grfx.DrawImage(iForm, Point.Empty)
            iForm.Dispose()
        End If
    End Sub

End Class


По клику (нажатию) на форме программа фотографирует весь рабочий стол, но в кадр попадает только форма с двумя элементами типа Надпись. А далее происходит печать отснятого материала.
Если по умолчанию установлен виртуальный принтер PDF/XPS, это можно легко проверить, не переводя бумагу и чернила.

Но более правильно будет формировать документ на печать, опрашивая элементы управления/формируя данные для печати.

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: Проблемы при выводе на печать

Сообщение edyapd » 19.01.2012 (Чт) 18:20

Спасибо, буду разбираться

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: Проблемы при выводе на печать

Сообщение edyapd » 20.01.2012 (Пт) 9:13

Ну вот вроди чтото стало получаться.
Просьба проверить может чего можно исключить или написать более правильно.
Есть форма с кнопкой "Печать". По ней идет вызов данной формы.
Она формируется. Вытаскивается клиентская область и отправляется на печать.
В дальнейшем там еще добавятся надписи.

Код: Выделить всё
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Runtime.InteropServices  'DllImport req

Public Class PrintSample
    Inherits Form

    <DllImport("user32.dll")> Private Shared Function GetDC(ByVal hWnd As IntPtr) As IntPtr
    End Function
    <DllImport("gdi32.dll")> Private Shared Function CreateCompatibleDC(ByVal hDc As IntPtr) As IntPtr
    End Function
    <DllImport("gdi32.dll")> Private Shared Function CreateCompatibleBitmap(ByVal hDc As IntPtr, _
                                ByVal nWidth As Integer, ByVal nHeight As Integer) As IntPtr
    End Function
    <DllImport("gdi32.dll")> Private Shared Function SelectObject(ByVal hDc As IntPtr, _
                                                                  ByVal hGdiObj As IntPtr) As IntPtr
    End Function
    <DllImport("gdi32.dll")> Private Shared Function BitBlt(ByVal hdcDest As IntPtr, _
                                                            ByVal nXDest As Integer, _
                                                            ByVal nYDest As Integer, _
                                                            ByVal nWidth As Integer, _
                                                            ByVal nHeight As Integer, _
                                                            ByVal hdcSrc As IntPtr, _
                                                            ByVal nXSrc As Integer, _
                                                            ByVal nYSrc As Integer, _
                                                            ByVal dwRop As UInteger) As IntPtr
    End Function

    <DllImport("user32.dll")> Private Shared Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Integer
    End Function

    <DllImport("gdi32.dll")> Private Shared Function DeleteDC(ByVal hdc As IntPtr) As IntPtr
    End Function

    <DllImport("gdi32.dll")> Private Shared Function DeleteObject(ByVal hObject As IntPtr) As IntPtr
    End Function

    Private Const SRCCOPY As UInteger = &HCC0020
    Private iForm As Image


    <STAThread()> Shared Sub Main()
        Application.EnableVisualStyles()
        Application.Run(New PrintSample())
    End Sub

    Private Sub GetScreenCapture_Win32(ByVal hWnd As IntPtr, ByVal x As Integer, ByVal y As Integer, _
                                       ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal bCur As Boolean)
        Dim hWinDC As IntPtr = GetDC(hWnd)
        Dim wCdc As IntPtr = CreateCompatibleDC(hWinDC)
        Dim hBmp As IntPtr = CreateCompatibleBitmap(hWinDC, nWidth, nHeight)

        SelectObject(wCdc, hBmp)
        BitBlt(wCdc, 0, 0, nWidth, nHeight, hWinDC, x, y, SRCCOPY)

        iForm = Image.FromHbitmap(hBmp)

        ReleaseDC(hWnd, hWinDC)
        DeleteDC(wCdc)
        DeleteObject(hBmp)
    End Sub

    'Protected Overrides Sub OnClick(ByVal ea As System.EventArgs)
    Sub pr()
        'Как можно определить начало клиенской области?
        GetScreenCapture_Win32(Nothing, Me.Location.X + 4, Me.Location.Y + 30, _
                Me.ClientSize.Width, Me.ClientSize.Height, False)
        Dim prndoc As New Printing.PrintDocument()
        prndoc.DocumentName = Text
        AddHandler prndoc.PrintPage, AddressOf PrintDocumentOnPrintPage
        prndoc.Print()
    End Sub

    Sub PrintDocumentOnPrintPage(ByVal obj As Object, _
                             ByVal ppea As Printing.PrintPageEventArgs)
        Dim grfx As Graphics = ppea.Graphics
        Dim szf As SizeF = grfx.VisibleClipBounds.Size
        If iForm IsNot Nothing Then
            grfx.DrawImage(iForm, Point.Empty)
            iForm.Dispose()
        End If
    End Sub

    Private Sub InitializeComponent()
        Me.lOOO = New System.Windows.Forms.Label
        Me.lDate = New System.Windows.Forms.Label
        Me.Panel1 = New System.Windows.Forms.Panel
        Me.Label1 = New System.Windows.Forms.Label
        Me.Panel1.SuspendLayout()
        Me.SuspendLayout()
        '
        'lOOO
        '
        Me.lOOO.Dock = System.Windows.Forms.DockStyle.Fill
        Me.lOOO.Location = New System.Drawing.Point(0, 0)
        Me.lOOO.Name = "lOOO"
        Me.lOOO.Size = New System.Drawing.Size(152, 93)
        Me.lOOO.TabIndex = 0
        Me.lOOO.Text = "ООО ""Рога и Копыта"""
        '
        'lDate
        '
        Me.lDate.AutoSize = True
        Me.lDate.Location = New System.Drawing.Point(663, 9)
        Me.lDate.Name = "lDate"
        Me.lDate.Size = New System.Drawing.Size(115, 13)
        Me.lDate.TabIndex = 1
        Me.lDate.Text = "00:00:00  01.01.2012"
        '
        'Panel1
        '
        Me.Panel1.Controls.Add(Me.lOOO)
        Me.Panel1.Location = New System.Drawing.Point(6, 91)
        Me.Panel1.Name = "Panel1"
        Me.Panel1.Size = New System.Drawing.Size(152, 93)
        Me.Panel1.TabIndex = 2
        '
        'Label1
        '
        Me.Label1.AutoSize = True
        Me.Label1.Location = New System.Drawing.Point(12, 72)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(125, 13)
        Me.Label1.TabIndex = 3
        Me.Label1.Text = "Название организации"
        '
        'PrintSample
        '
        Me.BackColor = System.Drawing.Color.White
        Me.ClientSize = New System.Drawing.Size(809, 482)
        Me.Controls.Add(Me.Label1)
        Me.Controls.Add(Me.Panel1)
        Me.Controls.Add(Me.lDate)
        Me.Name = "PrintSample"
        Me.Panel1.ResumeLayout(False)
        Me.ResumeLayout(False)
        Me.PerformLayout()

    End Sub

' Загружается форма PrintSample
    Private Sub PrintSample_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        InitializeComponent()
        Me.lDate.Text = TimeOfDay & "  " & Today
        Me.Visible = True
        Me.Focus()
        Me.Refresh()
        pr()
        Me.Close()
    End Sub

    Friend WithEvents lOOO As System.Windows.Forms.Label
    Friend WithEvents lDate As System.Windows.Forms.Label
    Friend WithEvents Panel1 As System.Windows.Forms.Panel
    Friend WithEvents Label1 As System.Windows.Forms.Label
End Class

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Проблемы при выводе на печать

Сообщение Admiralisimys » 29.01.2012 (Вс) 0:25

Отвечая на вопрос, может пригодится
edyapd писал(а):
Код: Выделить всё
'Как можно определить начало клиенской области?
GetScreenCapture_Win32(Nothing, Me.Location.X + 4, Me.Location.Y + 30, _
       Me.ClientSize.Width, Me.ClientSize.Height, False)

Вот так
Код: Выделить всё
GetScreenCapture_Win32(Me.Handle, Me.ClientRectangle.Left, Me.ClientRectangle.Top, _
       Me.ClientRectangle.Right, Me.ClientRectangle.Bottom, False)


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

    TopList