我嘗試使用WinAPI而不是(System.Drawing.Printing.PrintDocument)來準備打印文檔,因爲Graphic.DrawString不能正確渲染高棉Unicode。只有TextRendering.DrawText正確呈現它。我相信Graphic是GDI +包裝器,TextRendering.DrawText是使用GDI。此外,PrintDocument不適用於TextRendering.DrawText。從hDC創建圖形導致算術運算溢出
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" _
(ByVal lpDriverName As String, ByVal lpDeviceName As String, _
ByVal lpOutput As String, ByVal lpInitData As DEVMODE) As Long
Private Declare Function EndDoc Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function StartDoc Lib "gdi32" Alias "StartDocA" (ByVal hdc As Long, ByVal lpdi As DOCINFO) As Long
Private Declare Function StartPage Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function EndPage Lib "gdi32" (ByVal hdc As Long) As Long
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'' Getting Printer hDC
Dim printHandler As Long = CreateDC(Nothing, "Send To OneNote 2010", Nothing, Nothing)
Dim docInfo As New DOCINFO
docInfo.cbSize = Len(docInfo)
docInfo.lpszDatatype = Nothing
docInfo.lpszOutput = Nothing
docInfo.lpszDocName = "Testing"
StartDoc(printHandler, docInfo)
StartPage(printHandler)
Dim g As Graphics = Graphics.FromHdc(printHandler)
TextRenderer.DrawText(g, "Hello World", Me.Font, New Point(10, 10), Color.Black)
EndPage(printHandler)
EndDoc(printHandler)
End Sub
這是我的嘗試。它在這行代碼上失敗:Dim g As Graphics = Graphics.FromHdc(printHandler)
。看起來Long是64位,IntPtr是32位。
有沒有解決方法?
爲什麼要聲明'CreateDC'來返回一個'Long'? API使用'IntPtr'返回'HDC'。 – arx
我在問這個問題之前已經試過IntPtr了。當我使用Long時,它將OneNote 2010作爲打印機打開。當我使用IntPtr時,它什麼都不做。 – invisal