티스토리 뷰
이전에 동적인 그래프를 그렸으니 이번에는 정적인 그래프를 그려보자..
동적인 그래프와 다른 점은 단지 데이터가 계속 추가되는 것이 아니라 한번 설저앟면 그대로 보여준다는 것..
즉, AddData가 아니라 SetData정도가 되어서 데이터의 배열을 받고 출력하고, OnPaint에만 추가 시키면 되는 간단한 방식이 될 것이다.
CGraph를 만들고 기존의 CAnimatedGraph의 내용들을 살펴하자...
public:
// 로그 데이터 배열
CArray<float> m_arrLogData;
public:
// 그래프를 그릴 영역
RECT m_rectGraphArea;
public:
// x축 그리드 그릴 수
int m_nXGridNumber;
public:
// y축 그리드 그릴 수
int m_nYGridNumber;
public:
// y축 최대값
float m_fYMax;
public:
// y축 최소값
float m_fYMin;
public:
// 데이터를 추가하는 함수
int AddData(float data);
public:
// 현재 데이터 크기를 리턴하는 함수
int GetDataSize(void);
public:
// 그리기 함수
int Draw(CDC* pDC);
public:
// 그래프를 그릴 영역을 설정
int SetArea(LONG x1, LONG y1, LONG x2, LONG y2);
public:
// 바로 그래프 그리기에 사용할 수 있도록 저장하는 배열(m_arrData를 정교화한 내용)
CArray<CPoint> m_arrPoints;
public:
// 한번에 뿌려줄 데이터 출력
int SetViewDataSize(int size);
public:
// 한번에 보여줄 데이터의 크기
int m_nViewDataSize;
public:
// 최대 최소값 설정
int SetYMinMax(float YMin, float YMax);
// 로그 데이터 배열
CArray<float> m_arrLogData;
public:
// 그래프를 그릴 영역
RECT m_rectGraphArea;
public:
// x축 그리드 그릴 수
int m_nXGridNumber;
public:
// y축 그리드 그릴 수
int m_nYGridNumber;
public:
// y축 최대값
float m_fYMax;
public:
// y축 최소값
float m_fYMin;
public:
// 데이터를 추가하는 함수
int AddData(float data);
public:
// 현재 데이터 크기를 리턴하는 함수
int GetDataSize(void);
public:
// 그리기 함수
int Draw(CDC* pDC);
public:
// 그래프를 그릴 영역을 설정
int SetArea(LONG x1, LONG y1, LONG x2, LONG y2);
public:
// 바로 그래프 그리기에 사용할 수 있도록 저장하는 배열(m_arrData를 정교화한 내용)
CArray<CPoint> m_arrPoints;
public:
// 한번에 뿌려줄 데이터 출력
int SetViewDataSize(int size);
public:
// 한번에 보여줄 데이터의 크기
int m_nViewDataSize;
public:
// 최대 최소값 설정
int SetYMinMax(float YMin, float YMax);
여기서 필요없는 내용은...뭐, 굳이 따지자면 AddData정도일 것이다.
나머지는 그냥 그대로 가져다가 써도 괜찮고, 단지 정적인 그래프기 때문에 데이터를 위에서 말한 것 처럼 SetData 함수를 추가하면 될 것이다.
음....이렇게 되면 가장 좋은 방법은 역시 CAnimatedGraph를 상속 받는 것이겠다..상속받아서 전부 함수들을 그대로 활용하고, SetData함수만 우리가 추가하면 되는 것이다.
// 입력할 데이터, 데이터 크기
int CGraph::SetData(float* data, int dataSize)
{
for(int loop = 0 ; loop < dataSize ; loop++)
{
this->m_arrLogData.Add(data[loop]);
}
return 0;
}
int CGraph::SetData(float* data, int dataSize)
{
for(int loop = 0 ; loop < dataSize ; loop++)
{
this->m_arrLogData.Add(data[loop]);
}
return 0;
}
그럼 활용법은....간단하다..
기존의 AnimatedGraph의 예제와 같이 사용하되, Timer에서 계속 AddData를 하는 것이 아니라 그냥 어떠한 이벤트를 통해서 SetData(float* , int) 함수를 호출하면 되는 것이다. 물론, 호출하고 나서 InvalidateRect(&graph.m_rectGarphArea)로 다시 그려주는 것도 잊지 말아야한다. 간단하게 보여주면..
this->m_cRawDataGraph.SetArea(10 , 10 , 210 , 110);
this->m_cRawDataGraph.SetViewDataSize(100);
this->m_cRawDataGraph.SetYMinMax(-10,10);
this->m_cRawDataGraph.SetData(data , dataSize);
this->InvalidateRect(m_cRawDataGraph.m_rectGraphArea);
이런 소스를 넣고 AnimatedGraph와 똑같이 OnPaint에 그래프.draw()호출을 넣으면 그래프가 그려진다!
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 안드로이드
- google app engine
- TIP
- lecture
- mini project
- 사진
- 뽐뿌
- gre
- Writing
- 강좌
- c++
- gae
- HTML5
- 탐론 17-50
- 속깊은 자바스크립트 강좌
- GX-10
- 안드로이드 앱 개발 기초
- 서울
- ny-school
- php
- K100D
- java
- 삼식이
- Javascript
- 자바스크립트
- HTML5 튜토리얼
- 샷
- 팁
- Python
- Android
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함