VB2022实现位图无拉伸缩放至A4尺寸打印的代码咨询
VB2022 实现位图等比例适配A4打印(不变形)
问题说明
现有代码能将Panel中的内容生成为位图并打印到A4纸,但位图会被强制拉伸填充A4区域,导致原有形状变形。需要修改代码,实现位图等比例放大/缩小,完整适配A4纸且保持长宽比。
原始代码
Public Class Form1 Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim margX As Single = e.PageSettings.HardMarginX Dim margY As Single = e.PageSettings.HardMarginY Dim adjustToA4 As New Rectangle(e.PageBounds.Left - margX, e.PageBounds.Top - margY, e.PageBounds.Width, e.PageBounds.Height) Dim dm As New Bitmap(Panel2.Width, Panel2.Height) Panel2.DrawToBitmap(dm, New Rectangle(0, 0, Panel2.Width, Panel2.Height)) e.Graphics.DrawImage(dm, adjustToA4) End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click PrintPreviewDialog1.Document = PrintDocument1 PrintPreviewDialog1.ShowDialog() End Sub End Class
修改后的代码(等比例适配)
Public Class Form1 Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage ' 获取打印区域(去除硬边距) Dim margX As Single = e.PageSettings.HardMarginX Dim margY As Single = e.PageSettings.HardMarginY Dim printArea As New RectangleF(e.PageBounds.Left - margX, e.PageBounds.Top - margY, e.PageBounds.Width, e.PageBounds.Height) ' 将Panel内容转换为位图 Dim panelBitmap As New Bitmap(Panel2.Width, Panel2.Height) Panel2.DrawToBitmap(panelBitmap, New Rectangle(0, 0, Panel2.Width, Panel2.Height)) ' 计算等比例缩放比例 Dim scaleWidth As Single = printArea.Width / panelBitmap.Width Dim scaleHeight As Single = printArea.Height / panelBitmap.Height Dim scaleFactor As Single = Math.Min(scaleWidth, scaleHeight) ' 取较小比例,保证完整显示 ' 计算缩放后的位图尺寸 Dim newWidth As Single = panelBitmap.Width * scaleFactor Dim newHeight As Single = panelBitmap.Height * scaleFactor ' 计算居中位置(让位图在A4纸中间显示) Dim posX As Single = printArea.Left + (printArea.Width - newWidth) / 2 Dim posY As Single = printArea.Top + (printArea.Height - newHeight) / 2 ' 绘制等比例缩放后的位图 e.Graphics.DrawImage(panelBitmap, posX, posY, newWidth, newHeight) ' 释放位图资源 panelBitmap.Dispose() End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click PrintPreviewDialog1.Document = PrintDocument1 PrintPreviewDialog1.ShowDialog() End Sub End Class
关键说明
- 比例计算:分别计算位图宽高与打印区域宽高的比例,取较小值作为缩放因子,保证位图完整放入A4区域,不会超出边界
- 居中处理:通过计算打印区域与缩放后位图的尺寸差,让位图在A4纸上居中显示,视觉效果更合理
- 资源释放:手动调用
Dispose()释放位图资源,避免内存泄漏
内容的提问来源于stack exchange,提问作者zeak
相关产品推荐
相关产品推荐

