Chapter 1 윈도우 프로그래밍 들어가기 윈도우 응용 프로그램을 작성하기 위해 필요한 기본 개념을 정립하고 Visual Studio를 설치한 후 MFC 응용 프로그램 마법사를 사용하여 MFC 프로그램을 작성하는 방법을 학습한다.
학습 목표 윈도우 운영체제에 대한 개념을 정립한다. 윈도우 응용 프로그램의 특징을 살펴본다. 윈도우 MFC 프로그래밍의 기본 개념과 MFC 아키텍처에 대해서 학습한다. MFC 응용 프로그램 작성 과정, 기본 구조, 동작 원리를 이해한다.
Section 01. 윈도우 응용 프로그램 개요와 개발 환경 구축하기 “Visual C++” 란? Windows XP와 같은 윈도우 운영체제(이하 윈도우)에서 동작하는 응용 프로그래밍을 하기 위한 프로그램 언어의 일종이다. “MFC(Microsoft Foundation Class)”란? 마이크로소프트사에서 윈도우에서 응용 프로그램을 제작하라고 제공해주는 C++ 클래스 라이브러리의 집합이다.
Section 01. 윈도우 응용 프로그램 개요와 개발 환경 구축하기 MFC 응용 프로그램 마법사 MFC 응용 프로그램은 마이크로소프트사에서 제공해주는 비주얼 스튜디오를 사용하여 제작하는데 일반적으로 비주얼 스튜디오 내에 탑재된 MFC 응용 프로그램 마법사를 사용한다. MFC 응용 프로그램 마법사로 생성된 MFC 응용 프로그램은 윈도우에서 흔히 볼 수 있는 응용 프로그램들과 유사한 인터페이스를 갖는 응용 프로그램을 작성해 준다. 응용 프로그램 종류 단일 문서 : 메모장과 같이 한 순간에 한 개의 파일만 사용할 수 있는 응용 프로그램 다중 문서 : 워드 프로세서(마이크로 소프트 워드)와 같이 한순간에 여러 개의 파일을 사용할 수 있는 응용 프로그램 대화 상자 기반 : 계산기와 같은 컨트롤을 포함한 응용 프로그램
Section 02. Visual C++ 프로그램 구조 파악하기 프로젝트란 하나의 실행 파일(exe)을 만들어 내기 위해서 필요한 여러 개의 소스 파일과 헤더 파일 등을 하나로 묶어 놓은 것을 말한다. [솔루션 탐색기] 창 MFC 응용 프로그램 마법사가 생성해준 파일들은 [리소스 파일], [소스 파일], [헤더 파일] 3 종류로 나누어서 보여주기에 쉽게 찾을 수 있다.
Section 02. Visual C++ 프로그램 구조 파악하기 [클래스 뷰] 창 [솔루션 탐색기] 창이 물리적인 파일 관계를 보여주는 것에 비해 논리적인 클래스 관계를 보여준다. 즉, 각 클래스의 멤버 변수와 함수들을 일목요연하게 볼 수 있다. 마우스 더블 클릭으로 멤버 변수의 선언된 위치나 함수가 정의된 위치를 손쉽게 찾아 갈 수 있다.
Section 02. Visual C++ 프로그램 구조 파악하기 MFC 응용 프로그램 마법사가 생성한 클래스 클래스이름 기본클래스 .h 파일 .cpp 파일 역할 CFirstDoc CDocument FirstDoc.h FirstDoc.cpp ▪뷰에 출력될 데이터 관리 ▪파일에 데이터 저장 및 로드 CMainFrame CFrameWnd MainFrm.h MainFrm.cpp ▪프로그램의 메인 윈도우를 관리 ▪메뉴와 툴바와 상태바와 같은 비 클라이언트 영역을 관리 CFirstApp CWinApp First.h First.cpp ▪프로그램의 시작과 끝을 제어 ▪3개(뷰, 도큐먼트, 프레임 워크)로 도큐먼트 템플릿을 생성 CFirstView CView FirstView.h FirstView.cpp ▪화면에 보여주는 역할 ▪마우스가 클릭되었다는 이벤트 처리 ▪키가 눌렸다는 이벤트 처리
Section 02. Visual C++ 프로그램 구조 파악하기 MFC의 분류 하나는 CObject로부터 파생된 부류이고 다른 하나는 CObject로부터 파생되지 않고 독립적으로 존재하는 부류이다. MFC 계층도
Section 02. Visual C++ 프로그램 구조 파악하기 응용 프로그램 마법사가 생성한 클래스와 MFC 클래스 계층 관계 프로젝트 명을 First로 주었을 때 MFC 응용 프로그램 마법사가 생성한 클래스를 기본으로 설명한다.
링킹 AFX(Application Framework)란? MFC 응용 프로그램의 기본 골격을 이루는데 절대적인 역할을 하는 클래스인데 CWinApp, CDocument, CFrameWnd, Cview 클래스로 구성된다.
Section 02. Visual C++ 프로그램 구조 파악하기 AFX 클래스의 유기적 결합 CFrameWnd은 메인 프레임 윈도우를 관리(눈에 보임) CView는 데이터를 시각적으로 보여주는 역할(눈에 보임) CDocument는 데이터를 저장하고 관리(눈에 안보임) CWinApp는 프로그램을 시작시키고, 메인 프레임, 뷰, 도큐먼트 클래스를 생성 관리(눈에 안보임)
Section 02. Visual C++ 프로그램 구조 파악하기 응용 프로그램 클래스(CFirstApp : CWinApp) 프로그램의 시작과 종료 담당하는 응용 프로그램 전체를 관리 CSingleDocTemplate 클래스로 도큐먼트 템플릿 객체를 생성 생성자에 리소스(IDR_MAINFRAME), 도큐먼트 클래스(CFirstDoc), 프레임 클래스(CMainFrame), 뷰 클래스(CFirstView)를 설정 도큐먼트 템플릿 객체를 CWinApp 클래스의 멤버 함수인 AddDocTemplate 함수를 호출하여 CWinApp 클래스와 연결
Section 02. Visual C++ 프로그램 구조 파악하기 응용 프로그램 클래스(CFirstApp : CWinApp) InitInstance() 도큐먼트 템플릿 객체를 생성하면서 도큐먼트 클래스, 메인 프레임 클래스, 뷰 클래스를 생성 ExitInstance( ) CWinApp는 프로그램을 종료시키면 이 함수가 호출되어 정리 작업
Section 02. Visual C++ 프로그램 구조 파악하기 응용 프로그램 클래스(CFirstApp : CWinApp) Run( ) InitInstance( ) 함수가 호출된 후에 바로 호출된다. 메시지 처리방식인 윈도우 응용 프로그램에서 무한루프를 돌면서 메시지가 발생했는지를 감지해서 이를 처리하는 함수 윈도우의 닫기( )버튼을 클릭하면 WM_QUIT 메시지가 발생하는데 WM_QUIT 메시지를 만나면 무한루프를 빠져 나감
Section 02. Visual C++ 프로그램 구조 파악하기 메인 프레임 윈도우 클래스(CMainFrame : CFrameWnd) 사용자로 하여금 윈도우 응용 프로그램이라고 느낄 수 있는 기본적인 틀 형태를 제공해주는 클래스 제목줄, 메뉴, 툴바, 상태바, 뷰 등 여러 가지 자식 윈도우로 구성
Section 02. Visual C++ 프로그램 구조 파악하기 뷰 클래스(CFirstView : CView) 사용자와의 인터페이스를 위해서 사용되는 영역으로 실질적으로 응용 프로그램의 결과를 출력해주는 영역 마우스나 키보드 입력을 받아 처리 OnDraw( ) CDocument 클래스가 관리하는 데이터들을 시각적으로 보여주는 역할 도큐먼트가 데이터를 관리하고 이를 뷰의 OnDraw( )에서 화면에 출력하기에 OnDraw( ) 내부에서 GetDocument( )를 호출하고 있다.
Section 02. Visual C++ 프로그램 구조 파악하기 뷰 클래스(CFirstView : CView) GetDocument( ) 뷰 클래스에는 도큐먼트 객체 포인터를 얻어 준다. GetDocument( )는 뷰의 멤버함수이며 도큐먼트 객체 포인터를 얻어 주는 역할을 한다.
Section 02. Visual C++ 프로그램 구조 파악하기 도큐먼트 클래스(CFirstDoc :CDocument) 뷰에 출력될 데이터를 내부적으로 저장하고 관리하는 영역으로 우리가 볼 수는 없다. Serialize( ) 관리되는 데이터를 영구 저장하기 위해서 파일 입출력을 담당
Section 03. 디버깅하기 신텍스 오류(syntax error) 문법을 지키지 않았기에 발생하는 문법적 오류 시멘틱스 오류(semantics error) 원하지 않는 결과를 초래하게 되는 논리적 오류 비주얼 스튜디오에는 시멘틱스 오류(semantics error)를 손쉽게 찾을 수 있도록 디버깅 툴을 제공한다. 다음은 디버깅을 위한 단축키이다. 단축 키 설명 [F5] 다음 정지 점까지 계속 진행한다.(F9키와 연동해서 사용한다.) [F10] (Step Over) 한 구문씩 진행하지만, 함수 내부로 들어가지 않는다. [F11] (Step Into) 한 구문씩 진행하지만, 함수 내부로 진행할 수 있다. [Shift]+[F11] (Step Out) [F11] 키와 반대로 현재 있는 함수에서 빠져 나온다. [Ctrl]+[F10] (Run To Cursor) 현재 커서까지 진행을 시킨다.
Section 03. 디버깅하기 CString 프로그래밍을 할 때 가장 많이 사용하는 데이터 중 하나인 문자열을 저장하기 위한 클래스 Format( ) CString은 다양한 타입의 데이터를 문자열로 변경하기 위한 함수 C 언어의 printf( ) 함수와 유사 형식지정자로 뒤에 나열된 변수들의 출력 위치와 데이터 타입을 결정 %d 형식지정자는 decimal(10진수)의 약자로서 정수형 데이터를 10진수 형태의 문자로 변경