첨부 소스 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

TestProject.zip
0.01MB

▶ MainForm.cs

using System;
using System.Drawing;
using System.Windows.Forms;

using Steema.TeeChart;
using Steema.TeeChart.Drawing;
using Steema.TeeChart.Styles;
using Steema.TeeChart.Tools;

namespace TestProject
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : Form
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 라인
        /// </summary>
        private Line line;

        /// <summary>
        /// 셀렉터
        /// </summary>
        private Selector selector;

        /// <summary>
        /// 현재 선택
        /// </summary>
        private object currentSelection;

        /// <summary>
        /// 임시 제목
        /// </summary>
        private Title temporaryTitle;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainForm()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            Text = "ICloneable 구현을 사용해 객체 복사하기";

            this.tChart.Panel.Pen                = new ChartPen(Color.Black);
            this.tChart.Axes.Bottom.Grid.Visible = false;
            this.tChart.Axes.Left.Grid.Visible   = false;

            this.line = new Line(this.tChart.Chart);

            this.line.FillSampleValues();

            Annotation annotation = new Annotation(this.tChart.Chart);

            annotation.Text     = "객체 선택 후 CTRL+V 키를 눌러주시기 바랍니다.";
            annotation.Position = AnnotationPositions.LeftTop;

            this.selector = new Selector(this.tChart.Chart);

            this.selector.AllowDrag = false;

            this.tChart.KeyDown    += tChart_KeyDown;
            this.tChart.AfterDraw  += tChart_AfterDraw;
            this.selector.Selected += selector_Selected;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region TChart 키 DOWN 처리하기 - tChart_KeyDown(sender, e)

        /// <summary>
        /// TChart 키 DOWN 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void tChart_KeyDown(object sender, KeyEventArgs e)
        {
            Annotation temporaryAnnotation;
            Series     temporarySeries;
            Axis       temporaryAxis;

            if(e.Control == true && e.KeyCode == Keys.V)
            {
                if(this.currentSelection is ICloneable)
                {
                    if(this.currentSelection is Annotation)
                    {
                        temporaryAnnotation = (this.currentSelection as ICloneable).Clone() as Annotation;

                        temporaryAnnotation.Shape.CustomPosition = true;
                        temporaryAnnotation.Left                 = temporaryAnnotation.Left + 50;
                        temporaryAnnotation.Top                  = temporaryAnnotation.Top  + 50;

                        this.tChart.Invalidate();
                    }
                    else if(this.currentSelection is Series)
                    {
                        temporarySeries = (this.currentSelection as ICloneable).Clone() as Series;

                        for(int i = 0; i < temporarySeries.Count; i++)
                        {
                            temporarySeries.XValues[i] = temporarySeries.XValues[i] + 1;
                        }

                        temporarySeries.Invalidate();
                    }
                    else if(this.currentSelection is Axis)
                    {
                        temporaryAxis = (this.currentSelection as ICloneable).Clone() as Axis;

                        this.tChart.Axes.Custom.Add(temporaryAxis);

                        temporaryAxis.RelativePosition = temporaryAxis.RelativePosition + 10;

                        if(temporaryAxis.Horizontal)
                        {
                            this.line.CustomHorizAxis = temporaryAxis;
                        }
                        else
                        {
                            this.line.CustomVertAxis = temporaryAxis;
                        }
                    }
                    else if(this.currentSelection is Title)
                    {
                        temporaryTitle = (this.currentSelection as ICloneable).Clone() as Title;

                        temporaryTitle.Top = temporaryTitle.Top + 20;

                        this.tChart.Invalidate();
                    }
                    else if(this.currentSelection is Legend)
                    {
                        ExtraLegend extraLegend = new ExtraLegend(this.tChart.Chart);

                        extraLegend.Series      = this.line;
                        extraLegend.Legend      = this.currentSelection as Legend;
                        extraLegend.Legend.Left = this.tChart.Legend.Left - 50;
                    }
                }
            }
        }

        #endregion
        #region TChart 그리기 후 처리하기 - tChart_AfterDraw(sender, graphics3D)

        /// <summary>
        /// TChart 그리기 후 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="graphics3D">그래픽스 3D</param>
        private void tChart_AfterDraw(object sender, Graphics3D graphics3D)
        {
            if(this.temporaryTitle != null)
            {
                this.temporaryTitle.CustomPosition = true;

                Rectangle chartRectangle = this.tChart.Chart.ChartRect;

                this.temporaryTitle.DoDraw(graphics3D, ref chartRectangle, true, "제목");
            }
        }

        #endregion
        #region 셀렉터 선택시 처리하기 - selector_Selected(sender, e)

        /// <summary>
        /// 셀렉터 선택시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void selector_Selected(object sender, EventArgs e)
        {
            this.currentSelection = this.selector.Selection;
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요