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, это можно легко проверить, не переводя бумагу и чернила.
Но более правильно будет формировать документ на печать, опрашивая элементы управления/формируя данные для печати.