개발환경: Microsoft Visual Studio 2010, MFC
아는 동생이 MFC로 히스토그램을 만들어서 시연하기 위한 코딩을 도와주면서 MFC를 오랜만에 접하게 되었다. 놀라운 얘기지만, 나는 학부 때 MFC 프로그램을 만들 일이 없었고, 연구실에서도 Java와 C 위주로만 개발하다 보니 MFC를 제대로 배운 적이 없다.
간단하게 윈도우 창에 히스토그램을 그려 주는 코드를 만들어 보면서, 혹시라도 나중에 데이터를 가지고 아주 간단한 시연(demonstration)을 할 때 급히 써먹을 가능성이 있을 것 같아서 기록하게 되었다. 막상 기록은 하게 됐지만 실상은 너무 간단하다.
- 먼저 X축과 Y축을 원하는 길이만큼 긋고,
- X축 위에 원하는 너비와 높이만큼 막대기를 배치한다.
끝. ㅡㅡ;
물론 더 보기 좋은 히스토그램을 그리고자 한다면 X축과 Y축 제목을 비롯해 고칠 것이 매우 많겠지만, 일단 기본 코드 위에서 그런 잡다한 작업을 시작하면 될 것이므로 기본 중의 기본만 남기게 되었다.
MFC에는 당연히 사각형을 그려 주는 함수가 있다. 그리기 개체(CClientDC)를 정의하고 FillSolidRect 함수를 이용하면 된다.
CClientDC pDC(this);
pDC.FillSolidRect( 0, 200, 50, 80, RGB(255,0,0) ); // (x,y)좌표: (0, 200), 너비: 50, 높이: 80, 색깔: 빨간색
단지 사각형을 그릴 때의 기준점(원점: (0,0))이 윈도우 창의 왼쪽 위에서 시작하고, Y 좌표값은 아래쪽으로 갈 수록 커진다는 것만 주의하면 된다.
우선 새로운 MFC 프로젝트를 만들 때 빈 윈도우 화면에 ChildView를 하나 만든 채로 시작했다.
프로젝트 이름을 hstorgram_140206으로 했더니 Visual Studio 2010에서 알아서 헤더와 소스 파일은 만들어 주었다.
편의를 위해 헤더 파일(historgram_140206.h)에 원점과 X,Y축 길이, 히스토그램 사각형(막대기)의 크기 등을 미리 정의했다.
// 새로 정의한 변수들
#define ORIGIN_X 20
#define ORIGIN_Y 560
#define X_AXIS_LENGTH 800
#define Y_AXIS_LENGTH 500
#define BAR_WIDTH 25
#define BAR_HEIGHT 20
#define BAR_COLOR RGB(0,255,0) // 녹색
ChildView.cpp 파일에는 onPaint() 함수에 히스토그램 그리는 작업을 했고, 막대기는 반복해서 그리기 때문에 별도의 함수로 만들었다.
/**
* 단색으로 채워진 사각형을 그립니다.
*
* @param x 히스토그램의 x축에서 사각형을 그리게 될 위치
* @param width 그려지는 사각형의 가로 길이
* @param height 그려지는 사각형의 세로 길이(y값)
* @label 해당 사각형의 레이블 값(x축에 적히는 글자)
*/
void CChildView::drawSolidRectangle(int x, int width, int height, CString label)
{
CClientDC pDC(this);
pDC.FillSolidRect(ORIGIN_X+x, ORIGIN_Y-height, width, height, BAR_COLOR);
pDC.SetBkColor( RGB(255,255,255) );
pDC.TextOutW(ORIGIN_X + x + (BAR_WIDTH/2), ORIGIN_Y+1, label);
}
void CChildView::OnPaint()
{
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.
// 그리기 객체 초기화
CClientDC pDC(this);
/*
* X축과 Y축 그리기.
* 참고로 (0,0)은 화면상에서 왼쪽 위.
*/
pDC.MoveTo(ORIGIN_X, ORIGIN_Y); // 원점으로 이동
pDC.LineTo(ORIGIN_X + X_AXIS_LENGTH, ORIGIN_Y); // X축 선 그리기
pDC.MoveTo(ORIGIN_X, ORIGIN_Y); // 원점으로 이동
pDC.LineTo(ORIGIN_X, ORIGIN_Y - Y_AXIS_LENGTH); // Y축 선 그리기
/*
* data 읽어오기
*/
// 텍스트 파일이나 DB에서 읽어오고자 할 경우 여기서 값을 로드합니다.
/*
* 색깔이 채워진 사각형(SolidRect) 그리기
* 여기서는 예제로 a부터 z까지 높이를 20씩 증가시켜 가며 자동으로 막대기를 그렸다.
*/
char ch = 'a'; // 각 사각형의 x축 레이블(테스트 목적으로 a~z 글자를 입력)
int i = 0;
for(i=0; i<26; i++){
drawSolidRectangle(BAR_WIDTH*i, BAR_WIDTH-1, BAR_HEIGHT*i, CString(ch));
ch++;
}
}
Visual Studio 2010 프로젝트 파일(zip):
'Development > 기타' 카테고리의 다른 글
이클립스(Eclipse): Package Explorer 창에서 SVN 관련 정보(label)가 사라졌을 때 복구 방법 (0) | 2015.01.02 |
---|---|
Java/XML: createTextNode with null parameters causes TransformerException (NullPointerException). (0) | 2014.09.24 |
각종 개발환경 텍스트 편집기에서 라인 이동 단축키 (0) | 2014.02.28 |
Eclipse / SVN Connector (SVN Kit, Native JavaHL) 수동 설치(재설치) 방법 (0) | 2014.01.22 |
Web Programming / JSP에서 UTF-8 설정을 통한 파일 내 한글입력 허가하기 (0) | 2009.03.10 |