打印准确可读的图表可能是一项棘手的任务,尤其是在打印包含大量数据的图表时。根据用例和要求,可以有多种打印图表的方法。例如,当图表中的数据较少或您想了解整个数据模式而不知道详细的数据点时,在一个页面上打印图表是个好主意。另一方面,当您要研究统计图详细信息时,可以在每页上显示一个统计图,甚至可以在多个页面上显示一个分为子图或图表片段的单个图。
在FlexChart中,可以使用C1.Chart.FlexChart.Printing程序集执行打印,该程序集可以通过构建名为C1.Chart.FlexChart.Printing的产品示例代码,访问项目内部的obj\Debug文件夹来获得。该程序集提供ChartPrinter类,以在FlexChart中实现打印。以下各节讨论如何在各种打印方案中使用此类。
注意: 如果在安装WinForms Edition时安装了示例,则C1.Chart.FlexChart.Printing示例位于\文档\ComponentOne Samples\WinForms\v4.5.2\C1FlexChart\CS\FlexChartPrint。
单页打印
在FlexChart中,可以通过创建上述ChartPrinter类的实例在单个页面上打印图表。构造函数有两个参数,一个是目标FlexChart实例,另一个是指示是否显示打印对话框的布尔值。然后,您需要使用PrintScale枚举指定是否需要缩放图表以进行打印,该枚举可让您根据可用空间将图表缩放比例设置为无,适合,拉伸和缩放。您还可以根据需要选择设置自定义页面和打印机设置,灰度等,然后调用PrintCtrl方法,该方法接受PrintScale和某些设置作为其参数。
private void btnPrint_Click(object sender, EventArgs e)
{
//create Printer FlexChart
ChartPrinter chartPrinter = new ChartPrinter(flexChart1, true);
//set settings for page
if (PageSettngs == null)
PageSettngs = new PageSettings() { Landscape = true };
//replace default page settings with custom page settings
chartPrinter.PageSettingsProp = PageSettngs;
//replace default printer settings with custom printer settings, if any
if (PrinterSettngs != null)
{
chartPrinter.PrintSettingsProp = PrinterSettngs;
}
//set whether or not to resize FlexChart according to the print rectangle
ChartPrinter.PrintScale pscale =
(ChartPrinter.PrintScale)Enum.Parse(typeof(ChartPrinter.PrintScale), "None");
//set whether to print in GrayScale or not
chartPrinter.UseGrayScale = false;
bool usePrintPreview = true;
bool printAsBitmap = false;
//print FlexChart with specific printer and page settings
chartPrinter.PrintCtrl(pscale, new Rectangle(100,200,400,400), PageSettngs, printAsBitmap, usePrintPreview);
}
多页打印
在很多情况下,需要将一个或多个图表打印在多页上。为了实现多页打印,我们需要结合使用上述ChartPrinter类和 PrintDocument类。该PrintDocument的类,有相关的打印设置,提供实现主要打印作业所需的PrintPage事件。。您可以根据布局需求使用ChartPrinter类的PrinterCtrlToPage方法, FlexChart类的DrawChart方法或Graphics的DrawImage方法。在此示例中,我们演示了如何以子图表的形式在多个页面上打印单个图表。
private void btnSubCharts_Click(object sender, EventArgs e)
{
if (PageSettngs == null)
PageSettngs = new PageSettings { Landscape = true };
PrintDocument pd = new PrintDocument();
pd.DefaultPageSettings = PageSettngs;
pd.PrinterSettings = PrinterSettngs;
int pageNumber = 0;
// determine the limits over which the chart should be printed.
int pageCount = 4;
double minXValue = 0;
double maxXValue = ShowAxisY.AxisX.ActualMax;
double increment = (maxXValue - minXValue) / pageCount;
double minFlex = double.NaN, maxFlex = double.NaN;
double minFlexY = double.NaN, maxFlexY = double.NaN;
int bitmapLeft = 0;
pd.BeginPrint += (pageSender, beginPrintEventArgs) =>
{
if(ShowAxis)
{
// save the current axis limits
minFlex = ShowAxisY.AxisX.Min;
maxFlex = ShowAxisY.AxisX.Max;
minFlexY = ShowAxisY.AxisY.Min;
maxFlexY = ShowAxisY.AxisY.Max;
ShowAxisY.AxisX.Min = minXValue;
ShowAxisY.AxisX.Max = increment;
ShowAxisY.AxisY.Min = ShowAxisY.AxisY.ActualMin;
ShowAxisY.AxisY.Max = ShowAxisY.AxisY.ActualMax;
}
else
{
bitmapLeft = 0;
}
pageNumber = 0;
};
pd.PrintPage += (pageSender, printPageEventArgs) =>
{
pageNumber++;
if (ShowAxis)
{
// Each chart or page could use a different FlexChart instance, but in this case
// subsets of a single FlexChart instance is used.
ChartPrinter chartPrinter = new ChartPrinter(ShowAxisY, true);
// The chart is drawn within the rectangle assuming coordinates relative
// to the Top-Left page margin as specified in the prinPageEventArgs.
// An empty rectangle indicates a full page rather than a limited
// rectangle on the page.
Rectangle rect = new Rectangle(0, 0, 0, 0);
printPageEventArgs.HasMorePages = pageNumber < 30; // sanity check to avoid endless loop.
chartPrinter.PrinterCtrlToPage(pd, printPageEventArgs, ChartPrinter.PrintScale.Fit, rect, false);
}
else
{
int pageWidth = PageSettngs.Bounds.Width - PageSettngs.Margins.Left - PageSettngs.Margins.Right;
int pageHeight = PageSettngs.Bounds.Height - PageSettngs.Margins.Top - PageSettngs.Margins.Bottom;
int bitMapWidth = pageCount * pageWidth;
int bitMapHeight = pageHeight;
int incremnt = bitMapWidth / pageCount;
Bitmap bitmap = new Bitmap(bitMapWidth, bitMapHeight);
using (Graphics gr = Graphics.FromImage(bitmap))
{
this.ShowAxisY.DrawChart(gr, new Size(bitMapWidth, bitMapHeight));
}
Graphics g = printPageEventArgs.Graphics;
g.DrawImage(bitmap,
new Rectangle(PageSettngs.Margins.Left, PageSettngs.Margins.Top, incremnt, bitMapHeight),
new Rectangle(bitmapLeft, 0, incremnt, bitMapHeight),
GraphicsUnit.Pixel);
bitmapLeft += incremnt;
}
if(ShowAxis)
{
bool morePages = ShowAxisY.AxisX.Max < maxXValue;
printPageEventArgs.HasMorePages = morePages;
if (morePages)
{
// set up for the next page.
ShowAxisY.AxisX.Min += increment;
ShowAxisY.AxisX.Max += increment;
}
}
else
{
bool morepages = pageNumber < 8;
printPageEventArgs.HasMorePages = morepages;
}
};
pd.EndPrint += (pageSender, endPrintEventArgs) =>
{
if(ShowAxis)
{
// restore the axis limits
ShowAxisY.AxisX.Max = maxFlex;
ShowAxisY.AxisX.Min = minFlex;
ShowAxisY.AxisY.Max = maxFlexY;
ShowAxisY.AxisY.Min = minFlexY;
}
else
{
bitmapLeft = 0;
}
// reset for next print from preview dialog.
pageNumber = 0;
};
ChartPrinter.ChartPreviewDialogEx(pd, true);
pd.Dispose();
}
有关更多打印方案和详细的实现,请参阅控件附带的FlexChartExplorer示例。

