VB6 PrintForm工作原理及VB.NET打印质量差问题求助
VB6
Form.PrintForm 的工作机制 - 底层靠Windows GDI的
BitBlt函数实现,直接把窗体在屏幕上显示的像素(显存里的屏幕分辨率位图)原封不动复制到打印机的设备上下文(DC)。 - 完全依赖屏幕DPI(一般是96DPI),而打印机DPI通常是300或600,等于把低清位图强行拉伸打印——放在VB6时代,打印机分辨率普遍不高,用户对打印精度要求也没现在苛刻,所以当时看起来能用。
- 默认只打印窗体的可见客户区(包括上面的所有控件),要是窗体超出屏幕范围,没显示的部分打不出来。部分VB6后期版本可以调整属性,选择打印整个窗体还是仅客户区。
- 全程是位图复制,没有矢量渲染,文字、图形都是以屏幕像素的精度输出,放大必然模糊。
VB.NET 解决打印质量差的方案
既然VB6的路子是位图打印,VB.NET要搞高质量打印,得换思路用矢量渲染:
- 用
PrintDocument控件(VB.NET官方推荐):在PrintPage事件里手动绘制所有订单内容(文字、线条、控件文本等),直接用打印机的高DPI渲染,清晰度拉满。
示例代码:Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage ' 绘制订单编号 e.Graphics.DrawString("披萨订单编号: 123", New Font("Arial", 12), Brushes.Black, 10, 10) ' 绘制分隔线 e.Graphics.DrawLine(Pens.Black, 10, 30, 500, 30) ' 遍历窗体控件,打印Label这类控件的文本 For Each ctrl As Control In Me.Controls If TypeOf ctrl Is Label Then Dim lbl As Label = DirectCast(ctrl, Label) e.Graphics.DrawString(lbl.Text, lbl.Font, New SolidBrush(lbl.ForeColor), ctrl.Location.X, ctrl.Location.Y) End If Next End Sub - 要是必须打印窗体外观,别直接抓屏幕位图:用
DrawToBitmap生成对应打印机DPI的高分辨率位图再打印,避免拉伸模糊:Private Sub PrintHighResBitmap() Dim printDoc As New Printing.PrintDocument() AddHandler printDoc.PrintPage, Sub(sender, e) ' 按打印机DPI生成位图,避免拉伸 Dim bmp As New Bitmap(Me.Width * e.Graphics.DpiX / 96, Me.Height * e.Graphics.DpiY / 96) Me.DrawToBitmap(bmp, New Rectangle(0, 0, bmp.Width, bmp.Height)) e.Graphics.DrawImage(bmp, 0, 0) bmp.Dispose() End Sub printDoc.Print() End Sub - VB.NET自带的
PrintForm控件默认也是位图打印,就算调缩放属性,效果也不如手动绘制矢量内容,不推荐优先用。
内容的提问来源于stack exchange,提问作者Elviss
相关产品推荐
相关产品推荐

