226 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			226 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.ComponentModel;
 | |
| using System.Drawing;
 | |
| using System.Drawing.Printing;
 | |
| 
 | |
| namespace DevComponents.DotNetBar.Charts
 | |
| {
 | |
|     [ToolboxItem(false)]
 | |
|     public class ChartPrint : PrintDocument
 | |
|     {
 | |
|         #region Private variables
 | |
| 
 | |
|         private ChartControl _ChartControl;
 | |
|         private Image _ChartImage;
 | |
| 
 | |
|         private Rectangle _PrintBounds;
 | |
| 
 | |
|         private int _Columns;
 | |
|         private int _Rows;
 | |
| 
 | |
|         private int _CurCell;
 | |
| 
 | |
|         private FitToPageScale _FitToPageScale = FitToPageScale.Normal;
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Constructors
 | |
| 
 | |
|         /// <summary>
 | |
|         /// ChartPrint
 | |
|         /// </summary>
 | |
|         public ChartPrint()
 | |
|             : base()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// ChartPrint
 | |
|         /// </summary>
 | |
|         /// <param name="chartControl">ChartControl</param>
 | |
|         public ChartPrint(ChartControl chartControl)
 | |
|             : base()
 | |
|         {
 | |
|             _ChartControl = chartControl;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// ChartPrint
 | |
|         /// </summary>
 | |
|         /// <param name="chartControl">ChartControl</param>
 | |
|         /// <param name="fitToPageScale">FitToPageScale</param>
 | |
|         public ChartPrint(ChartControl chartControl, FitToPageScale fitToPageScale)
 | |
|             : base()
 | |
|         {
 | |
|             _ChartControl = chartControl;
 | |
|             _FitToPageScale = fitToPageScale;
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Public properties
 | |
| 
 | |
|         #region FitToPageScale
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets how the chart is scaled
 | |
|         /// to fit the page when printing.
 | |
|         /// </summary>
 | |
|         public FitToPageScale FitToPageScale
 | |
|         {
 | |
|             get { return (_FitToPageScale); }
 | |
|             set { _FitToPageScale = value; }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region OnBeginPrint
 | |
| 
 | |
|         protected override void OnBeginPrint(PrintEventArgs e)
 | |
|         {
 | |
|             base.OnBeginPrint(e);
 | |
| 
 | |
|             if (_ChartControl == null)
 | |
|                 throw new Exception("ChartControl has not been set.");
 | |
| 
 | |
|             Size size = _ChartControl.ClientSize;
 | |
| 
 | |
|             _PrintBounds = DefaultPageSettings.Bounds;
 | |
| 
 | |
|             Margins margins = DefaultPageSettings.Margins;
 | |
| 
 | |
|             _PrintBounds.X += margins.Left;
 | |
|             _PrintBounds.Width -= (margins.Left + margins.Right);
 | |
| 
 | |
|             _PrintBounds.Y += margins.Top;
 | |
|             _PrintBounds.Height -= (margins.Top + margins.Bottom);
 | |
| 
 | |
|             _Columns = (int)Math.Ceiling((double)size.Width / _PrintBounds.Width);
 | |
|             _Rows = (int)Math.Ceiling((double)size.Height / _PrintBounds.Height);
 | |
| 
 | |
|             _CurCell = 0;
 | |
| 
 | |
|             _ChartImage = new Bitmap(size.Width, size.Height);
 | |
| 
 | |
|             using (Graphics g = Graphics.FromImage(_ChartImage))
 | |
|                 _ChartControl.PaintTo(g);
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region OnPrintPage
 | |
| 
 | |
|         protected override void OnPrintPage(PrintPageEventArgs e)
 | |
|         {
 | |
|             base.OnPrintPage(e);
 | |
| 
 | |
|             switch (FitToPageScale)
 | |
|             {
 | |
|                 case Charts.FitToPageScale.Stretch:
 | |
|                     PrintStretchPage(e);
 | |
|                     break;
 | |
| 
 | |
|                 case Charts.FitToPageScale.Zoom:
 | |
|                     PrintZoomPage(e);
 | |
|                     break;
 | |
| 
 | |
|                 default:
 | |
|                     PrintNormalPage(e);
 | |
|                     break;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #region PrintNormalPage
 | |
| 
 | |
|         private void PrintNormalPage(PrintPageEventArgs e)
 | |
|         {
 | |
|             Graphics g = e.Graphics;
 | |
| 
 | |
|             int curRow = _CurCell / _Columns;
 | |
|             int curColumn = _CurCell % _Columns;
 | |
| 
 | |
|             int x = curColumn * _PrintBounds.Width;
 | |
|             int y = curRow * _PrintBounds.Height;
 | |
| 
 | |
|             Rectangle rs = new Rectangle(x, y, _ChartImage.Width - x, _ChartImage.Height - y);
 | |
|             Rectangle rd = new Rectangle(_PrintBounds.X, _PrintBounds.Y, _ChartImage.Width - x, _ChartImage.Height - y);
 | |
| 
 | |
|             Region saveClip = g.Clip;
 | |
| 
 | |
|             g.SetClip(_PrintBounds);
 | |
|             g.DrawImage(_ChartImage, rd, rs, GraphicsUnit.Pixel);
 | |
|             g.Clip = saveClip;
 | |
| 
 | |
|             _CurCell++;
 | |
| 
 | |
|             e.HasMorePages = (_CurCell < _Columns * _Rows);
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region PrintStretchPage
 | |
| 
 | |
|         private void PrintStretchPage(PrintPageEventArgs e)
 | |
|         {
 | |
|             Rectangle rs = new Rectangle(0, 0, _ChartImage.Width, _ChartImage.Height);
 | |
| 
 | |
|             e.Graphics.DrawImage(_ChartImage, _PrintBounds, rs, GraphicsUnit.Pixel);
 | |
| 
 | |
|             e.HasMorePages = false;
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region PrintZoomPage
 | |
| 
 | |
|         private void PrintZoomPage(PrintPageEventArgs e)
 | |
|         {
 | |
|             Rectangle rd = _PrintBounds;
 | |
| 
 | |
|             SizeF size = new SizeF(_ChartImage.Width / _ChartImage.HorizontalResolution,
 | |
|                 _ChartImage.Height / _ChartImage.VerticalResolution);
 | |
| 
 | |
|             float scale = Math.Min(rd.Width / size.Width, rd.Height / size.Height);
 | |
| 
 | |
|             size.Width *= scale;
 | |
|             size.Height *= scale;
 | |
| 
 | |
|             e.Graphics.DrawImage(_ChartImage, rd.X, rd.Y, size.Width, size.Height);
 | |
| 
 | |
|             e.HasMorePages = false;
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region OnEndPrint
 | |
| 
 | |
|         protected override void OnEndPrint(PrintEventArgs e)
 | |
|         {
 | |
|             base.OnEndPrint(e);
 | |
| 
 | |
|             if (_ChartImage != null)
 | |
|                 _ChartImage.Dispose();
 | |
| 
 | |
|             _ChartImage = null;
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
|     }
 | |
| 
 | |
|     #region FitToPageScale
 | |
| 
 | |
|     public enum FitToPageScale
 | |
|     {
 | |
|         Normal,
 | |
| 
 | |
|         Stretch,
 | |
|         Zoom,
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| }
 |