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

打印含自定义标签与用户输入文本框的Chart图表问题求助

解决Chart打印时无法包含自定义标签和文本框的问题

当前代码仅实现了Chart本身的打印,自定义标签和文本框属于独立控件,不会自动被包含在Chart的打印范围内,需要手动在PrintPage事件中添加这些元素的绘制逻辑。

修改后的完整代码

Private Sub btnPrintSpectrum_Click(sender As Object, e As EventArgs) Handles btnPrint.Click 
    Dim printDoc As New Printing.PrintDocument()
    AddHandler printDoc.PrintPage, AddressOf Chart_PrintPage
    printDoc.DefaultPageSettings.Landscape = True
    printDoc.DefaultPageSettings.Margins = New Printing.Margins(0, 1, 1, 1)
    Chart1.Printing.PrintDocument = printDoc
    Chart1.Printing.PrintPreview()
End Sub 

Private Sub Chart_PrintPage(ByVal sender As Object, ByVal ev As Printing.PrintPageEventArgs)
    ' 1. 打印Chart,预留下方空间给其他控件
    Dim chartHeight = ev.MarginBounds.Height - 120 ' 按需调整预留高度
    Dim chartPosition As New Rectangle(ev.MarginBounds.X, ev.MarginBounds.Y, ev.MarginBounds.Width, chartHeight)
    Chart1.Printing.PrintPaint(ev.Graphics, chartPosition)

    ' 2. 打印自定义标签(替换为你的标签控件名)
    Dim targetLabel = Label1
    Using labelBrush As New SolidBrush(targetLabel.ForeColor)
        Dim labelPos = New Point(chartPosition.X, chartPosition.Bottom + 15)
        ev.Graphics.DrawString(targetLabel.Text, targetLabel.Font, labelBrush, labelPos)
        ' 可选:绘制标签边框
        ev.Graphics.DrawRectangle(Pens.Gray, labelPos.X, labelPos.Y, targetLabel.Width, targetLabel.Height)
    End Using

    ' 3. 打印文本框(替换为你的文本框控件名)
    Dim targetTextBox = TextBox1
    Using textBoxBrush As New SolidBrush(targetTextBox.ForeColor)
        Dim textBoxPos = New Point(chartPosition.X, chartPosition.Bottom + 50)
        ev.Graphics.DrawString(targetTextBox.Text, targetTextBox.Font, textBoxBrush, textBoxPos)
        ' 可选:绘制文本框边框
        ev.Graphics.DrawRectangle(Pens.Black, textBoxPos.X, textBoxPos.Y, targetTextBox.Width, targetTextBox.Height)
    End Using
End Sub 

关键说明

  • 调整Chart的打印高度,避免和后续控件重叠,预留高度可根据实际控件总尺寸修改。
  • 用Graphics.DrawString绘制控件文本,保持与原控件一致的字体、颜色,确保打印效果和屏幕显示匹配。
  • 若需要还原控件边框样式,通过Graphics.DrawRectangle绘制对应矩形即可。
  • 用Using语句包裹Brush对象,自动释放资源,避免内存泄漏。

批量打印多个控件的优化写法

如果有多个自定义控件需要打印,可通过循环批量处理,减少重复代码:

Private Sub Chart_PrintPage(ByVal sender As Object, ByVal ev As Printing.PrintPageEventArgs)
    ' 打印Chart
    Dim chartHeight = ev.MarginBounds.Height - 200
    Dim chartPosition As New Rectangle(ev.MarginBounds.X, ev.MarginBounds.Y, ev.MarginBounds.Width, chartHeight)
    Chart1.Printing.PrintPaint(ev.Graphics, chartPosition)

    ' 定义需要打印的控件集合(替换为你的控件)
    Dim controlsToPrint = New List(Of Control) From {Label1, TextBox1, Label2, TextBox2}
    Dim currentY = chartPosition.Bottom + 15 ' 起始Y坐标

    For Each ctrl In controlsToPrint
        Using brush As New SolidBrush(ctrl.ForeColor)
            ' 绘制文本
            ev.Graphics.DrawString(ctrl.Text, ctrl.Font, brush, chartPosition.X, currentY)
            ' 绘制边框
            ev.Graphics.DrawRectangle(Pens.Black, chartPosition.X, currentY, ctrl.Width, ctrl.Height)
            ' 下移Y坐标并添加间距
            currentY += ctrl.Height + 10
        End Using
    Next
End Sub 

内容的提问来源于stack exchange,提问作者Nate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:01:20