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

TestProject.zip
다운로드

▶ MainForm.cs

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

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

        #region Field

        /// <summary>
        /// 최소 값
        /// </summary>
        private const int MIN_VALUE = 0;

        /// <summary>
        /// 최대 값
        /// </summary>
        private const int MAX_VALUE = 100;

        /// <summary>
        /// 값 배열
        /// </summary>
        private float[] valueArray = new float[10];

        /// <summary>
        /// 레이블 배열
        /// </summary>
        private Label[] labelArray = new Label[10];

        #endregion

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

        #region 생성자 - MainForm()

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

            #region 이벤트를 설정한다.

            Load                         += Form_Load;
            this.canvasPictureBox.Paint  += canvasPictureBox_Paint;
            this.canvasPictureBox.Resize += canvasPictureBox_Resize;

            #endregion
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private
        //////////////////////////////////////////////////////////////////////////////// Event

        #region 폼 로드시 처리하기 - Form_Load(sender, e)

        /// <summary>
        /// 폼 로드시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void Form_Load(object sender, EventArgs e)
        {
            Random random = new Random();

            for(int i = 0; i < this.valueArray.Length; i++)
            {
                this.valueArray[i] = random.Next(MIN_VALUE + 5, MAX_VALUE - 5);

                this.labelArray[i] = new Label();

                this.labelArray[i].Parent    = this.canvasPictureBox;
                this.labelArray[i].Text      = this.valueArray[i].ToString();
                this.labelArray[i].ForeColor = Color.Black;
                this.labelArray[i].BackColor = Color.Transparent;
                this.labelArray[i].AutoSize  = true;
            }
        }

        #endregion
        #region 캔버스 픽처 박스 페인트시 처리하기 - canvasPictureBox_Paint(sender, e)

        /// <summary>
        /// 캔버스 픽처 박스 페인트시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void canvasPictureBox_Paint(object sender, PaintEventArgs e)
        {
            DrawHistogram
            (
                e.Graphics,
                this.canvasPictureBox.BackColor,
                this.valueArray,
                this.canvasPictureBox.ClientSize.Width,
                this.canvasPictureBox.ClientSize.Height
            );
        }

        #endregion
        #region 캔버스 픽처 박스 크기 조정시 처리하기 - canvasPictureBox_Resize(sender, e)

        /// <summary>
        /// 캔버스 픽처 박스 크기 조정시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void canvasPictureBox_Resize(object sender, EventArgs e)
        {
            this.canvasPictureBox.Refresh();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Function

        #region 히스토그램 그리기 - DrawHistogram(graphics, backgroundColor, valueArray, width, height)

        /// <summary>
        /// 히스토그램 그리기
        /// </summary>
        /// <param name="graphics">그래픽스</param>
        /// <param name="backgroundColor">배경색</param>
        /// <param name="valueArray">값 배열</param>
        /// <param name="width">너비</param>
        /// <param name="height">높이</param>
        private void DrawHistogram(Graphics graphics, Color backgroundColor, float[] valueArray, int width, int height)
        {
            Color[] colorArray = new Color[]
            {
                Color.Red,
                Color.LightGreen,
                Color.Blue,
                Color.Pink,
                Color.Green,
                Color.LightBlue,
                Color.Orange,
                Color.Yellow,
                Color.Purple
            };

            graphics.Clear(backgroundColor);

            RectangleF dataBoundRectangle = new RectangleF(0, 0, valueArray.Length, MAX_VALUE);

            PointF[] pointArray =
            {
                new PointF(0, height),
                new PointF(width, height),
                new PointF(0, 0)
            };

            Matrix transformMatrix = new Matrix(dataBoundRectangle, pointArray);

            graphics.Transform = transformMatrix;

            using(Pen pen = new Pen(Color.Black, 0))
            {
                for(int i = 0; i < valueArray.Length; i++)
                {
                    RectangleF valueRectangle = new RectangleF(i, 0, 1, valueArray[i]);

                    using(Brush brush = new SolidBrush(colorArray[i % colorArray.Length]))
                    {
                        graphics.FillRectangle(brush, valueRectangle);

                        graphics.DrawRectangle
                        (
                            pen,
                            valueRectangle.X,
                            valueRectangle.Y,
                            valueRectangle.Width,
                            valueRectangle.Height
                        );
                    }

                    PointF[] valuePointArray =
                    {
                        new PointF
                        (
                            valueRectangle.Left + valueRectangle.Width / 2f,
                            valueRectangle.Bottom
                        )
                    };

                    transformMatrix.TransformPoints(valuePointArray);

                    this.labelArray[i].Location = new Point
                    (
                        (int)valuePointArray[0].X - this.labelArray[i].Width / 2,
                        (int)valuePointArray[0].Y - this.labelArray[i].Height
                    );
                }
            }

            graphics.ResetTransform();

            graphics.DrawRectangle(Pens.Black, 0, 0, width - 1, height - 1);
        }

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

댓글을 달아 주세요