2.1 MFC 의개요 2.2 MFC 프로그램의구조 2.3 Visual C++ 의시작실습 2-1 Application Wizard 익히기 2.4 SDI 템플릿 2.5 MDI 템플릿 2.6 MFC 애플리케이션아키텍처실습 2-2 간단한 MFC 프로젝트만들기
MFC 의개요 MFC 윈도우애플리케이션을생성하기위해만들어진 C++ 클래스라이브러리 애플리케이션프레임워크를제공
MFC 의개요 MFC 의이점 윈도우프로그램전문가로만들어준다. 개발시간을단축시키고, 이식성이강한코드를작성 ActiveX, OLE, 인터넷프로그래밍같은기술지원 응용프로그램 ( 데이터베이스, 네트워크 ) 을손쉽게작성 강력한사용자인터페이스를지원
MFC 의개요 MFC 의표기법 헝가리안표기법을사용한다. 클래스는모두 C 로시작한다. 여러단어가하나의클래스이름일경우각단어별로첫글자를대문자로표기한다. 멤버변수는 m_ 로시작하고, 멤버함수는대문자로시작한다. 전역함수는 Afx 라는접두어가붙는다. Afx 는 Application Framework 의약자로 Microsoft 사에서 MFC 를개발했던팀의이름이다.
MFC 프로그램의구조 SDI 애플리케이션의구조
MFC 프로그램의구조 SDI 애플리케이션의구조 Template : 윈도우로출력되는형태 Main Frame : 윈도우외곽경계를담당하고 메뉴, 툴바, 상태바를가지고있음 View 윈도 : 실제화면처리를담당 문자출력, 그래픽출력등 Document : 디스크에서데이터를읽고저장
MFC 프로그램의구조 MDI 애플리케이션의구조
MFC 프로그램의구조 MDI 애플리케이션의구조 여러개의 SDI 형태프로그램 Main Frame 독립적으로설정되어있고그안에 template Template Child Frame View Window Document
MFC 프로그램의구조 MFC 형태의프로그램구조 Application Class MFC 프로그램은템플릿을포함하고한개의인스턴스를포함하는 Application class 가있음
Visual C++ 란 Visual C++ 의특징 다양한 SDK 형태의라이브러리를제공한다 강력한 MFC 가있다 강력한마법사가있다
실습 2-1 MFC 응용프로그램마법사익히기 프로젝트를만들때실행되는프로그램 자동으로소스를만들어주는프로그램? 기존의소스를단순하게복사하여코딩하는프로그램? 기존의있는클래스를상속받는또하나의클래스를생성? Class CMainFrame : CFrameWnd { }
MFC 응용프로그램마법사 응용프로그램종류단계
MFC 응용프로그램마법사 복합문서지원단계
MFC 응용프로그램마법사 개체삽입의예
MFC 응용프로그램마법사 문서템플릿속성단계
MFC 응용프로그램마법사 데이터베이스지원단계
MFC 응용프로그램마법사 사용자인터페이스기능단계
MFC 응용프로그램마법사 고급기능단계
MFC 응용프로그램마법사 생성된클래스단계
MFC 응용프로그램마법사 MDI 형프로젝트만들기
MFC 응용프로그램마법사 만들고자하는기본적인프로젝트를생성해주고그안에필요한클래스생성 클래스에기본적인내용을코딩 기본적인코딩시간을절약하므로빠른프로젝트완성 응용프로그램마법사사용도중실수로옵션을선택하지않았을경우소스에서새로추가할수있다.
Project Workspace 프로젝트워크스페이스의구성 클래스뷰 MFC 클래스를상속받은클래스 솔루션탐색기 클래스소스가설정되어있는파일들 소스파일 cpp 헤더파일 h 리소스뷰 프로그램에필요한메뉴, 아이콘, 문자열, 대화상자같은자원
Project Workspace 항 목 내 용 클래스뷰 프로젝트에설정되어있는클래스별로출력, 해당항목을선택하면수정가능 리소스뷰 프로젝트에설정되어있는메뉴, 대화상자, 문자열, 아이콘, 비트맵등자원의리스트출력, 해당항목선택수정가능 솔루션탐색기 프로젝트에설정되어있는파일리스트출력, 해당항목을선택하여수정가능
클래스뷰화면
리소스뷰화면
솔루션탐색기화면
SDI 템플릿 템플릿클래스 애플리케이션의여러자원들과메인프레임클래스, View 클래스, Document 클래스등을하나의묶음으로가지는클래스. 템플릿
SDI 템플릿 애플리케이션클래스의인스턴스얻기 ex) CExSDIApp *papp = (CExSDIApp *)AfxGetApp(); 애플리케이션클래스를얻을때는애플리케이션클래스의포인터변수를생성 AfxGetApp() 라는함수를이용하여애플리케이션클래스의인스턴스를얻는다. 마지막으로형전환 다른클래스의접근방법에서도형전환은역시필요하다.
SDI 템플릿 메인프레임클래스의인스턴스얻기 메뉴와툴바, 상태바등의상태를바꾸기위해서는메인프레임클래스에접근 ex) CMainFrame *pframe = (CMainFrame *)AfxGetMainWnd(); 메인프레임의인스턴스를얻을때 AfxGetMainWnd() 함수를이용하고형전환
SDI 템플릿 뷰클래스의인스턴스얻기 ex) CExSDIView *pview = (CExSDIView *)pframe->getactiveview(); 뷰클래스의포인터를얻기위해서는 GetActiveView() 함수를사용 그런데이함수는 CFrameWnd(CMainFrame) 의멤버함수 이함수를사용하기위해서는먼저 CMainFrame 클래스를얻고이클래스의멤버함수인 GetActiveView() 함수를사용
SDI 템플릿 도큐먼트클래스의인스턴스얻기 ex) CExSDIDoc *pdoc = (CExSDIDoc *)pframe->getactivedocument(); 도큐먼트클래스의인스턴스를얻는방법은함수가 GetActiveDocument() 라는것외에는뷰클래스의인스턴스를얻는방법과같다.
MDI 템플릿 MDI 하나의프로그램에서여러개의문서객체를가지는애플리케이션의형태 템플릿 CMultiDocTemplate* pdoctemplate; pdoctemplate = new CMultiDocTemplate( IDR_PRACTITYPE, RUNTIME_CLASS(CPractice5_3Doc), RUNTIME_CLASS(CChildFrame), // MDI child frame RUNTIME_CLASS(CPractice5_3View)); AddDocTemplate(pDocTemplate);
MDI 템플릿 자식프레임클래스의인스턴스얻기 ex) CChildFrame *pchild = (CChildFrame *)pframe->getactiveframe(); 자식프레임클래스의인스턴스를얻기위해메인프레임의멤버함수인 GetActiveFrame() 함수를이용 이함수를사용하기위해서는먼저 CMainFrame 클래스를얻고이클래스의멤버함수인 GetActiveFrame() 함수를사용
MFC Application Architecture MFC 의계층적구조형태
MFC Application Architecture CObject 클래스 ( 최상위클래스 ) 메모리에클래스를설정하는기능 클래스를할당하기위한 new 연산자가오버로딩 /MFC/Include/Afx.h 에설정 클래스의기능과종류를알수있는함수가있음
MFC Application Architecture CCmdTarget 클래스
MFC Application Architecture CWnd 클래스 화면에보이는윈도들은모두 CWnd 에서상속받음 가장많이사용되는클래스 윈도우의최상위클래스 상속해서사용하지직접 CWnd 클래스를사용하지는않는다. 윈도우를구동하는모든기능을가진함수가있다.
MFC Application Architecture CWndThread 클래스 윈도가스레드로돌아갈수있도록구동되는클래스 스레드는독립적인형태로구동되는하나의모듈 한개의프로그램을독립적으로움직이려면한개의프로그램은한개이상의 CWinThread 를포함해야한다 Multi-tasking 이가능 CWndApp 클래스 한개의프로그램을포함하고관장하는클래스
MFC Application Architecture CDocument 클래스 데이터를디스크에서읽어들이거나디스크에저장하는부분을담당하는클래스 주로알고리즘을저장 나중에다른프로그램에서재사용이용이
CWnd 를상속받은클래스들
실습 2-2 간단한 MFC 프로젝트만들기 MFC 를이용할것 클래스마법사를이용 키보드와마우스에대한메시지처리 키보드와마우스의동작에따라텍스트를출력하는프로그램을작성하는것 윈도우의크기가변경되었을때윈도우의크기를출력
실습 2-2 프로그램작성순서 1) SDI 기반의프로젝트생성 2) 윈도우크기가변경될때윈도우크기를출력 필요한변수선언 WM_SIZE 에대한메시지핸들러함수생성 윈도우크기를출력 (OnDraw() 함수 ) 3) 마우스와키보드동작에따라출력할텍스트를저장할변수추가 4) 왼쪽마우스에대한메시지를처리 WM_LBUTTONDOWN 에대한메시지핸들러함수생성 5) 오른쪽마우스에대한메시지를처리 WM_RBUTTONDOWN 에대한메시지핸들러함수생성
실습 2-2 6) 키보드에대한메시지를처리 WM_KEYDOWN 에대한메시지핸들러함수생성 7) 마우스이동과드래그에대한메시지를처리 WM_MOUSEMOVE 에대한메시지핸들러함수생성 8) 윈도우에텍스트를출력 OnDraw() 함수에출력코드추가 9) 프로그램실행
CString 클래스 함수 GetLength 내용 설정된문자의길이를반환한다 IsEmpty 현재클래스에문자열버퍼가비어있는가? Empty GetAt SetAt Compare MakeUpper MakeLower Format Find 문자열을삭제하여버퍼를비운다문자열의특정위치의문자값을얻는다문자열의특정위치에새로운문자열을삽입한다문자열과인자의문자열을비교한다문자열의소문자를대문자로바꾼다문자열의대문자를소문자로바꾼다문자열에형식을갖추어문자들을넣는다문자열에서특정문자나문자열을찾는다
Invalidate( ) 함수 Invalidate() 함수는시스템이 WM_PAINT 메시지를호출 WM_PAINT 메시지는 OnDraw() 함수를호출 Invalidate(TRUE) 는윈도우의 background 를전부지운후 BeginPaint() 함수를이용하여다시그린다. Invalidate(FALSE) 함수는 background 는그대로남겨두고바뀐부분만그린다. 디폴트인수는 TRUE 이다.
OnDraw( ) 함수 OnPaint() 메시지핸들러함수이다. WM_PAINT 메시지가날아올때마다 OnPaint() 함수와 OnDraw() 함수가둘다호출되어화면을복원 메시지핸들러함수가아닌가상함수
CRect 클래스 CRect 클래스는 windows Rect 구조와유사하며사각형의좌측상단과우측하단의좌표를저장하기위한클래스 RECT 의구조 typedef struct tagrect { LONG left; LONG top; LONG right; // 사각형의왼쪽상단의 x 좌표 // 사각형의왼쪽상단의 y 좌표 // 사각형의오른쪽하단의 x 좌표 LONG bottom; // 사각형의오른쪽하단의 y 좌표 } RECT;
GetClientRect( ) 함수 GetClinetRect() 함수는윈도우의클라이언트영역의크기를얻는함수이다. 함수의원형은다음과같다. BOOL GetClientRect(LPRECT lprect); lprect : 클라이언트좌표를얻기위한포인터로왼쪽및상단을 0 으로하고오른쪽과하단은윈도우의너비와높이를포함한다.
CDC::TextOut( ) 함수 TextOut() 함수는문자열을지정된위치에출력하는함수이다. 함수의원형은다음과같다. BOOL TextOut( int x, int y, const CString& str ); x : 문자열이출력될 x 좌표 Y : 문자열이출력될 y 좌표 str : 출력될문자열
실습 2-2 실행결과
실습 2-2 실행결과
연습문제 2-1 < 실습 2-2> 에서작성한프로그램에다음의기능을추가하는프로그램을작성하라. 프로그램에마우스를이동하였을마우스를따라다니면서마우스의현재좌표를윈도우에출력하는프로그램을작성해보자.
연습문제 2-1 실행결과