5.4.1 영상을 확대하여 출력하기
대부분의 영상 편집 프로그램은 영상을 확대 또는 축소해서 보여주는 기능을 가지고 있다. 아무래도 영상을 자세히 관찰하려면 영상을 확대하여 보는 것이 유리하므로 ImageTool 프로그램에도 영상을 확대해서 보여주는 기능을 추가하려고 한다. 영상을 확대하여 보여주는 것은 영상 데이터를 조작하는 것이 아니라 단순히 보여주는 방법을 바꾸는 것이기 때문에 뷰 클래스인 CImageToolView에서 담당하는 것이 적합하다. 이 절에서 구현할 기능은 영상을 정상 크기인 1배 크기로 보기부터 2배, 3배, 4배로 확대하여 보기 기능이다. 영상을 축소하여 보여주는 기능은 이 책에서는 구현하지 않을 것이며, 축소 기능이 필요한 사람은 이 절의 내용을 참조하여 직접 구현해보기 바란다.
CImageToolView 클래스는 현재 영상이 몇 배로 확대해서 보여져야 하는지를 기억하고 있을 멤버 변수를 하나 가지고 있어야 한다. 클래스 뷰에서 CImageToolView 클래스를 선택하고, 마우스 오른쪽 버튼을 클릭하자. 그리고 컨텍스트 메뉴 중에서 [추가] > [변수 추가...]를 선택하면 그림 5-40과 같은 멤버 변수 추가 마법사가 나타날 것이다. 여기서 액세스는 public, 변수 형식은 int, 변수 이름은 m_nZoom이라고 입력하고 [마침] 버튼을 클릭하자.
m_nZoom 멤버 변수는 1부터 4까지의 정숫값을 저장하게 될 것이며, 이는 영상을 확대하여 보여줄 배율을 의미한다. m_nZoom 멤버 변수의 값에 따라 영상의 크기를 확대하여 보여주려면 어떻게 해야 할까? 일단 영상을 화면에 출력하는 코드는 CImageToolView 클래스의 OnDraw 함수에서 담당하고 있고, 실제 화면 출력은 IppDib 클래스의 Draw 멤버 함수를 이용하고 있다. Draw 멤버 함수는 여러 개의 함수 원형을 가지고 있는데, 이 중 비트맵이 표시될 영역을 지정할 수 있는 형식도 있다. 그러므로 OnDraw 함수에서 다음과 같이 m_nZoom 값을 고려하여 비트맵을 출력하면 확대 출력이 가능하다.
int w = pDoc->m_Dib.GetWidth(); int h = pDoc->m_Dib.GetHeight(); pDoc->m_Dib.Draw(pDC->m_hDC, 0, 0, w * m_nZoom, h * m_nZoom);
위 코드에서 사용된 Draw 함수는 다섯 개의 인자를 사용하며, 네 번째와 다섯 번째 인자가 영상의 출력 크기를 지정하는 것이다. 즉, 위의 코드는 뷰 영역의 좌상단 (0, 0) 좌표부터 가로 w * m_nZoom 크기, 세로 h * m_nZoom 크기로 영상을 출력하라는 명령이다. 이때 w와 h는 영상의 가로, 세로 크기를 의미한다.
이로써 비트맵 영상을 확대해서 보여주는 것까지는 구현이 완료되었다. 그러나 이 외에도 몇 가지 수정이 필요한 부분이 있는데, 먼저 스크롤 기능을 수정해보자. 앞서 5.1절에서 창 크기를 영상의 크기에 맞추기에 대해 설명하면서, SetScrollSizes 함수를 이용하여 스크롤바가 나타나야 하는 크기를 지정한 바 있다. 이때 영상의 가로 크기와 세로 크기를 스크롤바가 나타나야 하는 크기로 설정하였는데, 영상을 확대하여 출력할 경우에는 스크롤바가 나타나야 하는 크기도 같이 수정해주어야 한다. 다음으로 수정할 사항은 m_nZoom 변수의 초기화 루틴이다. 멤버 변수 추가 마법사를 이용하여 정수형 변수 m_nZoom을 추가하면 CImageToolView 생성자 함수에서 m_nZoom을 0으로 초기화한다. 그러나 m_nZoom 변수가 가질 수 있는 값은 1부터 4 사이의 정숫값이어야 하므로 생성자 함수에서 이 값을 1로 변경해야 한다.