実現したいこと
VB.NET2019で開発したアプリをWindows10で動作させ、印刷処理を行うと、黒で塗りつぶされてしまう(真っ黒なイメージが印刷される)
処理の途中でメッセージボックスを表示させるときれいに印刷できるのだが、メッセージボックスを表示させずに印刷できるようにしたい。
前提
VisualBasic.NET2019(.NET Framework4.8)、Windows10環境で動作するように64bitアプリケーションを開発しています。
発生している問題・エラーメッセージ
開発したアプリケーションで印刷処理を行うと次の動きをします。
・メッセージボックスを処理途中で表示させると、きれいに印刷できる
・メッセージボックスをなくすと、黒で塗りつぶされたようなイメージが印刷される
メッセージボックスなしできれいに印刷したいです。
動きを見るに、処理が並列で動いているのではと思い、タスク化することで改善を試みたのですが、依然真っ黒なイメージが印刷されており、解決に至っておりません。
どなたか、良い解決案をご存じないでしょうか・・・。
該当のソースコード
VB.NET
1Module Com_ParkFunc 2 Public memoryImage As Bitmap 3 Public PrintDocument1 As System.Drawing.Printing.PrintDocument 4 5 6 Public Sub PubS_PrintParkTicket(ByVal strSrvNum As String) 7 Dim SecName As String 8 Dim KeyName As String 9 10 '' 各項目の設定 11 With FrmTicket2 12 .Label5.Text = "てすと" 13 .lblDate.Text = VB6.Format(Now, "yyyy年mm月dd日 hh時nn分") 14 .lblSrvNo.Text = "12345678901234" 15 End With 16 17 Dim task As Threading.Tasks.Task = New Threading.Tasks.Task( 18 Sub() 19 Task_image() 20 End Sub 21 ) 22 task.Start() 23 End Sub 24 25 26 Private Const SRCCOPY As Integer = &HCC0020 27 'フォームのイメージを取得する 28 Public Function CaptureControl(ByVal ctrl As Control) As Bitmap 29 Dim g As Graphics = ctrl.CreateGraphics() 30 Dim img As New Bitmap(ctrl.ClientRectangle.Width, 31 ctrl.ClientRectangle.Height, g) 32 Dim memg As Graphics = Graphics.FromImage(img) 33 Dim dc1 As IntPtr = g.GetHdc() 34 Dim dc2 As IntPtr = memg.GetHdc() 35 BitBlt(dc2, 0, 0, img.Width, img.Height, dc1, 0, 0, SRCCOPY) 36 g.ReleaseHdc(dc1) 37 memg.ReleaseHdc(dc2) 38 memg.Dispose() 39 g.Dispose() 40 Return img 41 End Function 42 43 44 'PrintDocument1のPrintPageイベントハンドラ 45 Public Sub PrintDocument1_PrintPage(ByVal sender As Object, 46 ByVal e As System.Drawing.Printing.PrintPageEventArgs) 47 Dim img As Bitmap = memoryImage 48 e.Graphics.DrawImage(img, 0, 0, 215, 325) 49 e.HasMorePages = False 50 img.Dispose() 51 End Sub 52 53 54 55 Public Sub Task_image() 56 57 Dim memoryImageWK As Bitmap 58 memoryImage = memoryImageWK 59 60 Try 61 'MsgBox("1.1") 62 If task1(memoryImage).Equals(False) Then 63 Exit Sub 64 End If 65 If task2(memoryImage).Equals(False) Then 66 Exit Sub 67 End If 68 If task3(memoryImage).Equals(False) Then 69 Exit Sub 70 End If 71 Catch sysEx As System.Exception 72 Throw sysEx 73 Finally 74 memoryImage = Nothing 75 PrintDocument1 = Nothing 76 'MsgBox("2.3") 77 End Try 78 End Sub 79 80 Private Function task1(ByRef memoryImage As Bitmap) As Boolean 81 Try 82 memoryImage = CaptureControl(FrmTicket2) 83 return true 84 Catch sysEx As System.Exception 85 return false 86 End Try 87 End Function 88 89 Private Function task2(ByRef memoryImage As Bitmap) As Boolean 90 Dim PrintDocumentWK As New System.Drawing.Printing.PrintDocument 91 PrintDocument1 = PrintDocumentWK 92 Try 93 'MsgBox("2.1") 94 AddHandler PrintDocument1.PrintPage, AddressOf PrintDocument1_PrintPage 95 return true 96 Catch sysEx As System.Exception 97 return false 98 End Try 99 End Function 100 101 Private Function task3(ByRef memoryImage As Bitmap) As Boolean 102 Try 103 'MsgBox("2.2") 104 PrintDocument1.Print() 105 return true 106 Catch sysEx As System.Exception 107 return false 108 End Try 109 End Function 110 111End Module
試したこと
フォームをキャプチャする処理と印刷する処理を分け、タスクにすることで記載した順に処理が動くのではと試みました。
補足情報(FW/ツールのバージョンなど)
VisualStudio2019(Professional Edition)を使用して開発しています。
きれいに印刷できるパターンのソース
Module Com_ParkFunc
Public memoryImage As Bitmap
Public Sub PubS_PrintParkTicket(ByVal strSrvNum As String)
Dim SecName As String
Dim KeyName As String
'' 駐車サービス票の印刷処理 FrmTicket2.Show() '★★★★★★★★★ ←フォームは見えないようにしたい '' 各項目の設定 With FrmTicket2 .Label5.Text = "てすと" .lblDate.Text = VB6.Format(Now, "yyyy年mm月dd日 hh時nn分") .lblSrvNo.Text = "12345678901234" End With MsgBox("print")'★★★★★★★★★ ←FrmTicket2.Refresh()でも印刷できました!! memoryImage = CaptureControl(FrmTicket2) Dim PrintDocument1 As New System.Drawing.Printing.PrintDocument AddHandler PrintDocument1.PrintPage, AddressOf PrintDocument1_PrintPage PrintDocument1.Print() memoryImage.Dispose() '' フォームのアンロード FrmTicket2.Hide() End Sub <System.Runtime.InteropServices.DllImport("gdi32.dll")> Public 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 Integer) As Boolean End Function Private Const SRCCOPY As Integer = &HCC0020 'フォームのイメージを取得する Public Function CaptureControl(ByVal ctrl As Control) As Bitmap Dim g As Graphics = ctrl.CreateGraphics() Dim img As New Bitmap(ctrl.ClientRectangle.Width, ctrl.ClientRectangle.Height, g) Dim memg As Graphics = Graphics.FromImage(img) Dim dc1 As IntPtr = g.GetHdc() Dim dc2 As IntPtr = memg.GetHdc() BitBlt(dc2, 0, 0, img.Width, img.Height, dc1, 0, 0, SRCCOPY) g.ReleaseHdc(dc1) memg.ReleaseHdc(dc2) memg.Dispose() g.Dispose() Return img End Function 'PrintDocument1のPrintPageイベントハンドラ Public Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) e.Graphics.DrawImage(memoryImage, 0, 0, 215, 325) End Sub
End Module
