더북(TheBook)

BmpShow 프로그램은 사용자가 뷰의 클라이언트 영역에서 마우스 왼쪽 버튼을 클릭했을 때, 클릭한 위치에 lenna.bmp 파일의 비트맵을 화면에 출력할 것이다. 이를 위해 먼저 마우스 버튼 클릭에 대한 이벤트 처리 함수를 추가해보자. Ctrl+Shift+X 키를 눌러 클래스 마법사를 실행시키고, 그림 3-13과 같이 WM_LBUTTONDOWN 메시지에 대한 이벤트 처리기를 추가하자. 우측 상단의 클래스 이름을 CBmpShowView 클래스로 변경하는 것을 잊지 않아야 한다. 클래스 마법사에서 윈도우 메시지 이벤트 처리기 추가에 대해 아직 익숙하지 않다면 이 책의 2.4절 클래스 마법사 설명을 다시 한 번 읽어보기 바란다. OnLButtonDown 함수가 추가되었으면 오른쪽 [코드 편집] 버튼을 눌러서 곧바로 코드 편집 창으로 이동하자.

그림 3-13 클래스 마법사 - 메시지 처리기 추가

이제 OnLButtonDown 함수의 뼈대는 만들어졌으니 여기에 BMP 파일을 불러와서 화면에 출력하는 코드를 추가해보자. 가장 먼저 BMP 파일을 읽는 코드를 작성해야 한다. 일반적인 C 언어에서는 FILE 구조체의 포인터형 변수와 fopen 함수를 이용하여 파일 입출력을 수행한다. 그러나 Visual C++에서는 보안상의 문제로 fopen 대신 fopen_s라는 함수를 대신 사용하도록 권고하고 있다. fopen_s 함수가 표준 C 함수는 아니지만, 어쨌든 Windows 환경에서 프로그램을 만들고 있는 상황이니 fopen 대신 fopen_s를 사용하여 BMP 파일을 열 것이다. 프로그램 실행 폴더와 동일한 폴더에 존재하는 lenna.bmp 파일을 열기 위해서는 아래와 같은 코드를 사용한다.

FILE* fp = NULL;
fopen_s(&fp, "lenna.bmp", "rb");
if (!fp)
    return;

fopen_s 함수의 첫 번째 인자에는 FILE* 타입 변수의 주소(이중 포인터)를 전달하고, 두 번째 인자에는 열고자 하는 파일 이름을 전달한다. 세 번째 인자에서는 파일 열기 모드를 지정하는데, "rb"는 이진binary 모드 및 읽기read 모드를 의미한다.

파일 열기가 성공하면 다음은 비트맵 파일 헤더와 비트맵 정보 헤더를 읽는다. BITMAPFILEHEADER와 BITMAPINFOHEADER를 읽는 코드는 아래와 같으며, 설명을 간결하게 하기 위해 예외 사항에 대한 처리 코드는 일단 제외하였다. 파일 입출력 코드를 좀 더 안전하게 작성하려면, fread 함수가 정상적으로 수행되었는지를 체크하는 것이 바람직하다. 예외 처리까지 추가된 코드는 뒷쪽의 소스 3-1을 참고하라.

BITMAPFILEHEADER bmfh;
fread(&bmfh, sizeof(BITMAPFILEHEADER), 1, fp);

// 파일 맨 처음 2바이트가 'BM'인지 체크!

BITMAPINFOHEADER bmih;
fread(&bmih, sizeof(BITMAPINFOHEADER), 1, fp);

LONG nWidth = bmih.biWidth;
LONG nHeight = bmih.biHeight;
WORD nBitCount = bmih.biBitCount;
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.