본문 바로가기
Information

Visual C++ 2015로 시작하는 MFC 윈도우 프로그래밍: 쉽고 빠른 마스터 가이드

by 19ksjkf 2025. 10. 29.
Visual C++ 2015로 시작하는 MFC 윈도우 프로그래밍: 쉽고 빠른 마스터 가이드
배너2 당겨주세요!

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
반응형

Visual C++ 2015로 시작하는 MFC 윈도우 프로그래밍: 쉽고 빠른 마스터 가이드

 

목차

  1. MFC 윈도우 프로그래밍, 왜 지금도 중요할까요?
  2. Visual C++ 2015 개발 환경 설정하기
    • Visual Studio 2015 설치 및 구성 요소 확인
    • MFC 라이브러리 이해하기
  3. 첫 번째 MFC 프로젝트 생성 및 기본 구조 이해
    • MFC 응용 프로그램 마법사 활용
    • MFC 프로젝트의 주요 파일 및 클래스
  4. 기본 컨트롤 다루기: 윈도우 UI의 시작
    • 리소스 뷰와 대화 상자 에디터
    • 버튼(Button)과 정적 텍스트(Static Text) 추가 및 이벤트 처리
  5. 문서/뷰 아키텍처 (Document/View Architecture) 심층 분석
    • CDocumentCView 클래스의 역할
    • 데이터 관리와 화면 출력의 분리
  6. 이벤트 처리 (메시지 맵) 및 사용자 입력 처리
    • 메시지 맵 매크로의 이해
    • 자주 사용되는 메시지 처리 함수
  7. 실습: 간단한 메모장 프로그램 구현 맛보기
    • 메뉴 추가 및 파일 입출력 함수 연결
    • 뷰 클래스에서 화면 그리기 (GDI) 기초

1. MFC 윈도우 프로그래밍, 왜 지금도 중요할까요?

MFC(Microsoft Foundation Class) 라이브러리는 C++ 언어를 기반으로 하여 Windows API를 객체 지향적으로 캡슐화한 클래스들의 집합입니다. 1990년대부터 윈도우 응용 프로그램 개발의 핵심 도구였으며, 시간이 흐르면서 .NET 프레임워크나 WPF 등 새로운 기술들이 등장했지만, 여전히 강력한 이점을 제공하며 많은 분야에서 사용되고 있습니다. 특히, 레거시 시스템 유지 보수, 높은 성능이 요구되는 네이티브(Native) 데스크톱 애플리케이션 개발, 그리고 하드웨어 제어와 밀접한 전문 분야의 소프트웨어 개발에 있어서 MFC는 그 가치를 잃지 않고 있습니다. Visual C++ 2015는 안정적인 개발 환경을 제공하여 이러한 MFC 기반 프로젝트를 쉽고 빠르게 구축할 수 있도록 돕습니다. MFC를 익히는 것은 윈도우 운영체제의 동작 원리와 객체 지향 프로그래밍의 실제 적용 사례를 깊이 이해하는 데 큰 도움이 됩니다.

2. Visual C++ 2015 개발 환경 설정하기

Visual Studio 2015 설치 및 구성 요소 확인

MFC 윈도우 프로그래밍을 시작하기 위해서는 Visual Studio 2015 개발 환경이 필수적입니다. 설치 시 주의해야 할 점은 Visual C++ 구성 요소가 반드시 포함되어야 하며, 특히 MFC 및 ATL 지원 옵션을 활성화해야 합니다. 이 구성 요소가 누락될 경우 MFC 관련 헤더 파일이나 라이브러리를 사용할 수 없어 프로젝트 생성이 불가능해집니다. 설치 후 Visual Studio를 실행하고 새 프로젝트 생성 메뉴에서 Visual C++ 템플릿 항목을 확인할 수 있다면 환경 설정은 완료된 것입니다.

MFC 라이브러리 이해하기

