打印含自定义标签与用户输入文本框的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
相关产品推荐
相关产品推荐

