1 / 193

MFC (Microsoft Foundation Class)

MFC (Microsoft Foundation Class). PART1 Windows 와 MFC 의 기초. Chapter1 MFC 란 ? Chapter2 창에 그리기 Chapter3 마우스와 키보드 Chapter4 메뉴 Chapter5 MFC 컬렉션 클래스 Chapter6 파일 입출력 및 직렬화 Chapter7 컨트롤 Chapter8 대화상자와 속성시트. Chapter1 MFC 란 ?. MFC 개 론 FrameWork MFC 와 Win32API 의 밀회

Download Presentation

MFC (Microsoft Foundation Class)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. MFC(Microsoft Foundation Class)

  2. PART1Windows와 MFC의 기초 Chapter1 MFC란? Chapter2 창에 그리기 Chapter3 마우스와 키보드 Chapter4 메뉴 Chapter5 MFC컬렉션 클래스 Chapter6 파일 입출력 및 직렬화 Chapter7 컨트롤 Chapter8 대화상자와 속성시트

  3. Chapter1 MFC란? MFC 개론 FrameWork MFC와 Win32API의 밀회 SDK에서 MFC 프로그래밍으로의 전환 AppWizard를 이용한 MFC 프로그래밍 AppWizard가 생성한 코드 분석 객체간 통신

  4. MS가 그들의 Windows 운영체제를 위해 자체 개발한 window용 C++라이브 • 러리(MFC의 뒤에 Microsoft Foundation Class Library라고도 함 ) • 최초 버전은 92년도에 MS C/C++ 7.0 이 출시되면서 MFC1.0 이 등장함 • 향후windows API가 늘어나는 추세와 발맞추어 MFC 라이브러리는 매년 더 • 욱 많은기능이 보강되면서 윈도우즈 프로그래밍에 있어 업계의 표준 라이브 • 러리로자리를 굳혔다. • 당시 윈도우즈 프로그래머들은 SDK(Software Development Kit)를 사용하여 • 어려운 방법으로 프로그램을 만들었다. • SDK를 이용한 윈도우즈 프로그래밍이란 과거의 DOS 프로그래밍을 하던 것 • 처럼 프로그래머 자신이 처음부터 끝까지 프로그램의 코드를 작성하는 방식 • 이기 때문에 생산성이 떨어지고 비효율적이었다. 1. 개론

  5. 그러나Visual C++과 같은 개발 도구들은 도구 자체가 스스로 기본적인 소스 • 코드를 생성해 주므로 사용자는 최소의 코드에만 신경을 집중함으로써 좀 더 • 빠르고 쉬운 작업이 가능하게 되었다. • 위와 같은 일이 가능한 것은 Object-Oriented 개념을 바탕으로 했기 때문이다. • - MFC역시 OOP라는 기본적인 사상하에 분석, 설계되고 탄생하였다. 1. 개론

  6. MFC 1.0 1992 년 4월 (MS - C/C++ 7.0) • [윈도우와 관련된 클래스 ] 1. 개론 - MFC의 역사

  7. [일반적인 목적의 클래스 ] 1. 개론 - MFC의 역사

  8. 2) MFC 2.0 1993년 8월 (VC++ 1.0 - 93년 2월) • [구조적 클래스] 1. 개론 - MFC의 역사

  9. [좀 더 편리하게 만들어진 비주얼 클래스] 1. 개론 - MFC의 역사

  10. 3) MFC 2.5 1993년 12월 (VC++ 1.5) • [데이터 베이스 클래스] • *) OLE 클래스들 지원 1. 개론 - MFC의 역사

  11. [Win32 지원] 1. 개론 - MFC의 역사 공유된 32bit DLL

  12. 4) MFC 3.0 - 1994년 10월( VC ++ 2.0) • [User Interface 클래스] 1. 개론 - MFC의 역사

  13. 5) MFC 3.1 & 3.2) • [User Interface 클래스] 1. 개론 - MFC의 역사

  14. 6) MFC 4.0 – 1995년 9월( VC++ 4.0) • [User Interface 클래스] 1. 개론 - MFC의 역사

  15. 1) AppWizard • - 프로그램의 틀을 자동으로 생성해 주는 도구 • - 여기서 말하는 프로그램의 틀이란 흔히 스켈레톤 코드(skeletion code)라고 • 말함 • - VC++사용자는 AppWizard에서 알맞게 옵션을 지정하면 나머지는 VC++가 • 자동적으로 뼈대(skeleton)가 되는 코드를 포함하는 파일을 생성해준다. • - 프로그래머들은 아무일도 하지 않고 AppWizard를 이용하여 마우스 클릭만으 • 로 새로운 어플리케이션 뼈대를 구축할 수 있으므로 과거 SDK를 이용한 프로 • 그래밍보다 무척 편리하다. 1. 개론 - MFC 사용도구

  16. 2) AppStudio • - 사용자 인터페이스 요소들(메뉴, 다이얼로그, 핫키(단축키)등)을 시각적으로 • 디자인할 수 있도록 도와준다. • 보통 자원(resource)들을 편집하는 도구라고 생각하면 된다. • 3) ClassWizard • - AppStudio에서 시각적으로 디자인된 요소들을 실제 프로그램 코드와 연결 • 시키는 작업을 할 수 있다. • - 또한 새로운 클래스를 정의하는 데도 쓰인다. 1. 개론 - MFC 사용도구

  17. MFC Collections, Miscellaneous Classes Base MFC Classes OLE Classes ODBC Classes Win32 API (SDK) OLE ODBC Windows Base OS Services Windows OS Service Extensions • 윈도우 API이외에도 OLE, ODBC, Winsock 관련 클래스를 포함하여 230여개의 클래스를 제공 2. MFC(Microsoft Foundation Class)?

  18. - 클래스의 집합체이다. • MFC : Visual C++이 제공 • OWL(Object Windows Library) : 볼랜드C++이 제공 • MFC 프로그래밍은 C++ 과 API 에 대한 이해를 바탕으로 MFC가 제공하 • 는 클래스들의 종류와 기능, Framework을 익혀나가는 과정이다. • - 어플리케이션 프레임워크(Application FrameWork) • 프로그램의 구조 자체를 정의한다. • 윈도우 프로그램은 윈도우를 만들기 위해서 꼭 필요한 정형화된 코드 • 가 있다. • 이 코드(기본 골격)를 AppWizard를 이용하여 자동으로 생성해 준다. • 기본 골격을 자동으로 생성함으로써 코드의 재사용성을 높이고, 프로 • 그래머는특화시킬 고유 기능만을 추가하는 방식이다. • 애플 매킨토시용 MacApp에 도입,상업화 되면서 MS사가 MFC2.0부터 • 포함시켰다. 2. MFC(Microsoft Foundation Class)?

  19. - 프레임워크를 사용하여 얻는 이점 • 표준화된 구조를 사용한다. • 유지/보수가 용이하다. • 조각난 프로젝트를 엮어나가기가 쉽다. • 프레임워크의 애플리케이션은 작고 빠르다. • 프레임워크가 제공하는 기능은 DLL로 작성되었으므로 실행파일 크기는 작아 졌으며 • DLL이 최적화된 컴파일러로 만들어진 기계 코드를 사용하므로 실행 속도가 빠르다. • 프레임워크를 사용하여 얻는 이점 • 프레임워크를 이용하면 코딩 작업이 줄어 개발 기간이 단축된다. 2. MFC(Microsoft Foundation Class)?

  20. Object Oriented Programming 2. MFC – FrameWork(AFX)

  21. Object 분리 예 2. MFC – FrameWork(AFX)

  22. 일관된 사용자 인터페이스 2. MFC – FrameWork(AFX)

  23. MFC의 계층 구조 CObject (MFC Base Class) Exceptions Command Targets Collections 2. MFC – FrameWork(AFX) ODBC Support Threads File Services Application OLE Support DCs Documents Windows Socket Support GDI Objects Windows Menus Frames Utility Classes Views Support Classes Dialogs Collection Templates Controls

  24. CFrameWnd CDocument CView 데이터를 저장, 처리 (눈에는 안보임) 윈도우의 프레임(틀)을 관리 데이터를 보여주는 윈도우 CWinApp 위의 세 오브젝트를 묶어주고, 프로그램을 구동 시킴 (눈에는 안보임) Application Frameworks (AFX) 2. MFC – FrameWork(AFX)

  25. CCmdTarget CWinThread CWinApp derived application class CWinApp CObject CCmdTarget CWnd Exceptions File Services Device Contexts Graphical Drawing Objects Menus OLE Support Collections Frame Windows Control Bars Views Dialog Boxes Controls Application Objects Document Architecture 2. MFC – FrameWork(AFX) Application objects are derived from CWinApp.

  26. CFrameWnd CObject CWnd CCmdTarget Exceptions File Services Device Contexts Graphical Drawing Objects Menus OLE Support Collections Frame Windows Control Bars Views Dialog Boxes Controls Application Objects Document Architecture 2. MFC – FrameWork(AFX) CWnd CFrameWnd CMDIChildWnd user MDI windows Application window objectsare derived from theCFrameWnd base class. CMDIFrameWnd user MDI workspaces

  27. FrameWork Class CObject Framework classes CCmdTarget 2. MFC – FrameWork(AFX) CWinApp CDocTemplate CWnd CDocument CDialog CFrameWnd CView CYourApp CYourDlg CYourFrame CYourDoc CYourVw

  28. 도큐먼트 / 뷰 분리의 이유 2. MFC – FrameWork(AFX)

  29. CObject CCmdTarget CWinApp CDocument CWnd CFrameWnd CView Afx클래스의 계층 구조 거의 모든 MFC 클래스의 기반 클래스 2. MFC – FrameWork(AFX) 커맨드 메세지를 받는 기능 프로그램을 구동시키는 기능 데이터를 저장하고 처리하는 기능 윈도우에 관련된 기능 (눈에 보이는 오브젝트) 프로그램 윈도우 프레임(외곽)을 관리하는 기능 데이터를 보여주는 윈도우 관리하는 기능

  30. MFC 기반 클래스 파생 클래스 CObject CCmdTarget CWinApp CMyApp CDocument CMyDoc CWnd CFrameWnd CMainFrame CView CMyView AppWizard 2. MFC – FrameWork(AFX)

  31. CFrameWnd protected/private 멤버 멤버 함수 멤버 변수 CWinApp CDocument CView CMyApp 클래스의 인스턴스 (전역 변수)

  32. CWinApp 프로그램 시작 InitInstance( ) 무한 루프 Run( ) ExitInstance( ) 프로그램 종료 CWinApp • 프로그램의 시작과 종료 담당 • 전역 변수로 인스턴스 생성 • 프레임 윈도우 생성 • 메시지 루프 (무한루프) InitInstance( ); Run( ); ExitInstance( ); 2. MFC – FrameWork(AFX)

  33. CMyApp 속 프로그램 시작 InitInstance( ) InitInstance( ) 무한 루프 Run( ) ExitInstance( ) 프로그램 종료 CWinApp파생클래스의 동작 CWinApp 2. MFC – FrameWork(AFX)

  34. 프로그램 시작 InitInstance( ) InitInstance( ) 무한 루프 Run( ) ExitInstance( ) ExitInstance( ) 프로그램 종료 CWinApp파생클래스의 동작 2. MFC – FrameWork(AFX)

  35. CWinApp파생클래스의 구현 class CMyApp : public CWinApp { public: CMyApp(); // Overrides public: virtual BOOL InitInstance(); }; 2. MFC – FrameWork(AFX)

  36. CWinApp파생클래스의 구현 class CMyApp : public CWinApp { public: CMyApp(); // Overrides public: virtual BOOL InitInstance(); }; 2. MFC – FrameWork(AFX)

  37. CWnd Class 윈도우 제어용 멤버 함수 (100여 개) 메시지 핸들러 함수 (200여 개) 2. MFC – FrameWork(AFX)

  38. 메시지 큐 윈도우 오퍼레이팅 시스템 2. MFC – FrameWork(AFX) 메시지 프로그램 메시지 큐 CWinApp::Run( ) { switch( ) case : } 메시지 핸들러 WM_ACTIVATE WM_CREATE OnCreate OnActivate OnMove WM_ACTIVATE WM_MOVE

  39. CWnd CMyWnd 속 OnCreate OnCreate OnMove OnSize( ) OnSize( ) CWnd파생 클래스의 동작 2. MFC – FrameWork(AFX) WM_CREATE WM_MOVE WM_SIZE

  40. 2. MFC – FrameWork(AFX)

  41. API : • BOOLShowWindow( HWNDhWnd, intnCmdShow); • MFC : • BOOL CWnd::ShowWindow(intnCmdShow); • API함수는 해당 함수의 윈도우 핸들이 명시된다. • MFC함수는 핸들 값이 클래스의 멤버 변수로 설정되기 때문에 HWND파라미터가 없다. 3. MFC와 Win32API의 밀회 _AFXWIN_INLINE BOOL CWnd::ShowWindow(intnCmdShow) { ASSERT(::IsWindow(m_hWnd)); return ::ShowWindow(m_hWnd, nCmdShow); } Afxwin2.inl

  42. class CWnd : public CCmdTarget { DECLARE_DYNCREATE(CWnd) protected: static const MSG* PASCAL GetCurrentMessage(); // Attributes public: HWND m_hWnd; // must be first data member operator HWND() const; BOOL operator==(const CWnd& wnd) const; BOOL operator!=(const CWnd& wnd) const; (Afxwin.h) 3. MFC와 Win32API의 밀회 • CWnd클래스가 정의된 코드에 보면 m_hWnd가 있음을 확인 할 수 있다.

  43. *) Sample Code 확인 4. SDK에서 MFC프로그래밍으로의 전환

  44. #include <afxwin.h> class CMyApp:public CWinApp { public: virtual BOOL InitInstance(); }; class CMyFrame:public CFrameWnd { protected: afx_msg void OnRButtonDown(UINT nFlags,CPoint point); DECLARE_MESSAGE_MAP() }; <Test.h> 4. SDK에서 MFC프로그래밍으로의 전환

  45. #include "Test.h" CMyApp theApp; BOOL CMyApp::InitInstance() { CMyFrame * pFrame = new CMyFrame; pFrame->Create(NULL,"MFC 윈도우 프로그램"); pFrame->ShowWindow(SW_SHOWMAXIMIZED); pFrame->UpdateWindow(); m_pMainWnd = pFrame; return TRUE; } BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd) ON_WM_RBUTTONDOWN() END_MESSAGE_MAP() void CMyFrame::OnRButtonDown(UINT nFlags, CPoint point) { MessageBox("MFC 예제 프로그램"); } <Test.cpp> [Project->Settings…] <USE MFC in a Shared DLL>로 Setting 4. SDK에서 MFC프로그래밍으로의 전환

  46. 헤더 파일(Test.h) • <afxwin.h> • 다른 헤더 파일을 포함하여 MFC의 기본 클래스들이 정의 되어 있다. 4. SDK에서 MFC프로그래밍으로의 전환 구성 요소 설 명 CMyApp클래스 (어플리케이션 클래스) 어플리케이션의 초기화 및 종료 작업을 담당 하며 메시지 루프를 포함하고 있는 클래스 CMyFrame클래스 (메인 프레임 클래스) 메인 윈도우를 표현하고 관리하는 클래스로 메인 윈도우의 동작을 규정한다.

  47. class CWinApp : public CWinThread { DECLARE_DYNAMIC(CWinApp) public: // Constructor CWinApp(LPCTSTR lpszAppName = NULL); // app name defaults to EXE name // Attributes HINSTANCE m_hInstance; HINSTANCE m_hPrevInstance; LPTSTR m_lpCmdLine; int m_nCmdShow; <Afxwin.h> 4. SDK에서 MFC프로그래밍으로의 전환

  48. 구현 파일(Test.cpp) 구성 요소 설 명 애플리케이션 시작 프로그램이 시작되면 윈도우 OS는 프레임워크 내부에 있는 WinMain()함수를 호출한다. WinMain()은 CWinApp부터 파생된 클래스의 어플리케이션 전역객체 (theApp)를 찾는다. 4. SDK에서 MFC프로그래밍으로의 전환 CWyApp:: Initinstance() WinMain()함수가 어플리케이션 전역객체를 찾으면 호출되는 가상함수로 반드시 재정의하여 사용한다. 메인 프레임 윈도우를 구성하고 출력하는데 필요한 함수를 호출한다. CWyApp:: Run() 기초 클래스 CWinApp의 멤버함수 Run()이 메시지를 해당 윈도우로 전달하는 메시지 루프를 수행한다. 이 함수는 InitInstance() 호출 후에 호출된다. CMyFrame:: OnRButtonDown() WM_RBUTTONDOWN메시지를 처리하는 MFC함수이다. 사용자가 마우스 우측 버튼을 누르면 호출되는 메시지 처리 함수 이다. 어플리케이션 종료 사용자가 시스템 메뉴의 [닫기] 를 선택하면 CMyFrame객체가 소멸되고 Run()의 메시지 루프를 빠져나와 WinMain()를 끝내고 CMyApp객체가 소멸된다.

  49. int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { ASSERT(hPrevInstance == NULL); int nReturnCode = -1; CWinThread* pThread = AfxGetThread(); CWinApp* pApp = AfxGetApp(); // AFX internal initialization if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow)) goto InitFailure; // App global initializations (rare) if (pApp != NULL && !pApp->InitApplication()) goto InitFailure; // Perform specific initializations if (!pThread->InitInstance()) { if (pThread->m_pMainWnd != NULL) { TRACE0("Warning: Destroying non-NULL m_pMainWnd\n"); 4. SDK에서 MFC프로그래밍으로의 전환

  50. pThread->m_pMainWnd->DestroyWindow(); } nReturnCode = pThread->ExitInstance(); goto InitFailure; } nReturnCode = pThread->Run(); InitFailure: #ifdef _DEBUG // Check for missing AfxLockTempMap calls if (AfxGetModuleThreadState()->m_nTempMapLock != 0) { TRACE1("Warning: Temp map lock count non-zero (%ld).\n", AfxGetModuleThreadState()->m_nTempMapLock); } AfxLockTempMaps(); AfxUnlockTempMaps(-1); #endif AfxWinTerm(); return nReturnCode; } <WINMAIN.CPP> 4. SDK에서 MFC프로그래밍으로의 전환

More Related