MFC는 수많은 클래스로 구성되어 있으며, 이들은 크게 다음과 같은 역할을 수행합니다.

  • 응용 프로그램 및 프레임워크 클래스 (Application & Framework Classes): CWinApp (응용 프로그램 자체를 나타냄), CFrameWnd (메인 윈도우 프레임), CDialog (대화 상자) 등 프로그램의 기본 구조와 동작을 정의합니다.
  • 컨테이너 클래스 (Container Classes): 배열(CArray), 리스트(CList), 맵(CMap) 등 데이터를 구조적으로 저장하고 관리하는 데 사용됩니다.
  • 그래픽 장치 인터페이스 (GDI) 클래스: CDC (장치 컨텍스트), CPen, CBrush 등 화면에 그래픽을 그리거나 텍스트를 출력하는 기능을 담당합니다.
  • 파일 및 데이터베이스 클래스: 파일 입출력(CFile)이나 데이터베이스 연동(ODBC 또는 DAO) 기능을 제공합니다.

MFC의 핵심은 Windows API의 복잡한 구조를 C++ 클래스 객체로 캡슐화하여 개발자가 더 직관적이고 객체 지향적인 방식으로 윈도우 요소를 다룰 수 있게 해주는 데 있습니다.

3. 첫 번째 MFC 프로젝트 생성 및 기본 구조 이해

MFC 응용 프로그램 마법사 활용

Visual Studio 2015에서 MFC 프로젝트를 가장 쉽고 빠르게 생성하는 방법은 **MFC 응용 프로그램 마법사(MFC Application Wizard)**를 사용하는 것입니다.

  1. 파일 > 새로 만들기 > 프로젝트 선택
  2. 설치됨 > Visual C++ > MFC에서 MFC 응용 프로그램을 선택하고 프로젝트 이름과 위치를 지정합니다.
  3. 마법사 창에서 다음 단계를 진행합니다.
    • 응용 프로그램 종류: 단일 문서, 다중 문서 (MDI), 또는 대화 상자 기반 중에서 선택합니다. 가장 단순한 시작은 대화 상자 기반입니다.
    • 문서 템플릿 문자열: 문서/뷰 아키텍처를 사용할 경우 응용 프로그램에 표시될 제목 등을 설정합니다.
    • 사용자 인터페이스 기능: 메뉴, 상태 표시줄, 도구 모음 등 기본 UI 요소를 선택합니다.
    • 고급 기능: 인쇄 및 미리 보기, ActiveX 컨트롤 지원 등 추가 기능을 선택할 수 있습니다.
  4. 마침을 클릭하면 기본적인 윈도우 애플리케이션 뼈대가 자동으로 생성됩니다.

MFC 프로젝트의 주요 파일 및 클래스

마법사로 생성된 프로젝트에는 여러 파일과 클래스가 포함됩니다.

  • [프로젝트명]App.h / [프로젝트명]App.cpp: 응용 프로그램 클래스(CWinApp 상속)를 정의하며, 프로그램의 초기화(InitInstance) 및 종료를 담당합니다. MFC 응용 프로그램의 진입점과 같습니다.
  • MainFrm.h / MainFrm.cpp: 주 프레임 윈도우 클래스(CFrameWnd 또는 CMDIFrameWnd 상속)를 정의합니다. 응용 프로그램의 메인 윈도우 레이아웃과 메뉴, 툴바 등을 관리합니다.
  • [프로젝트명]Doc.h / [프로젝트명]Doc.cpp (문서/뷰 아키텍처의 경우): 데이터 모델 역할을 하는 문서 클래스(CDocument 상속)입니다.
  • [프로젝트명]View.h / [프로젝트명]View.cpp (문서/뷰 아키텍처의 경우): 화면 출력 및 사용자 입력을 처리하는 뷰 클래스(CView 상속)입니다.
  • Resource.h / .rc 파일: UI 요소(메뉴, 아이콘, 대화 상자, 문자열 등)의 정의를 담고 있는 리소스 파일입니다.

4. 기본 컨트롤 다루기: 윈도우 UI의 시작

리소스 뷰와 대화 상자 에디터

MFC에서 UI 요소를 디자인하는 작업은 리소스 뷰를 통해 접근하는 **대화 상자 에디터(Dialog Editor)**에서 이루어집니다.

  1. 리소스 뷰 창에서 프로젝트의 리소스 목록 중 Dialog 폴더를 확장합니다.
  2. 기본으로 생성된 대화 상자(예: IDD_ABOUTBOX, 또는 프로젝트명에 따른 IDD_... 다이얼로그)를 더블클릭하면 대화 상자 에디터가 열립니다.
  3. **도구 상자(Toolbox)**에서 버튼, 에디트 컨트롤, 체크 박스 등 원하는 컨트롤을 선택하여 대화 상자 위에 드래그 앤 드롭으로 배치할 수 있습니다.

