반응형

개발환경: 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): 

histogram_140206_2.zip




반응형
블로그 이미지

Bryan_

,