Histogram Control

 위의 그림은 지금부터 소개할 히스토그램을 실행한 것이다. 이 코드는 codeproject (http://www.codeproject.com)에서 가져온 내용을 조금 정리한 것이다.

 내용이야 뭐 보는 그대로이고, 항상 그러하듯 만드는 방법을 설명해 보자. 이 컨트롤은 static text 컨트롤에서 파생되어 나온 것이다.

 다이얼로그 베이스로 해도 상관없겠지만 여기서는 SDI의 뷰에서 마우스 왼쪽 버튼을 더블클릭하면 위의 그림과 같은 다이얼로그 박스가 하나 나오도록 만들 것이다.

소스 파일 받기      예제 프로젝트 받기

1. SDI 프로젝트를 하나 만든다. 여기서는 Histo 라고 프로젝트명을 지었다.
     소스파일을 받아서 프로젝트에 추가한다.

2. 리소스에 다이얼로그 템플릿을 하나 추가한다. ID는 IDD_HISTOGRAM 이라 한다.

3. 위의 그림처럼 컨트롤들을 배치한다. 여기서 IDC_HISTOGRAM은 static text 컨트롤이다. 라디오 버튼을 배치할 때 group 속성을 제대로 지정하는 걸 잊지 말 것. 참고로 이야기하자면 라디오 버튼을 배치할 때 같은 그룹으로 인식되려면 Ctrl-D 를 눌렀을 때 나오는 order 뿐만 아니라 리소스 값도 순서대로 되어 있어야 하고, 그룹내의 가장 선두의 라디오 박스 컨트롤만 group 속성을 체크한다.

4. 이 다이얼로그 박스에 연결되는 클래스를 만든다. 그냥 다이얼로그 템플릿 위에서 더블클릭하면 된다. 클래스 이름은 CHistogramDlg 라고 지었다.

5. 이 클래스에서 클래스 위저드를 사용해서 다음과 같이 변수들을 연결한다. 여기서 CAlexfStaticHistogram은 바로 나오지 않으므로 우선 CStatic 으로 연결한 후 헤더파일을 열어 직접 고치면 된다. m_bMotion은 히스토그램이 시작되는 위치를 왼쪽 또는 오른쪽으로 정하는 변수이고, m_bText는 화면에 나타나는 텍스트의 위치를 왼쪽 또는 오른쪽으로 정하는 변수이다.

IDC_HISTOGRAM                     CAlexfStaticHistogram              m_Histogram
IDC_RADIO_MOTION_LEFT       int                                           m_bMotion
IDC_RADIO_TEXT_LEFT           int                                           m_bText

6. 타이머에 사용할 변수를 다음처럼 하나 지정한다. 이 변수는 타이머가 살아있는지 확인하는데 사용된다.

public:
        BOOL m_bTimerLive;

7. HistogramDlg.cpp 파일을 열어 생성자를 다음과 같이 고친다. 처음에 m_bMotion과 m_bText는 -1이 대입되도록 되어있을 것이다.

 

8. WM_INITDIALOG 메시지의 핸들러를 작성한다. 아래의 코드에서 보듯 텍스트 폭은 30, 줄 수는 10 이다. 그리고 마지막 줄을 보면 처음에 50의 값으로 히스토그램 한 줄을 그리도록 되어있다.

9. 다음과 같이 각 컨트롤들의 핸들러를 작성한다.

 

10. 다음과 같이 타이머에 관계된 버튼의 핸들러를 구현한다. 여기서는 0.1 초 간격으로 타이머가 호출되도록 하였는데, 알다시피 타이머의 유효 최소시간간격은 1/18.2 = 0.055 초 가량된다. 이는 1초에 18.2번의 클럭이 걸리기 때문인데, 만약 이보다 더 빨리 시간간격을 정하고 싶다면 for문이나 while문 같은 순환문을 사용하면 된다. 그럴 경우 빠져나오는 조건을 주기위해서 다중 쓰레드를 이용하거나 메시지 펌프를 사용하면 된다.(메시지 펌프에 관한 내용은 홈 내용 참조)

11. 마지막으로 HistogramDlg.h 파일에 다음처럼 소스파일을 인클루드한다.

12. 앞에서 말했다시피 뷰에서 마우스 왼쪽 버튼을 더블클릭하면 다이얼로그 박스가 뜨도록 만든다.

다음과 같이 헤더파일을 뷰에 인클루드하고

다음처럼 핸들러를 작성한다.