본문 바로가기
New/MFC 윈도우 프로그래밍

2. MFC 개요 및 아키텍처 (2)

by onenewkong 2024. 12. 7.

2.4 MFC 애플리케이션 아키텍처

1)  CObject 클래스

  • MFC의 최상위 기본 클래스로써 메모리에 클래스를 설정하는 기능을 가진 클래스
  • CObject 클래스는 클래스 루트로써만 작용하는 것이 아니라, 다음과 같은 서비스와 기능을 제공함
  • 직렬화 (Serialization)의 지원: 현재 클래스의 객체가 디스크에 저장할 수 있도록 지원하고, 저장 여부를 확인할 수 있음
  • Run - Time 클래스 정보: 현재 클래스의 상태를 확인하고 오류를 정리할 수 있음
  • 객체의 검사 출력: 클래스의 객체가 유효한지 검사
  • 컬렉션 클래스에 대한 호환성 제공: 컬렉션 클래스에 저장 가능한 객체는 CObject 클래스를 상속받은 클래스만이 가능하므로 사용자 클래스를 제작해 컬렉션 클래스에 저장하고자 한다면 항상 CObject를 상속받아야 함

2) CCmdTarget 클래스

  • MFC의 메시지 맵 아키텍처를 지원하기 위한 기저 클래스
  • 윈도우 메시지를 처리하는 MFC 클래스는 모두 CCmdTarget 클래스나 CCmdTarget의 파생 클래스로부터 상속받은 클래스임
  • CCmdTarget 클래스는 실질적으로 메시지를 처리하는 것이 아니라 WM_COMMAND와 OLE 메시지만을 담당하고 있음

3) CWinThread 클래스

  • 어떤 프로그램이 실행되려면 먼저 메모리에 프로그램이 적재되어야 함
  • 메모리에 적재된 프로그램을 하나의 프로세스라 하고, 이 프로세스는 여러 가지의 작업으로 나누어질 수 있는데, 이 단위가 스레드(thread)라고 함
  • 하나의 프로세스는 하나의 스레드를 가지고 있지만, 여러 가지 스레드를 가질 수 있음 (멀티 스레드)
  • 중요한 것은 하나의 애플리케이션이 실행되고자 한다면 하나의 스레드가 생성되어야 한다는 점
  • CWinThread 클래스가 하나의 윈도우를 스레드로 구동될 수 있게 하는 클래스
  • CWinApp 클래스가 CWinThread 클래스로부터 상속 받은 이유는 윈도우가 하나의 스레드로 구동되게 하기 위한 것
  • 윈도우 시스템은 여러 가지 프로그램을 동시에 실행시킬 수 있는 멀티태스킹을 지원하는 운영체제임

4) CWinApp 클래스

  • 애플리케이션 생성에서 가장 먼저 애플리케이션 자체를 나타내는 CWinApp로 파생된 클래스의 객체가 생성됨
  • 이 객체는 SDI의 경우 CSingleDocTemplate 클래스를, MDI의 경우 CMultiDocTemplate 클래스를 이용하여 템플릿 안에 포함된 클래스 즉, FrameWnd, View, Document 클래스들을 관리함

5) CWnd 클래스

  • 화면에 출력되는 모든 윈도우의 기본 클래스이며, CCmdTarget의 파생 클래스로서 메시지 맵의 기능을 지원하며, 윈도우를 구동하기 위한 모든 기능을 내포한 클래스
  • 윈도우를 제어하는데 필요한 공통된 기능은 CWnd 클래스에 정의되어 있고, CWnd의 파생 클래스가 많이 존재하므로 가장 많이 사용함

6) CFrameWnd 클래스

  • 윈도우의 외곽 경계를 정의하는 기본 클래스
  • CWnd 클래스로부터 상속받았기 때문에 공통으로 윈도우 메시지를 처리하며, 가시적으로 볼 수 있는 윈도우 전체 영역을 나타내고, 때에 따라서는 상태 표시줄, 도구상자를 포함함
  • SDI 프로젝트 유형에서는 CFrameWnd 클래스로부터 상속받아 CMainFrame 클래스를 생성하게 됨
  • MDI 프로젝트 유형에서는 CDMIFrameWnd 클래스와 CMDIChildWnd 클래스는 CFrameWnd 클래스로부터 상속받은 클래스
  • CMainFrame 클래스는 CMDIFrameWnd 클래스로부터 상속받아 생성되며 윈도우 전체 영역을 나타내고 또, 다시 CChildWnd 클래스는 CMDIChildWnd 클래스로부터 상속 받아 전체 윈도우 내에 자식 윈도우를 나타냄

7) CView 클래스

  • 윈도우의 작업 영역을 정의하는 기본 클래스이며, 이 클래스로부터 상속 받은 여러 가지 형태의 뷰 클래스들이 있음
  • 이 클래스도 작업 영역으로 들어오는 메시지들을 처리할 수 있음

8) CDialog 클래스

  • 모든 대화상자의 기본이 되는 클래스
  • 대개 애플리케이션은 대화상자를 뺄 수 없을 만큼 많이 사용하므로 중요함
  • CWnd 클래스로부터 상속받았으므로, 윈도우 메시지 처리를 할 수 있으며, 대화상자 고유의 기능으로 여러 가지 컨트롤들을 쉽게 사용할 수 있다는 장점이 있음
  • Visual C++에서는 대화상자 폼의 디자인을 위한 Resource Editor를 제공하고 있음

9) CDocument 클래스

  • 애플리케이션에서 사용되는 데이터를 저장하고 제어하는 클래스로써, 프레임워크에서 사용되는 클래스와는 약간 다른 성격을 가지고 있음
  • 애플리케이션의 내부를 담당하고 있음
  • 기본적으로 애플리케이션의 데이터 처리는 이 클래스에서 다루는 것이 좋고, 또한 디스크로의 입출력을 제공하므로 데이터의 입출력에 관한 내용은 이 클래스를 사용하는 것이 좋음
  • 데이터를 이 클래스의 멤버 변수로 가지게 되며 뷰 클래스나 프레임 윈도우는 이 멤버 변수들의 데이터를 활용하여 표현하게 됨
  • 이를 문서/뷰 구조라고 함

 

실습

  • 마우스 이동, 마우스 왼/오 버튼 클릭, 키보드 클릭, 윈도우 크기를 출력하는 실습
  • 여기서 주의했던 점은 윈도우에 출력하는 코드는 OnDraw() 함수에서 구현해야 함
  • 윈도우가 다시 그려질 때 WM_PAINT 메시지가 발생하여 OnDraw() 함수가 실행되기 때문