C# 用c语言打印图表#

C# 用c语言打印图表#,c#,printing,charts,C#,Printing,Charts,我可以使用以下工具打印c#项目中的图表: chart1.Printing.PrintDocument.DocumentName = "Graph of data"; 但是有没有可能给它加上一个标题呢?我希望文档名能实现这一点,但显然不行 如果您将图表控件放在Windows窗体上的面板控件中,这里有一个解决问题的解决方案。然后可以打印面板,在面板内可以添加文档标题作为标签以及任何其他要添加的内容 首先从工具箱中添加一个PrintDocument控件,并将其称为MyPrintDocument 然后

我可以使用以下工具打印c#项目中的图表:

chart1.Printing.PrintDocument.DocumentName = "Graph of data";

但是有没有可能给它加上一个标题呢?我希望文档名能实现这一点,但显然不行

如果您将
图表控件
放在Windows窗体上的
面板
控件中,这里有一个解决问题的解决方案。然后可以打印面板,在面板内可以添加文档标题作为标签以及任何其他要添加的内容

首先从工具箱中添加一个
PrintDocument
控件,并将其称为
MyPrintDocument

然后添加一个
面板
控件并将图表放入其中

确保导入了
System.Drawing
名称空间,然后可以这样打印面板

    Bitmap MyChartPanel = new Bitmap(panel1.Width, panel1.Height);
    panel1.DrawToBitmap(MyChartPanel, new Rectangle(0, 0, panel1.Width, panel1.Height));

    PrintDialog MyPrintDialog = new PrintDialog();

    if (MyPrintDialog.ShowDialog() == DialogResult.OK)
    {
        System.Drawing.Printing.PrinterSettings values;
        values = MyPrintDialog.PrinterSettings;
        MyPrintDialog.Document = MyPrintDocument;
        MyPrintDocument.PrintController = new System.Drawing.Printing.StandardPrintController();
        MyPrintDocument.Print();
    }

    MyPrintDocument.Dispose();
此代码将面板转换为
位图
,然后打印该
位图

您可以将其压缩为如下函数:

public void PrintPanel(Panel MyPanel)
{
   // Add code from above in here, changing panel1 to MyPanel...
}

您可以将任何需要的内容直接打印到页面,然后调用图表PrintPaint()。请注意,如果不将页面单位切换为像素,图表缩放就会变得混乱

void PrintChart(object sender, PrintPageEventArgs ev)
    {
        using (var f = new System.Drawing.Font("Arial", 10))
        {
            var size = ev.Graphics.MeasureString(Text, f);
            ev.Graphics.DrawString("Whatever text you want", f, Brushes.Black, ev.PageBounds.X + (ev.PageBounds.Width - size.Width) / 2, ev.PageBounds.Y);
        }

        //Note, the chart printing code wants to print in pixels.
        Rectangle marginBounds = ev.MarginBounds;
        if (ev.Graphics.PageUnit != GraphicsUnit.Pixel)
        {
            ev.Graphics.PageUnit = GraphicsUnit.Pixel;
            marginBounds.X = (int)(marginBounds.X * (ev.Graphics.DpiX / 100f));
            marginBounds.Y = (int)(marginBounds.Y * (ev.Graphics.DpiY / 100f));
            marginBounds.Width = (int)(marginBounds.Width * (ev.Graphics.DpiX / 100f));
            marginBounds.Height = (int)(marginBounds.Height * (ev.Graphics.DpiY / 100f));
        }

        chart1.Printing.PrintPaint(ev.Graphics, marginBounds);
    }
此菜单处理程序打开一个PrintDialog()。如果不需要对话框,可以调用
pd.Print()


您使用的是什么图表组件?它是针对.net 3.5SP1的Microsoft图表控件,但是如果它有很大的不同,我可以使用.net 4:非常聪明!我将试一试。。谢谢。让我知道它是否适合你,我没有完全测试它,因为我没有打印机!如果要求打印时程序未全屏显示,则会导致缩放图表时出现一些问题。所以我可能会坚持使用内置的打印功能。但是,您的解决方案让我找到了一种方法—捕获PrintPage事件并在顶部手动绘制字符串。现在的问题是理解为什么利润率不是他们说的那样,所以它不会在图表中间写。马克:你们有并没有找到更好的方法来处理这个问题[若程序并没有全屏显示,那个么用比例表?]并没有。这是很久以前的事了,但我认为选择的答案就是我使用的解决方案。
  private void printToolStripMenuItem_Click(object sender, EventArgs e)
    {
        var pd = new System.Drawing.Printing.PrintDocument();
        pd.PrintPage += new PrintPageEventHandler(PrintChart);

        PrintDialog pdi = new PrintDialog();
        pdi.Document = pd;
        if (pdi.ShowDialog() == DialogResult.OK)
            pdi.Document.Print();
    }