버튼(Button)과 정적 텍스트(Static Text) 추가 및 이벤트 처리

사용자 인터페이스의 기본은 컨트롤을 배치하고, 해당 컨트롤에 대한 사용자 상호작용(이벤트)을 처리하는 것입니다.

  1. 버튼 추가: 도구 상자에서 버튼을 선택하여 대화 상자에 배치합니다. 배치된 버튼의 속성 창에서 ID를 IDC_MY_BUTTON 등으로 변경하고, 캡션(Caption)을 '클릭하세요' 등으로 설정합니다.
  2. 이벤트 핸들러 추가: 버튼을 더블클릭하면 Visual Studio는 자동으로 해당 버튼 클릭 이벤트를 처리할 수 있는 메시지 핸들러 함수를 클래스 파일에 추가할 것을 제안합니다. 예를 들어, CDialogEx를 상속받은 클래스에 OnBnClickedMyButton()이라는 함수가 생성됩니다.
  3. 정적 텍스트 추가: 정적 텍스트(Static Text)는 단순히 정보를 표시하는 용도로 사용됩니다. 이 역시 도구 상자에서 추가하고 원하는 텍스트를 속성 창에서 입력할 수 있습니다.

버튼 클릭 이벤트 핸들러 함수 내부에 코드를 작성하여 버튼이 클릭되었을 때의 동작(예: 메시지 박스 출력, 다른 컨트롤의 값 변경 등)을 정의합니다. 예를 들어, AfxMessageBox(_T("버튼이 클릭되었습니다!")) 코드를 추가하면 버튼 클릭 시 메시지 박스가 나타나게 됩니다.

5. 문서/뷰 아키텍처 (Document/View Architecture) 심층 분석

CDocumentCView 클래스의 역할

MFC의 문서/뷰 아키텍처는 응용 프로그램의 데이터(문서)와 데이터의 표현(뷰)을 분리하여 관리하는 강력한 디자인 패턴입니다.

  • CDocument: 응용 프로그램의 데이터를 저장하고 관리하는 역할을 합니다. 파일 저장 및 불러오기, 데이터의 수정, 데이터 변경 시 뷰에게 알림(UpdateAllViews()) 등의 기능을 수행합니다. 이는 MVC(Model-View-Controller) 패턴의 모델(Model)에 해당합니다.
  • CView: CDocument가 가진 데이터를 사용자에게 시각적으로 보여주고, 사용자로부터의 입력(마우스 클릭, 키보드 입력 등)을 받아 문서를 수정하는 역할을 합니다. 이는 MVC 패턴의 뷰(View) 및 컨트롤러(Controller)의 일부 역할을 수행합니다.

데이터 관리와 화면 출력의 분리

이 아키텍처의 가장 큰 장점은 데이터의 일관성과 여러 뷰 지원입니다. 예를 들어, 스프레드시트 프로그램에서 차트 뷰와 표 뷰 두 가지 방법으로 같은 데이터를 보여줄 수 있습니다. 데이터가 변경되면 (문서에서) 모든 연결된 뷰에게 데이터가 갱신되었음을 알리고, 각 뷰는 자신에게 맞게 화면을 다시 그립니다.

주요 재정의 함수는 다음과 같습니다.

  • CDocument::Serialize(): 파일 입출력 시 데이터의 직렬화(저장 및 로드)를 담당합니다.
  • CView::OnDraw(CDC* pDC): 뷰 윈도우가 다시 그려져야 할 때 호출되며, 데이터를 가져와 화면에 실제로 출력(GDI)하는 코드가 여기에 작성됩니다.
  • CView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint): 문서의 UpdateAllViews() 호출에 의해 뷰가 갱신되어야 할 때 호출됩니다.

6. 이벤트 처리 (메시지 맵) 및 사용자 입력 처리

메시지 맵 매크로의 이해

Windows 운영체제는 윈도우에서 발생하는 모든 사건(마우스 클릭, 키 입력, 창 크기 변경, 타이머 등)을 메시지 형태로 관리합니다. MFC는 이 복잡한 메시지 시스템을 **메시지 맵(Message Map)**이라는 효율적인 메커니즘으로 처리합니다.

메시지 맵은 클래스 정의 파일(.cpp)에 BEGIN_MESSAGE_MAP, ON_WM_..., END_MESSAGE_MAP 매크로를 사용하여 구현됩니다.

BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_WM_LBUTTONDOWN() // 왼쪽 마우스 버튼 클릭 메시지
    ON_COMMAND(ID_FILE_OPEN, &CMyView::OnFileOpen) // 메뉴 명령 메시지
END_MESSAGE_MAP()

이 매크로는 MFC 내부적으로 클래스와 특정 메시지(ID)가 발생했을 때 호출되어야 할 멤버 함수를 연결하는 테이블을 생성합니다.

자주 사용되는 메시지 처리 함수

개발자가 자주 처리하게 되는 메시지 종류와 그에 대응하는 함수는 다음과 같습니다.

  • WM_CREATE (OnCreate): 윈도우가 처음 생성될 때 (초기화 작업에 사용).
  • WM_DESTROY (OnDestroy): 윈도우가 파괴되기 직전에 (리소스 정리 작업에 사용).
  • WM_PAINT (OnPaint): 윈도우의 일부 또는 전체를 다시 그려야 할 때 (화면 출력의 핵심).
  • WM_COMMAND (OnCommand 또는 On...): 메뉴, 툴바 버튼, 액셀러레이터 등에서 발생하는 명령 메시지.
  • WM_LBUTTONDOWN (OnLButtonDown): 마우스 왼쪽 버튼을 눌렀을 때.

Visual Studio의 속성 창이나 클래스 뷰에서 메시지 항목을 선택하고 추가(Add) 버튼을 누르면 해당 메시지에 대한 처리 함수가 자동으로 생성되어 편리하게 코드를 작성할 수 있습니다.

7. 실습: 간단한 메모장 프로그램 구현 맛보기

메뉴 추가 및 파일 입출력 함수 연결

문서/뷰 기반 프로젝트에서 간단한 메모장 기능을 구현하는 것은 MFC의 기본 작동 방식을 이해하는 좋은 실습입니다.

  1. 메뉴 편집: 리소스 뷰에서 Menu 항목을 열고 IDR_MAINFRAME 메뉴를 편집합니다. 파일(File) 메뉴 아래에 새로 만들기(New), 열기(Open), 저장(Save) 항목이 있는지 확인합니다.
  2. 명령 처리 함수 연결: 이 메뉴 항목들은 기본적으로 WM_COMMAND 메시지를 발생시키며, ID_FILE_NEW, ID_FILE_OPEN, ID_FILE_SAVE 등의 ID를 가집니다. MFC는 이 ID들에 대해 CDocument 클래스에 이미 정의된 가상 함수(OnNewDocument, OnOpenDocument, OnSaveDocument)를 호출하도록 내부적으로 연결되어 있습니다. 개발자는 이 함수들을 CDocument를 상속받은 클래스에서 재정의하여 실제 파일 처리 로직을 구현합니다.

뷰 클래스에서 화면 그리기 (GDI) 기초

실제 텍스트를 화면에 출력하는 작업은 뷰 클래스(CView 상속)의 OnDraw 함수에서 이루어집니다. GDI(Graphics Device Interface)를 사용하며, 이 함수는 CDC* pDC (Device Context) 포인터를 인자로 받습니다.

// CMyView::OnDraw 함수 내부
void CMyView::OnDraw(CDC* pDC)
{
    CMyDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    // 예를 들어, 문서에 저장된 텍스트를 화면에 출력
    CString strOutput = _T("MFC 윈도우 프로그래밍 시작!");
    pDC->TextOutW(50, 50, strOutput); 

    // 선 그리기
    pDC->MoveTo(50, 100);
    pDC->LineTo(250, 100); 

    // 사각형 그리기
    CRect rect(50, 120, 250, 220);
    pDC->Rectangle(&rect);
}

CDC 객체는 화면, 프린터, 비트맵 등 다양한 출력 장치에 그리기 작업을 수행할 수 있는 인터페이스를 제공합니다. TextOutW는 텍스트를 출력하며, MoveToLineTo는 선을, Rectangle은 사각형을 그리는 대표적인 GDI 함수입니다. 이 과정을 통해 개발자는 데이터(문서)를 가져와 원하는 형태로 화면(뷰)에 시각화하는 방법을 익힐 수 있습니다.

 

더 자세한 내용은 아래를 참고하세요.

 

더 자세한 자료 보기

반응형