You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET打印图表:调整大小失败及打印出现空白方块求助

解决VB.NET中Chart控件打印过小及空白方块问题

一、先解决打印图表过小的问题

你原来的代码里有两个小细节导致图表打印尺寸不足:

  1. 重复设置了横向打印(同时操作了pdS和Chart_Requis.Printing.PrintDocument),其实只需要统一配置你创建的PrintDocument实例即可;
  2. 直接使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 21:32:54