前幾天在CSDN看到有朋友問到怎麼打印 當前的窗體,今天有空,將這段代碼發布出來提供給其他感興趣的朋友參考!
在窗體的代碼裡面:
Imports System.Drawing.Printing ‘導入這個命名空間
’這個方法被關聯到打印文檔的PrintPage事件
Private Sub printhandler(ByVal sender As Object, ByVal e As PrintPageEventArgs)
e.Graphics.DrawImage(memoryImage, 0, 0)
End Sub
’在窗體初始化 的時候將打印文檔的該事件綁定到處理方法
AddHandler mPrintDoc.PrintPage, AddressOf printhandler
''聲明幾個變量
Private WithEvents mPrintDoc As New PrintDocument
Dim memoryImage As Bitmap
‘這裡啟動打印任務。
public Function Print() As Boolean
Try
Dim myGraphics As Graphics = Me.CreateGraphics() ’這個屬性很重要,可以繪制出當前窗體,打印其實就是先畫出要打印的東西,再將這個東西交給打印文檔,打印文檔類會負責與打印機的交互細節。可以將這個graphics理解為一張畫布,使用鉛筆鋼筆或者調色板來畫東西
Dim s As Size = Me.Size
memoryImage = New Bitmap(s.Width, s.Height, myGraphics) ‘取得要打印的圖片
Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage) ’取得新的畫布,畫布上包含了指定大小的圖片
memoryGraphics.CopyFromScreen(PointToScreen(Me.Location).X, PointToScreen(Me.Location).Y, 0, 0, s) ’將畫布輸出到打印機,注意PointToScreen方法,將會把窗體坐標轉換成屏幕坐標,否則打印的窗體不符合要求
''執行打印文檔的打印方法,該方法會觸發我們在初始化窗體時關聯的事件
mPrintDoc.Print()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Return MyBase.Print()
End Function
這樣子就可以打印當前的窗體了。可以看到,打印文檔所需要的資源都是在窗體內部進行提供的,可以繼承printdocumnet類,這樣的話就可以通過重寫文檔類的方法,將外部資源傳入給類,從而不會跟界面代碼糾纏在一起。