VB.NET打印图表:调整大小失败及打印出现空白方块求助
解决VB.NET中Chart控件打印过小及空白方块问题
一、先解决打印图表过小的问题
你原来的代码里有两个小细节导致图表打印尺寸不足:
- 重复设置了横向打印(同时操作了
pdS和Chart_Requis.Printing.PrintDocument),其实只需要统一配置你创建的PrintDocument实例即可; - 直接使用
MarginBounds的尺寸绘制图表,但没有考虑图表本身的宽高比例,可能导致图表被压缩或者没有充分利用打印区域。
修改后的PrintPage事件代码可以这样写,通过计算缩放比例让图表在打印区域内最大化显示,同时保持原有比例:
Private Sub pds_PrintPage(sender As Object, ev As PrintPageEventArgs) ' 获取图表的原始尺寸 Dim chartOriginalSize As New Size(Chart_Requis.Width, Chart_Requis.Height) ' 获取打印的可用区域 Dim printArea As Rectangle = ev.MarginBounds ' 计算横向和纵向的缩放比例,取较小的那个避免变形 Dim scaleX As Double = CDbl(printArea.Width) / chartOriginalSize.Width Dim scaleY As Double = CDbl(printArea.Height) / chartOriginalSize.Height Dim scale As Double = Math.Min(scaleX, scaleY) ' 计算缩放后的图表尺寸 Dim scaledWidth As Integer = CInt(chartOriginalSize.Width * scale) Dim scaledHeight As Integer = CInt(chartOriginalSize.Height * scale) ' 让图表在打印区域居中(可选,也可以调整为左上角对齐) Dim printPosition As New Rectangle( printArea.Left + (printArea.Width - scaledWidth) \ 2, printArea.Top + (printArea.Height - scaledHeight) \ 2, scaledWidth, scaledHeight ) ' 执行打印绘制 Chart_Requis.Printing.PrintPaint(ev.Graphics, printPosition) End Sub
同时,把点击事件里的冗余代码去掉,只保留对pdS的配置:
Private Sub BT_Print_Click(sender As Object, e As EventArgs) Handles BT_Print.Click Dim pdS As New PrintDocument() AddHandler pdS.PrintPage, AddressOf pds_PrintPage pdS.DefaultPageSettings.Landscape = True Dim PrintDialog1 As New PrintPreviewDialog PrintDialog1.Document = pdS If PrintDialog1.ShowDialog = DialogResult.OK Then pdS.Print() End If End Sub
二、解决调整大小后出现空白方块的问题
出现空白方块通常是以下两种原因,你可以逐一排查:
原因1:Chart控件的AutoSize或ChartArea属性设置问题
检查你的Chart_Requis控件的AutoSize属性是否为True,如果是,可能导致打印时控件尺寸和实际显示不一致。建议将AutoSize设为False,并手动设置合适的控件尺寸,或者在打印前临时调整:' 在打印前临时设置Chart的尺寸(可选,根据你的需求调整) Chart_Requis.Size = New Size(800, 600)另外,检查
ChartArea的Position属性,确保它设置为Auto或者占满整个Chart控件区域,避免Chart内部有空白区域被一起打印。原因2:打印DPI与屏幕DPI不匹配
打印时的Graphics对象DPI和屏幕DPI不同,可能导致绘制出现偏移或空白。你可以在打印前设置Graphics的DPI匹配打印机:Private Sub pds_PrintPage(sender As Object, ev As PrintPageEventArgs) ' 让Graphics的DPI匹配打印机 ev.Graphics.PageUnit = GraphicsUnit.Document ev.Graphics.DpiX = pdS.DefaultPageSettings.PrinterSettings.DefaultPageSettings.HorizontalResolution ev.Graphics.DpiY = pdS.DefaultPageSettings.PrinterSettings.DefaultPageSettings.VerticalResolution ' 后续的缩放和绘制代码和之前一样 ' ... End Sub
按照上面的步骤调整后,应该能解决打印过小和空白方块的问题了。
内容的提问来源于stack exchange,提问作者Macronaute
相关产品推荐
相关产品推荐

