더북(TheBook)

WM_ERASEBKGND 메시지는 해당 윈도우의 배경이 지워져야 하는 경우에 발생하는 메시지이다. MFC 프로그래밍에서는 WM_ERASEBKGND 메시지가 발생하면 자동으로 OnEraseBkgnd 함수를 호출하도록 설정되어 있다. 클래스 마법사가 만들어준 OnEraseBkgnd 함수 내부에는 아래와 같은 코드 한 줄만 작성되어 있다.

return CScrollView::OnEraseBkgnd(pDC);

이 코드는 상위 클래스인 CScrollView 클래스의 OnEraseBkgnd 함수를 호출하는데, 이 함수는 뷰 영역 전체를 흰색으로 칠하는 작업이 수행된다. 결국 차일드 프레임 창 크기를 변경하면 뷰 화면 전체를 흰색으로 지웠다가 비트맵 영상을 다시 그리기 때문에 화면이 깜박거리는 것처럼 보이는 것이다. 이러한 깜박거림 현상을 없애기 위하여 OnEraseBkgnd 함수를 소스 5-6과 같이 수정해보자.

소스 5-6 영상의 바깥 영역에 빗금 그리기(ImageToolView.cpp)
BOOL CImageToolView::OnEraseBkgnd(CDC* pDC)
{
    CBrush br;
    br.CreateHatchBrush(HS_DIAGCROSS, RGB(200, 200, 200));
    FillOutsideRect(pDC, &br);

    return TRUE;
}

수정된 OnEraseBkgnd 함수에서는 먼저 FillOutsideRect 함수를 이용하여 영상의 바깥 부분을 빗금 무늬를 이용하여 채우는 작업을 추가하였다. FillOutsideRect 함수는 CScrollView 클래스의 멤버 함수로써 스크롤되는 영역의 바깥 부분을 지정된 브러쉬brush로 채워준다. CBrush 클래스는 특정 영역을 채우는 색상 또는 패턴에 대한 정보를 가지는 브러쉬를 추상화한 클래스로써 소스 6에서는 브러쉬의 패턴을 대각선 모양(HS_DIAGCROSS)으로, 색상은 옅은 회색(RGB(200, 200, 200))으로 지정하였다.

OnEraseBkgnd 함수의 return 문장에는 기존에 있던 CScrollView::OnEraseBkgnd(pDC) 문장을 삭제하고, 단순히 TRUE를 반환하도록 변경하였다. TRUE를 반환한다는 것은 배경 영역을 지우는 작업이 정상적으로 종료했음을 의미한다. 결국 스크롤 영역 내부는 OnDraw 함수에서 비트맵 영상으로 그리고, 스크롤 영역 바깥은 OnEraseBkgnd 함수에서 빗금 무늬로 채우게 되어 전체적으로 정상적인 화면 출력이 완성된다.

그림 5-19는 OnEraseBkgnd 함수를 수정한 후의 프로그램 동작 모습을 보여준다. 영상의 바깥 영역이 빗금으로 그려져 있기 때문에 여백 부분임을 더욱 확실하게 인지할 수 있게 되었다. 그리고 차일드 프레임 윈도우의 크기를 빠르게 변경해보아도 영상이 깜박거리지 않음을 확인하였다.

그림 5-19 ImageTool 프로그램에서 영상 바깥 영역에 빗금 그리기
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.