더북(TheBook)

기본적으로 생성된 OnDraw 함수 본체의 코드를 살펴보자. GetDocument() 함수는 해당 뷰 클래스와 연관된 도큐먼트 클래스의 포인터를 얻어오는 함수이다. 즉, CFirstView 클래스에서 GetDocument 함수를 호출하면 CFirstDoc 클래스의 포인터를 받을 수 있다. 화면 출력은 도큐먼트 클래스가 가지고 있는 데이터를 기반으로 이루어지기 때문에 MFC 응용 프로그램 마법사에서 기본적으로 이 코드를 제공하는 것이다. 그 밑의 ASSERT_VALID 또는 if 문은 GetDocument() 함수에 의해 얻어진 pDoc 포인터 값이 유효한지를 검사하는 코드이다.

OnDraw 함수에서 화면에 무언가를 그리고자 한다면 주석으로 쓰여 있는 // TODO 문장 대신 실제 그리기 코드를 추가하면 된다. 예를 들어 뷰 영역에 간단한 구구단을 출력하려면 소스 2-1과 같이 코드를 입력하면 된다.

소스 2-1 구구단을 출력하기 위해 수정된 OnDraw 함수 (FirstView.cpp)
void CFirstView::OnDraw(CDC* pDC)
{
    CFirstDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    int i, dan;
    CString str;

    for (dan = 2; dan <= 9; dan++)
    {
        for (i = 1; i <= 9; i++)
        {
            str.Format(_T("%dx%d=%d"), dan, i, dan * i);
            pDC->TextOut((dan - 2) * 70 + 20, 20 * i, str);
        }
    }
}

소스 2-1에서 사용된 CString 클래스는 MFC에서 제공하는 문자열 처리 클래스이다. CString 클래스는 Format이라는 이름의 멤버 함수를 제공하며 이 함수로 원하는 형태의 문자열을 구성할 수 있다. Format 함수의 사용법은 C 언어의 문자열 출력 함수인 printf 함수의 사용법과 거의 동일하다. 즉, 함수의 인자로 서식 문자열과 필요한 인수를 추가하여 문자와 숫자가 포함된 문자열을 만들 수 있다. 다만, First 프로젝트가 유니코드 문자 집합을 사용하기 때문에 서식 문자열 부분을 _T() 매크로를 사용하여 감싸주었다. 문자열을 화면에 출력하기 위해서는 CDC 클래스의 TextOut 함수를 사용하였는데, 이 함수는 x, y 좌표와 문자열을 인자로 받아 윈도우 내 (x, y) 좌표에 문자열을 출력한다.

그림 2-40은 소스 2-1과 같이 OnDraw 함수를 수정한 후 First 프로그램을 실행한 결과이다. 구구단 2단부터 9단까지 모두 화면에 나타난 것을 볼 수 있다. 만약 [파일] > [새로 만들기] 메뉴를 실행하여 새 차일드 윈도우를 생성하면 그 창의 뷰 영역에도 마찬가지로 구구단이 출력될 것이다.

그림 2-40 OnDraw( ) 함수에서 구구단 출력
Note | Visual Studio와 유니코드, 그리고 _T( ) 매크로

유니코드는 세계 각국의 언어를 컴퓨터에서 통일된 방법으로 표현할 수 있도록 제정된 표준 문자 표현 방식이다. 예전 버전의 Visual Studio에서는 새 프로젝트를 생성할 때 유니코드 라이브러리를 사용할 것인지를 선택할 수 있었지만, Visual Studio 2013부터는 유니코드 사용이 기본으로 설정된다. 그러므로 Visual Studio Community 2015 버전에서도 기본적으로 유니코드를 사용한다.

유니코드를 사용할 경우 프로그램 소스 코드에서 모든 문자열은 _T("문자열") 형태로 사용하는 것을 권장한다. 즉, CString 타입에 문자열을 저장하려면 다음과 같은 형태로 코드를 작성해야 한다.

CString strHello = _T("안녕하세요");

CString gugudan;
gugudan.Format(_T("%d x %d = %d"), 4, 9, 4 * 9);

만약 예전에 멀티 바이트 문자 인코딩(MBSC)을 사용하던 시절에 만들었던 소스 코드를 Visual Studio 2015 버전에서 사용하려고 한다면 위와 같이 _T( ) 매크로를 사용하여 문자열을 감싸서 사용해야 한다.

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