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
 | 
						|
}
 |