본문 바로가기
공부/C#

C# 그래프 그리기...like 노가다...

by ding9 2012. 7. 2.

 

현재 진행중인 프로젝트에서 그래프가 필요해서 검색을 해봤더니....

 

다들 안에 있는 툴을 사용하거나 실시간 혹은 데이터 변경시 다시 그래프를 그려주는건 없다....

 

물론....

 

샅샅히 뒤져보진 않았지만..ㅡㅡㅋ

 

그래서 예전에 MFC에서 사용했던 기술(?)을 C#에 적용해봤는데.... 어랏!!!

 

된다....ㅡㅡㅋ

 

그래서 우선 올린다...

 

일단은 막대그래프만.... 꺽은선그래프도 만들수 있는데 고건 나중에... 지금 네턱쪽이 더 급하니..ㅠ.ㅠ

 

일단 윈폼예제를 만든다....

 

그리고 그 위에 패널1개와 버튼 1개를 그린다....

 

그리고 버튼에 클릭이벤트를 생성하고....

 

panel1.Invaildate(true); 요놈 추가

 

글고 panel1에서 페인트이벤트를 추가한 다음...

 

브러시랑 글씨 객체를 선언해서 그린다....

 

여기서 중요한건.... 이건 위치를 직접 지정해줘야하는거라서 약간의 노가다가 들어간다.. 그래서 like 노가다...ㅡㅡ;;;

 

아래는 panel1_paint에 들어갈 소스...

 

///////////////////////////////////////////////////////////////////////////////////////////

            Graphics g = e.Graphics;
            int xsize, ysize;

            //panel10 사이즈 143, 150;
            ///그래프그리는 선
            SolidBrush axisX = new SolidBrush(Color.Black);
            SolidBrush axisY = new SolidBrush(Color.Black);

            Font y_name = new Font(FontFamily.GenericSerif, 10F, FontStyle.Regular);
            Font row = new Font(FontFamily.GenericSerif, 8F, FontStyle.Regular);

            ///데이터선.
            SolidBrush meas1 = new SolidBrush(Color.Red);
            SolidBrush meas2 = new SolidBrush(Color.Blue);
            SolidBrush meas3 = new SolidBrush(Color.Cyan);
            SolidBrush meas4 = new SolidBrush(Color.Yellow);

            ///그래프그리기

            g.FillRectangle(axisY, 5, 5, 2, 125);       //y축
            g.FillRectangle(axisX, 5, 130, 125, 2);     //x축
            g.FillRectangle(axisX, 35, 125, 1, 10);     //x축 표시
            g.FillRectangle(axisX, 85, 125, 1, 10);     //x축 표시
            g.DrawString("x1", row, Brushes.Black, 25, 135);//x축
            g.DrawString("x2", row, Brushes.Black, 75, 135);//y축
            g.FillRectangle(meas3, 15, 130 - 15, 100, 2);//설정라인표시
            g.FillRectangle(meas4, 15, 130 - 85, 100, 2);
            g.DrawString("15", row, Brushes.Black, 120, 110);//설정 기준값
            g.DrawString("85", row, Brushes.Black, 120, 40);//설정 기준값

            if (cnt != 0)
            {

                if (cnt > 2)
                {
                    buffx[0] = buffx[1];
                    buffy[0] = buffy[1];
                    buffx[1] = (cnt % 20) + 10;
                    buffy[1] = (cnt % 20) + 80;
                }
                else
                {
                    buffx[cnt - 1] = (cnt % 20) + 10;
                    buffy[cnt - 1] = (cnt % 20) + 80;
                }

                ///데이터 표시
                if (cnt > 2)
                {
                    g.FillRectangle(meas1, 25, 130 - buffx[0], 10, buffx[0]);//그래프그리기
                    g.FillRectangle(meas2, 35, 130 - buffy[0], 10, buffy[0]);
                    g.DrawString(buffx[0].ToString(), row, Brushes.Black, 10, 115 - buffx[0]);//값표시
                    g.DrawString(buffy[0].ToString(), row, Brushes.Black, 30, 115 - buffy[0]);
                    g.FillRectangle(meas1, 75, 130 - buffx[1], 10, buffx[1]);//그래프그리기
                    g.FillRectangle(meas2, 85, 130 - buffy[1], 10, buffy[1]);
                    g.DrawString(buffx[0].ToString(), row, Brushes.Black, 60, 115 - buffx[0]);//값표시
                    g.DrawString(buffy[0].ToString(), row, Brushes.Black, 80, 115 - buffy[0]);
                }
                else
                {
                    for (int i = 0; i < cnt; i++)
                    {
                        g.FillRectangle(meas1, (i * 50) + 25, 130 - buffx[i], 10, buffx[i]); //그래프그리기
                        g.FillRectangle(meas2, (i * 50) + 35, 130 - buffy[i], 10, buffy[i]);
                        g.DrawString(buffx[i].ToString(), row, Brushes.Black, (i * 50) + 10, 115 - buffx[i]);//값표시
                        g.DrawString(buffy[i].ToString(), row, Brushes.Black, (i * 50) + 30, 115 - buffy[i]);
                    }
                }
                axisX.Dispose();
                axisY.Dispose();
                meas1.Dispose();
                meas2.Dispose();
                meas3.Dispose();
                meas4.Dispose();
            }

////////////////////////////////////////////////////////////////////////////////////////////////

 

중요한건 buffx랑 buffy는 int[]로 선언해주고 생성자에서 new로 int[4]할당...

 

글고 cnt는 선언할때 초기화해주던지 아님 생성자에서 초기화 해주고 버튼클릭이벤트에 cnt++;만 추가해주면됨...

 

 

 

요게 실행화면....

 

버튼 클릭할때마다 값과 그래프가 새로 그려진다...

 

아직 본인도 좋은 실력이 아닌지라 panel사이즈 얻어와서 하고 하면 좋긴한데... 고런건 우선은 패스!!!! 시간이 없응께..ㅡㅡ;;

 

암튼 이놈의 장점이자 단점은 x축 y축에 이름이나 인자값을 사용자가 지정해줄수 있다는점~~~~~

 

근데 그게 단점이라는 점~~~~ 일일이 맞춰야하니까;;;;

 

쨋든 좀더 자세하고 단순한 건 조만간 올리도록하겠음.. 더 보완해서 꺽은선까지...ㅋ

 

일단 그래프는 여기서...끝!!!!!

반응형

'공부 > C#' 카테고리의 다른 글

C# 텍스트박스 Textbox에 숫자만 입력받기  (0) 2012.07.05
C# 다이어로그(dialog) Show와 ShowDialog의 차이점.  (2) 2012.07.05
C# 기초공부2  (0) 2012.06.01
C# 기초공부 1  (0) 2012.05.25
C#프로젝트 만들기  (0) 2012.05.25

댓글