더북(TheBook)

SendMessage 함수는 MFC 클래스 중 CWnd 클래스의 멤버 함수이다. 동일한 이름의 Windows API 함수가 있지만, 여기서는 CWnd 클래스의 멤버 함수에 대해서만 설명하겠다. 이 함수는 해당 윈도우에 특정 메시지를 발생시키는 기능을 한다. 사용자가 ImageTool 프로그램의 메뉴 중에서 [새로 만들기] 메뉴 항목을 선택한 것처럼 메시지를 발생시키기 위해서는 다음과 같이 코드를 작성한다.

AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_FILE_NEW);

SendMessage 함수의 첫 번째 인자는 윈도우 메시지의 종류를 나타낸다. WM_COMMAND 메시지는 프로그램에서 메뉴 항목이 선택되었을 때 발생하는 메시지이다. WM_COMMAND 메시지를 발생시킬 경우, 선택된 메뉴의 아이디(ID)를 SendMessage 함수의 두 번째 인자로 전달해야 한다. 그러므로 앞의 문장은 ID_FILE_NEW라는 아이디를 가진 메뉴 항목이 선택되었다고 ImageTool 프로그램에 알려주는 기능을 하는 것이다. AfxGetMainWnd 함수는 MFC 응용 프로그램의 메인 프레임 윈도우의 포인터를 반환하는 함수이다.

그림 5-33에서 설명한 방법으로 특정 영상을 새 창으로 띄우기 위하여 몇 가지 준비 작업을 먼저 수행하도록 하자. 우선 CImageToolApp 클래스에 IppDib* 타입의 변수 m_pNewDib를 추가하자. 일반 변수가 아니라 포인터 형 변수임에 유의하자. 이를 위해서 ImageTool.h 파일을 수정해야 하며, 수정할 사항들은 소스 5-10에 나타내었다.

소스 5-10 영상을 새 창으로 띄우기 위해 ImageTool.h 파일에 추가한 코드(ImageTool.h)
class IppDib;
class CImageToolApp : public CWinAppEx
{
public:
    CImageToolApp();

public:
    IppDib* m_pNewDib;

// 재정의입니다.
public:
    virtual BOOL InitInstance();
    virtual int ExitInstance();
…
};

extern CImageToolApp theApp;

// 전역 함수 선언
void AfxNewBitmap(IppDib& dib);

소스 5-10에서 맨 처음에 나타나는 class IppDib; 문장은 IppDib라는 이름의 클래스를 사용할 것임을 선언한 것이다. 이 문장을 넣는 이유는 CImageToolApp 클래스에서 IppDib* 타입의 변수를 사용하기 때문이다. 소스 5-10의 맨 아래에는 AfxNewBitmap이라는 이름의 전역 함수 선언을 추가하였다. 이 함수는 IppDib 객체를 참조형reference type으로 넘겨받아 그와 동일한 DIB 객체를 생성하여 새 창으로 띄우는 역할을 할 것이다. 즉, 영상을 새 창으로 띄우는 핵심 기능을 수행하는 함수이다. AfxNewBitmap 함수는 ImageTool.h 파일에 전역 함수로 선언하였기 때문에 ImageTool 프로그램 어디에서든 호출할 수 있다. MFC에서 사용되는 전역 함수의 이름은 일반적으로 Afx-로 시작하기 때문에 여기서도 함수 이름 앞에 Afx-를 붙였다.

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