더북(TheBook)

이제 m_Histogram 배열의 값을 화면에 그래프의 형태로 출력하는 코드를 작성해보자. 일반적으로 대화 상자에서의 화면 출력은 WM_PAINT 윈도우 메시지를 처리하는 OnPaint 함수에서 담당한다. 그러므로 클래스 마법사를 실행하여 CHistogramDlg 클래스에 WM_PAINT 메시지에 대한 처리기 함수 OnPaint를 추가하자. 그림 6-32를 참고하라.

그림 6-32 CHistogramDlg 클래스에 WM_PAINT 메시지 처리기 추가

이제 OnPaint 함수 안에 실제로 히스토그램을 그리는 코드를 작성해보자. 히스토그램을 화면에 출력하기 위해서는 CDC 클래스의 함수 중에서 MoveToLineTo 함수를 조합하여 사용하면 된다. MoveTo는 기준 점의 위치를 특정 좌표로 이동시키는 함수이고, LineToMoveTo 함수에 의해 설정된 기준 점 좌표로부터 직선을 그려주는 함수이다. LineTo 함수를 이용하여 직선을 그린 후에는 기준 점의 좌표가 직선의 종점으로 자동으로 이동하게 된다. OnPaint 함수에 추가해야 하는 내용은 소스 6-19에 나타내었다.

소스 6-19 OnPaint 함수에서 히스토그램 그리기(HistogramDlg.cpp)
void CHistogramDlg::OnPaint()
{
    CPaintDC dc(this); // device context for painting

    CGdiObject* pOldPen = dc.SelectStockObject(DC_PEN);

    // 히스토그램 박스
    dc.SetDCPenColor(RGB(128, 128, 128));
    dc.MoveTo(20, 20);
    dc.LineTo(20, 120);
    dc.LineTo(275, 120);
    dc.LineTo(275, 20);

    // 각 그레이스케일에 해당하는 히스토그램 출력
    dc.SetDCPenColor(RGB(0, 0, 0));
    for (int i = 0; i < 256; i++)
    {
        dc.MoveTo(20 + i, 120);
        dc.LineTo(20 + i, 120 - m_Histogram[i]);
    }

    // 그레이스케일 레벨 출력
    for (int i = 0; i < 256; i++)
    {
        dc.SetDCPenColor(RGB(i, i, i));
        dc.MoveTo(20 + i, 130);
        dc.LineTo(20 + i, 145);
    }
    dc.SelectObject(pOldPen);
}

OnPaint 함수의 시작에서는 CPaintDC라는 MFC 클래스를 이용하여 히스토그램 대화 상자의 DC 값을 얻어온다. 그리고 MoveToLineTo 함수를 이용하여 히스토그램을 출력할 위치에 박스를 그린다. 실제 히스토그램을 그리는 부분은 함수 중간에 있는 for 루프에서 담당한다. OnPaint 함수의 마지막에 있는 for 루프에서는 그레이스케일의 밝기 값을 히스토그램 아래에 바bar의 형태로 나타내기 위한 코드이다. OnPaint 함수 중간중간에 나타나는 SelectStockObjectSetDCPenColor 함수는 선을 그리는 펜pen의 색상을 지정하기 위해 사용된 함수들이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.