윤 홍 란 hryun@sookmyung.ac.kr MFC 기초 윤 홍 란 hryun@sookmyung.ac.kr
윈도우 프로그래밍 Win32 API MFC와 Win32 API Application Programming Interface 응용프로그램을 작성하기 위해서 OS에 요구하는 방식을 체계적으로 모아 놓은 것으로 일종의 함수의 집합 API함수는 C코드로 제공 MFC와 Win32 API Microsoft Foundation ClassLibrary Win32 API의 기능을 그대로 이용하면서도 프로그래머에게 쉬운 접근을 할수 있도록 클래스 단위로 모아 놓은 라이브러리
윈도우 프로그래밍 ◐ 도스상에서의 실행 파일 생성 과정 ◑ Source Code (Sample.cpp) C++ Compiler Object File (Sample.obj) Linker Executable Program (Sample.exe)
윈도우 프로그래밍 ◐ 윈도우 상에서의 실행 파일 생성 과정 ◑ Developer Studio Linker Compiler Resource Compiler Source files Windows header Windows, runtime, and MFC libraries OBJ files Runtime header Executable (EXE) Resource file (RES) Bitmaps, icons, and other resources Resource.h Resource script file(RC) MFC header Resource compilation Code compilation
윈도우 프로그래밍 프로그램 코드 : *.c OR *.cpp 리소스 데이터 : *.rc 리소스 데이터는 응용 프로그램 안에서 공통적으로 사용되는 정적 데이터들의 집합. 리소스 편집기(App Studio)를 사용하여 프로그램에 필요한 리소스 데이터를 작성한다. *.rc 리소스 컴파일러 Link *.EXE 리소스 데이터는 일반적으로 프로그램의 .EXE 파일에 포함되어 있지만, 보통의 프로그램 데이터 세그먼트에 존재하지 않고 별도의 장소에 보관된다 리소스 데이터는 필요로 할 때만 메모리에 적재된다. 대부분의 리소스 데이터는 읽기 전용 데이터이다.
윈도우 프로그래밍 범위 C++ Application MFC Windows API ◐ 윈도우 API를 캡슐화한 MFC ◑
윈도우 프로그래밍 VC++의 CASE(Computer-Aided Software Engineering) 도구 AppWizard (자동 코드 생성기) 프로그램의 틀을 자동적으로 생성해 주는 도구 AppStudio (Resource Editor, 리소스 편집기) 자원(Resource)들을 편집하는 도구 사용자 인터페이스 요소들(메뉴, 다이얼로그, 단축키 등)을 시각적으로 디자인할 수 있도록 도와 준다. ClassWizard (자동 코드 생성기) AppStudio에서 시각적으로 디자인된 요소들을 실제 프로그램 코드와 연결시키는 작업을 한다. 새로운 클래스를 정의한다.
윈도우 프로그래밍 C/C++ Compiler Resource Compiler Linker Visual C++ 컴파일러는 C 소스 코드와 C++ 소스 코드의 확장자에 따라, 프로젝트 파일에 설정된 소스 코드를 어떠한 방식으로 컴파일 할 것인가를 결정하기 때문에 C 구조로 작성된 C 소스 코드와 C++ 구조로 작성된 C++ 소스 코드를 모두 컴파일 할 수 있다. Resource Compiler RC파일을 컴파일해서 링커시에 필요한 .res 파일을 생성한다. .rc : 텍스트 파일 .res : 이진파일 Linker 링커는 컴파일러로 만들어진 .obj 파일과 .res 파일을 읽고, LIB 파일과 결합하고, DLL 과 연결시켜 EXE 파일을 작성한다.
윈도우 운영체제 특징 (1/3) 그래픽 사용자 인터페이스
윈도우 운영체제 특징 (2/3) 메시지 구동 구조 이벤트 발생 대기 ... 시스템 메시지 대기열 메시지 대기열 #3 응용 프로그램 메시지 대기열 #1 메시지 대기열 #2 메시지 대기열 #3 ... 처리 대기
윈도우 운영체제 특징 (3/3) 멀티태스킹 멀티스레딩 여러 개의 응용 프로그램을 수행 하나의 응용 프로그램에 여러 개의 실행 흐름을 생성
윈도우 응용 프로그램 개발 도구 (1/3) SDK(Software Development Kit) 장점 단점 C 언어로 윈도우 API를 직접 호출해서 프로그램을 구현 장점 API를 직접 다루기 때문에 세부적인 제어가 가능하고, 윈도우 운영체제가 제공하는 모든 기능을 사용할 수 있다. 생성 코드의 크기가 작고 속도가 빠르다. 단점 생산성이 낮다.
윈도우 응용 프로그램 개발 도구 (2/3) RAD(Rapid Application Development) 장점 단점 시각적으로 화면을 디자인하고 코드를 추가하는 방법으로 프로그램을 빠르게 개발 장점 생산성이 높다. 단점 일반적으로 생성 코드의 크기가 크고 실행 속도가 느리다. 운영체제가 제공하는 모든 기능을 활용한 세부적인 제어가 어렵다.
윈도우 응용 프로그램 개발 도구 (3/3) 클래스 라이브러리(Class Library) 장점 단점 윈도우 응용 프로그램 개발에 필수적인 기능을 객체 지향 언어를 이용하여 클래스로 제공 장점 SDK보다 생산성이 높다. RAD보다 생성 코드의 크기가 작고 실행 속도가 빠르다. 단점 초기 학습에 필요한 기간이 길다. 객체 지향 언어 클래스 라이브러리 구조와 기능, 각 클래스의 관계 파악
MFC 란? Microsoft Foundation Class (마이크로소프트 사의 기반 클래스) Visual C++과 함께 제공되는 내장 클래스 (Library Class) Visual C++을 사용해 윈도우 프로그램을 간단하게 개발할 수 있는 유용한 클래스 기본 Window의 형태들을 새로 만들지 않고 MFC를 상속 받아 그냥 쓰면 됨 프로그래머의 작업시간을 단축시켜줌
Why MFC? 응용프로그램 MFC SDK API 운영체제 이해가 쉬움 코드의 재사용성 향상 소프트웨어 개발의 용이성 연관된 함수와 데이타를 “클래스”를 이용하여 그룹화하였음 코드의 재사용성 향상 소프트웨어 개발의 용이성 애플리케이션 프레임워크(application framework) 제공 멤버 함수 나열 코드 삽입의 용이성 응용프로그램 MFC SDK API 운영체제
MFC 발전 과정 (1/2) 연도 개발 도구 MFC 버전 주요 특징 1992 MS C 7.0 1.0 16비트 윈도우 API를 클래스화 OLE 1.0 지원 1993 비주얼 C++ 1.0 2.0 도큐먼트/뷰 구조 도입으로 MFC의 기본 골격 완성 DDX/DDV, 사용자 인터페이스 관련 클래스 추가 정적/동적 MFC 라이브러리 지원 비주얼 C++ 1.5 2.5x OLE 2.01 지원 ODBC 클래스 추가 1994 비주얼 C++ 2.x 3.x 32비트 윈도우 API로 전환 멀티스레드 지원 윈속(Winsock), MAPI 지원
MFC 발전 과정 (2/2) 연도 개발 도구 MFC 버전 주요 특징 1995 비주얼 C++ 4.x 4.x 공통 컨트롤 클래스 추가 DAO와 32비트 ODBC 지원 인터넷 관련 클래스 추가 1997 비주얼 C++ 5.0 4.21 ATL 추가 1998 비주얼 C++ 6.0 6.0 ATL 업그레이드 여러 개의 새로운 클래스 추가(CHtlmView, ...) OLE DB, ADO 지원 강화 2002 비주얼 C++ .NET 7.0 새로운 MFC DLL 사용(MFC70.DLL) MFC와 ATL의 통합 강화 사용자 인터페이스 클래스 추가 유틸리티 클래스 추가 ATL 서버 클래스 추가
MFC 주요 특징 (1/3) 윈도우 응용 프로그램을 작성하는데 드는 수고를 크게 덜어준다. 라이브러리 재사용 AppWizard, ClassWizard, ... API를 기반으로 한 SDK 프로그램과 대등한 속도를 가진다. 인라인 함수 코드 크기 증가를 최소화한다. MFC DLL
MFC 주요 특징 (2/3) API 함수를 직접 호출할 수 있다. (예) ::ReleaseCapture(); C 언어로 작성된 윈도우 응용 프로그램을 쉽게 C++ 언어로 바꿀 수 있다. SDK 프로그래밍에 대한 기반 지식을 재활용할 수 있다. C++ 언어를 이용하여 기존의 C 언어에 비해 API를 좀더 편하게 사용할 수 있다. (예) 디폴트 인자
MFC 주요 특징 (3/3) API를 직접 사용해서 구현할 경우 복잡도가 높은 부분을 MFC를 이용하면 쉽게 구현할 수 있다. 인쇄 기능 지원, 툴바와 상태바 처리, 데이터베이스 지원, OLE와 액티브X, ...
MFC 개요도 AppWizard ……………………… ………………………………. ……………………………. ……………… 상속 이미 정의된 클래스들 AppWizard CMyApp clsss CMyDoc class CMainFrame class CMyView class 기본 골격만 갖춘 창
Object Oriented Programming 실객체를 표현한 소프트웨어 객체로 프로그램 구성 소프트웨어 객체들의 상호 동작으로 프로그램 수행 실객체 실세계 사건 소프트웨어 객체 프로그램 세계 메시지 있는 그대로 표현
Object Oriented Programming 프레임 윈도우 오브젝트 메뉴 오브젝트 툴바 오브젝트 뷰 오브젝트 상태바 오브젝트
Object 분리 예 = +
일관된 사용자 인터페이스
AFX Classes 어플리케이션 프로그램을 구성하는 오브젝트 단위로 분할 분리된 오브젝트는 철저하게 역할을 분담 프레임 윈도우와 뷰를 분리 도큐먼트와 뷰를 분리
Application Frameworks (AFX) CDocument 데이터를 저장, 처리 (눈에는 안보임) CFrameWnd 윈도우의 프레임(틀)을 관리 CView 데이터를 보여주는 윈도우 CWinApp 위의 세 오브젝트를 묶어주고, 프로그램을 구동 시킴 (눈에는 안보임)
AFX 클래스의 계층 구조 거의 모든 MFC 클래스의 기반 클래스 커맨드 메세지를 받는 기능 프로그램을 구동시키는 기능 CCmdTarget CWinApp CDocument CObject CWnd CFrameWnd CView 거의 모든 MFC 클래스의 기반 클래스 커맨드 메세지를 받는 기능 프로그램을 구동시키는 기능 데이터를 저장하고 처리하는 기능 윈도우에 관련된 기능 (눈에 보이는 오브젝트) 프로그램 윈도우 프레임(외곽)을 관리하는 기능 데이터를 보여주는 윈도우 관리하는 기능
프로그램의 뼈대 만들기 AppWiard가 해 주는 일 MFC의 AFX 클래스에서 상속을 받아 아래 그림과 같이 네 개의 클래스를 생성 상속 받은 클래스에는 MFC의 막강한 기능들이 상속
AppWizard MFC 기반 클래스 파생 클래스 프로젝트명 : My CCmdTarget CWinApp CDocument CObject CWnd CFrameWnd CView MFC 기반 클래스 CMyApp CMyDoc CMainFrame CMyView 파생 클래스 프로젝트명 : My
M F C 상 속 CWinApp CFrameWnd CView CDocument C프로젝트명App C프로젝트명View 상 속 C프로젝트명App C프로젝트명View CMainFrm C프로젝트명Doc
CFrameWnd CWinApp CDocument CView protected/private 멤버 멤버 함수 멤버 변수 CMyApp 클래스의 인스턴스 (전역 변수)
CWinApp 클래스 CWinApp 클래스의 역할 CMyApp 클래스의 인스턴스가 유일하게 전역변수로 선언 프로그램의 시작과 종료를 담당 프로그램이 시작될 때, 메인 프레임 윈도우를 생성 무한루프를 돌면서 메시지를 뿌려줌 WM_QUIT 메시지를 만나면 무한루프를 빠져 나옴 프로그램을 전체를 대표하는 기능들을 수행 CMyApp 클래스의 인스턴스가 유일하게 전역변수로 선언
CWinApp 클래스의 동작 CWinApp 프로그램 시작 무한 루프 프로그램 종료 InitInstance( ) Run( ) ExitInstance( ) 프로그램 종료
CWinApp 파생 클래스의 동작 CWinApp CMyApp 상 속 프로그램 시작 프로그램 종료 무한 루프 InitInstance( ) Run( ) ExitInstance( ) 프로그램 종료 무한 루프 InitInstance( ) ExitInstance( )
CWnd 클래스 윈도우에 관련된 기능 메시지 핸들러 함수 윈도우의 크기, 위치, 모양, 상태 등을 제어하기 위한 기능을 제공 메시지 핸들러-윈도우에서 발생하는 메시지를 처리 CCmdTarget CWinApp CDocument CObject CWnd CFrameWnd CView
CFrameWnd 클래스 일반적인 윈도우로서의 역할 프레임 윈도우로서의 고유한 역할 프레임 윈도우도 일종의 윈도우 윈도우의 크기, 위치, 상태 등의 조절에 관한 일과 같은 윈도우로서의 역할 툴바와 상태바를 다는 것은 CFrameWnd 클래스에서 상속을 받은 파생 클래스에서 추가 OnCreate 함수를 오버라이딩 하고, 그 함수 안에다가 툴바와 상태바를 생성시켜 메다는 기능을 추가 오버라이딩 된 OnCreate 함수에서 기반 클래스의 OnCreate 함수를 반드시 호출 int CMyWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) { CWnd::OnCreate(lpCreateStruct); // 여기에 수행 하고자 하는 기능을 넣으면 됩니다. }
메인프레임 클래스(CMainFrame) -CWnd 클래스와 메시지 핸들러- 윈도우 메시지 발생하는 상황 WM_CREATE 윈도우가 생성될 때 WM_ACTIVATE 활성화 되거나 비 될 WM_PAINT 다시 그려져야 할 필요가 있을 WM_MOUSEMOVE 윈도우의 위에서 마우스 커서가 움직였을 WM_COMMAND 사용자가 메뉴나 버튼을 눌러 명령을 내렸을 WM_LBUTTONDOWN 왼쪽 버튼이 눌렸을 WM_LBUTTONUP 떼어졌을 WM_LBUTTONDBLCLK 더블 클릭 됐을 WM_KEYDOWN 키보드가 WM_KEYUP WM_SIZE 크기가 변경되었을 WM_MOVE 이동 되었을 WM_TIMER 윈도우에 설정된 타이머의 시간이 다 WM_DESTROY 없어질
윈도우 메시지와 메시지 핸들러 윈도우 메시지 핸들러 함수 WM_CREATE OnCreate WM_ACTIVATE OnActivate WM_PAINT OnPaint WM_MOUSEMOVE OnMouseMove WM_DESTROY OnDestroy WM_LBUTTONDOWN OnLButtonDown WM_LBUTTONUP OnLButtonUp WM_LBUTTONDBLCLK OnLButtonDblClk WM_KEYDOWN OnKeyDown WM_KEYUP OnKeyUp WM_SIZE OnSize WM_MOVE OnMove WM_TIMER OnTimer WM_COMMAND 다른 방식으로 처리됨
CWnd클래스의 기본 동작
메시지 큐 윈도우 오퍼레이팅 시스템 메시지 프로그램 메시지 큐 CWinApp::Run( ) { switch( ) case : } 메시지 핸들러 WM_CREATE WM_ACTIVATE OnCreate OnActivate OnMove WM_ACTIVATE WM_MOVE
CView 클래스 일반적인 윈도우로서의 역할 뷰 윈도우로서의 고유한 역할 프로그램에서 다루는 데이터를 보여줌 class CMyView : public CView { public: CMyDoc* GetDocument( ); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyView) virtual void OnDraw(CDC* pDC); // overridden to draw this view protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); //}}AFX_VIRTUAL };
CView 클래스 GetDocument() OnDraw() 도큐먼트 오브젝트의 포인터를 얻는 함수 각각 도큐먼트에서 데이터를 가져와 그리는 기능을 수행하는 함수
CDocument 클래스 CDocument 클래스의 역할 파일로부터 데이터를 읽어오는 기능 (“파일” 메뉴의 “열기” 기능) 파일에 데이터를 저장하는 기능 (“파일” 메뉴의 “저장” 기능) 새로운 데이터를 만드는 기능 (“파일” 메뉴의 “새 파일” 기능) 작업 중인 데이터를 닫는 기능 (“파일” 메뉴의 “닫기” 기능) 데이터가 변경된 사실을 뷰 오브젝트에 알리는 기능 // MyDoc.h class CMyDoc : public CDocument { protected: // create from serialization only CMyDoc(); // Overrides public: virtual BOOL OnNewDocument(); // Implementation virtual ~CMyDoc(); };
메시지 맵(Message Map) 메시지와 메시지 처리함수의 연결
MFC 전역 함수 함수 이름 기능 AfxMessageBox() 메시지 상자를 표시한다. AfxGetApp() 응용 프로그램 객체의 주소를 리턴한다. AfxGetMainWnd() 메인 윈도우 객체의 주소를 리턴한다. AfxGetAppName() 응용 프로그램의 이름을 리턴한다. AfxGetInstanceHandle() 인스턴스 핸들을 리턴한다. AfxBeginThread() 스레드를 시작한다. AfxEndThread() 스레드를 종료한다.
AfxMessageBox() 사용 예 void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { AfxMessageBox("마우스를 클릭했습니다."); }
MFC 어플리케이션 개발 과정 Visual C++ MFC골격 코드 생성 사용자 인터페이스 오브젝트 생성 및 편집 AppWizard를 이용하여 MFC골격(Framework)을 구성하는 코드 생성 사용자 인터페이스 오브젝트 생성 및 편집 리스스에디터사용 핸들러 코드 생성 클래스 위저드 사용 핸들러 코드 작성 클래스 위저드로 생성된 핸들러 맴버 함수의 원형에 고유한 기능 추가 어플리케이션 소스코드 컴파일 및 링크 실행파일 생성
Microsoft Developer Studio
AppWizard를 이용한 MFC 응용 프로그램 생성 (1/8) 프로젝트 종류 선택
AppWizard를 이용한 MFC 응용 프로그램 생성 (2/8)
AppWizard를 이용한 MFC 응용 프로그램 생성 (3/8)
AppWizard를 이용한 MFC 응용 프로그램 생성 (4/8)
AppWizard를 이용한 MFC 응용 프로그램 생성 (5/8)
AppWizard를 이용한 MFC 응용 프로그램 생성 (6/8)
AppWizard를 이용한 MFC 응용 프로그램 생성 (7/8)
Project Information
결과