1 / 175

MFC Internals

MFC Internals. C ontents. Chapter 01 MFC 개관 Chapter 02 MFC 와 C/SDK Chapter 03 MFC 에서의 Message 처리 Chapter 04 MFC Utility Class Chapter 05 모든 길은 Cobject 로 통한다 Chapter 06 MFC Dialog 와 Control Dialog Chapter 07 MFC 의 Document/View Architecture. Chapter 01 MFC 개관. Contents.

harbaugh
Télécharger la présentation

MFC Internals

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 Internals

  2. Contents • Chapter 01 MFC 개관 • Chapter 02 MFC와 C/SDK • Chapter 03 MFC에서의 Message 처리 • Chapter 04 MFC Utility Class • Chapter 05모든 길은 Cobject로 통한다 • Chapter 06 MFC Dialog와 Control Dialog • Chapter 07 MFC의 Document/View Architecture

  3. Chapter01 MFC 개관

  4. Contents • Application Frameworks 정의 • MFC의 역사 • MFC의 설계 목적 • MFC의 구성 • MFC code basics

  5. Application Frameworks • Framework • 특정 영역의 작업을 도와 주는 class 집합 • Application Framework • 특정 OS의 application 개발 작업을 도와 주는 class 집합 • MFC (Microsoft Foundation Classes) • Windows용 application 개발 작업을 도와 주는 framework

  6. MFC의 역사 • 1989년 • AFX group 탄생 • Application framework technology development group의 약자 • 목적 • Windows application개발자를 위한 C++과 object-oriented 개념을 적용시킨 tool의 개발 • First prototype  실패 • Too complex and too different from Windows itself

  7. MFC의 역사 (cont’d) • 1992년 • MFC version 1.0 • C/C++ version 7.0과 함께 나옴 • 60개가 넘는 Windows application 개발을 위한class포함 • 일반 목적의 여러 class포함 • 완벽하지 못했음 • 개발자로부터 많은 불평을 받음

  8. MFC의 역사 (cont’d) • 1993년 • MFC version 2.0 • Visual C++ version 1.0과 Windows NT와 함께 나옴 • 100개가 넘는 class포함 • 새로 포함된 내용 • 새로운 application architecture • 새로운 high-level abstractions

  9. MFC의 역사 (cont’d) • 1993년 말 • MFC version 2.5 • Visual C++ version 1.5와 함께 나옴 • OLE2.0과 ODBC 지원이 추가됨 • 1994년 • MFC version 3.0 • Thread에 대한 기능이 보강됨

  10. MFC의 역사 (cont’d) • 1995년 • MFC version 3.1 • 추가된 기능 • Simple Messaging Application Programming Interface(MAPI) • WinSock • MFC version 4.0 • Visual C++ version 4.0과 함께 나옴 • 개발환경의 발전, 재사용성의 향상

  11. MFC의 역사 (cont’d) • 1997년 • MFC version 4.2 • Visual C++ version 5.0과 함께 나옴 • Internet 등을 위한 기능 추가 • 1998년 • MFC version 6.0 • Visual C++ version 6.0과 함께 나옴 • User interface향상 등의 기능이 포함 • 2002년 • MFC version 7.0 • Visual C++ .net(7.0) 과 함께 나옴 • 기존의 각 요소별 추가 및 확장 • DHTML(editing, dialog box, …), Ole control, … • Static casting and MFC message maps

  12. MFC version Visual C++ version 6.0 Microsoft Visual C++ version 6.0 4.2 Microsoft Visual C++ versions 4.2 and 5.0 4.0 Microsoft Visual C++ versions 4.0 and 4.1 3.2 Microsoft Visual C++ version 2.2 3.1 Microsoft Visual C++ version 2.1 3.0 Microsoft Visual C++ version 2.0 2.5 Microsoft Visual C++ version 1.5 2.1 Microsoft Visual C++ version 1.0 2.0 Microsoft Visual C++ version 1.0 1.0 Microsoft C/C++ version 7.0 MFC의 역사(cont’d) • MFC version과 Visual C++ version

  13. MFC 설계 목적 • AFX 그룹의 설계 목적 • Real-World Application • Simplifying the Windows API • Using the existing knowledge of Windows • Foundation for large-scale applications • Small and fast framework

  14. MFC의 구성 • MFC class 의 분류 • General-purpose classes • Windows API classes • Application framework classes • High-level abstractions • Operating System Extension

  15. MFC의 구성(cont’d) • General-purpose Class • 프로그램의 일반적 용도를 위한 class (1) CObject class • MFC의 최상위 class • run-time type information, • serialization, • diagnostic function, • support for dynamic creation •  4가지 중요한 기능 제공 • CArchive, CDumpContext, CRuntimeClass 등과 연계되어 작용

  16. MFC의 구성(cont’d) (2) Exception-handling class • memory, I/O error 발생 시 처리 • CException : base class • CArchiveException, CFileException • CMemoryException, CResourceException • CNotSupportedException, CUserException • COleException, CDBException

  17. MFC의 구성(cont’d) (3) Collection class • Array : CByteArray, CWordArray, CDWordArray, CPtrArray, • CObArray, CStringArray, CUnitArray • Linked list : CObList, CPtrList, CStringList • Map : CMapPtrToWord, CMapPtrToPtr, CMapStringToOb, • CMapStringToPtr, CMapStringToString, CMapWordToOb, • CMapWordToPtr

  18. MFC의 구성(cont’d) (4) Dynamic string class • CString • concatenation, comparison, assignment 등의 기본 연산 제공 (5) File class • CFile, CStdioFile, CMemFile • 추상적으로 disk상의 파일 제어, 실제로는 memory상의 파일 제어

  19. MFC의 구성(cont’d) (6) Time class • CTime, CTimeSpan (7) 기타 • CPoint, CSize, CRect : Windows structure

  20. MFC의 구성(cont’d) • Windows API class (1) Application 관련 class • CCmdTarget : message 처리 • CCmdUI : user interface의 update • CWinThread : MFC program의 실행 thread를 의미, 즉 program의 main을 포함 • CWinApp : CWinThread의 파생 class으로서 standard • windows application을 표현

  21. MFC의 구성(cont’d) • Window 관련 class • CWnd : CCmdTarget의 파생 class이므로 • message를 handle. 윈도우를 다루는 API 포함. • CFramWnd, CMDIFrameWnd : main frame window로서 • message를 받는 첫 윈도우 • CDialog, 공통다이어로그박스(CFileDialog, CColorDialog, CFontDialog, CPrintDialog, CFindReplaceDialog) • CDataExchange : DDX/DDV

  22. MFC의 구성(cont’d) • CPropertySheet, CPropertyPage • Controls : CButton, CEdit, … • Cmenu • GDI 관련 class • CDC, CPaintDC, CWindowDC, CClientDC, CMetaFileDC • CPen, CBrush, CFont, ...

  23. MFC의 구성(cont’d) • Application framework class • Document/View Architecture • CDocTemplate, CSingleDocTemplate, CMultiDocTemplate : document와 view를 연결 • CDocument : data를 관리 • CView : data를 redering하여 보여 줌 • Context-Sensitive Help

  24. MFC의 구성(cont’d) • High-level abstraction • Enhanced Views • CScrollView, CFormView • CEditView, CListView, CRichEditView, CTreeView • Splitter Window • CSplitterWnd : dynamic, static • Control Views • CToolBar, CStatusBar, CDialogBar

  25. MFC Code Basics • Class Declaration Subsections • MFC library 개발 팀의 코딩 규칙 • Not based public/protected/private • Private 변수는 거의 사용하지 않는다. • Header / source file • // Constructors • // Attributes • // Operations • // Overridables • // Implementation

  26. Example of Comments • class CStdioFile : public CFile • { • DECLARE_DYNAMIC(CStdioFile) • public: • // Constructors • CStdioFile(); • ... • // Attributes • FILE* m_pStream; // stdio FILE • ... • // Operations • virtual void WriteString(LPCTSTR lpsz); • ... • virtual LPTSTR ReadString(LPTSTR lpsz, UINT nMax); • ... • // Implementation • public: • ... • };

  27. MFC Comments • Class Declaration Subsections • MFC library 개발 팀의 코딩 규칙 • Class header file의 각 항목의 의미 • // Constructors(생성자 함수들, 초기화 함수들) • C++ constructors, any other initialization • 예) CWnd::Create • 대개는 public • // Attributes(위의 내용을 setting하거나 얻어옴) • 대개는 documented public data members • Member functions(위의 data를 조작하는) : Get / Set 함수들

  28. MFC Code Basics (cont’d) • // Operations(값이 변한다>??) • Documented member functions • 대개는 public, non-const : side effects • // Overridables • 상속 받은 class가 override한 functions • Pure virtual functions • // Implementation(현재 쓰고 있는 개념임) • Implementation detail • Undocumented • 대개는 protected • 주의 : may change in future versions of MFC

  29. Type Prefix Example Comment char c cDirSeparator BOOL b blsSending int n nVariableCnt UINT n nMyUnsigned WORD w wListID LONG l lAxisRatio DWORD dw dwPackedmessage * (pointer) p pWnd FAR * lp lpWnd LPSTR lpsz lpszFileName Z indicates NULL terminated. handle h hWnd callback lpfn lpfnHookProc Pointer to a function MFC Code Basics (cont’d) • Variable Naming (common)

  30. Class Prefix Example CRect rect rectScroll CPoint pt ptMouseClick CSize sz szRectangle CString str strFind CWnd Wnd WndControl CWnd* pWnd pWndDialog MFC Code Basics (cont’d) • Variable Naming (MFC extensions)

  31. Type Prefix Example Range Shared by multiple resources IDR_ IDR_MAINFRAME 1-0x6FFF Dialog resource IDD_ IDD_ABOUT 1-0x6FFF Dialog resource help context ID (for context-sensitive help) HIDD_ HIDD_HELP_ABOUT 0x2001-0x26FF Bitmap resource IDB_ IDB_SMILEY 1-0x6FFF Cursor resource Icon resource IDC_ IDC_HAND 1-0x6FFF MFC Code Basics (cont’d) • Symbol Naming

  32. Type Prefix Example Range Menu or toolbar command ID_ ID_CIRCLE_TOOL 0x8000-0xDFFF Command help context HID_ HID_CIRCLE_TOOL 0x1800-0x1DFF Message box prompt IDP_ IDP_FATALERROR 8-0xDFFF Message box help context HIDP_ HIDP_FATALERROR 0x3008-0x3DFF Control in dialog template IDC_ IDC_COMBO1 8-0xDFFF String resource IDS_ IDS_ERROR12 1-0x7FFF MFC Code Basics (cont’d) • Symbol Naming

  33. Chapter02 MFC와 C/CDK

  34. Contents • Introduction • MFC versus C/SDK • Basic Application Components • CWinApp • CWnd • Window handles & Window objects • Find WinMain() • Hidden Cool Stuff • Registering Window Classes • MFC’s Windows Hooks • MFC’s Message Pump • MFC’s GDI Support

  35. Introduction • MFC • 200개 이상의 클래스들의 거대한 집합 • But, MFC has also “Basic Windows Support” • A Windows program is still a Windows program • 어떤 언어(C, C++, Delphi, …)나 framework(MFC, OWL, …) 를 이용하든지 기본적인 요소들이 구현된다. • Basic windows application support • WinMain, window class 등록, 메시지 루프, …

  36. Issue • MFC가 어떻게 Windows application을 만드는가 • The application itself(응용프로그램 그 자체) - main thread • Windows • Message handling(위의 두가지를 연결해줌) • The Graphics Device Interface (GDI)

  37. MFC vs. C/SDK • Motivation • 모든 Windows application은 다음 2개의 component를 포함한다. • main application itself • message를 핸들하는 하나 이상의 window • C/SDK 개발 환경 • copy & paste • Time-consuming & inefficient • C++/MFC 개발 환경 • OOP 활용 : inheritance & encaptulation • 필요한 부분만 변경

  38. Boilerplate Code • 왜 필요한가? • Windows is event-driven OS • Imposes a grate deal of overhead • Windows OS • H/W 와 응용 프로그램을 연결하는 위치 • Application에게 발생하는 이벤트를 알림 • 이벤트를 다루기 위해 상당한 양의 코드가 항상 필요

  39. 메시지 처리를 위한 작업들 • Set up a message handler and register it • RegiserClass() : 윈도우 프로시져 등록 • Windows가 application의 instance들을 추적 • application은 Windows에게 메시지를 요청(ask)하고, 처리(dispatch)한다. • application이 종료될 때까지 위 작업을 반복한다.

  40. Application의 준비 WinMain() 함수 • 프로그램의 시작점 • Windows 로부터 프로그램을 실행하는데 필요한 정보를 얻어 오는 통로 • 현재 instance의 handle, 직전에 실행된 instance의 handle, command line argument, window의 모습(최대화, 최소화, …) 적어도 하나의 main window class를 등록 • User interface를 제공 Message loop를 설정 Some initialization and setup(초기화 작업) • Application specific, instance specific Message handler를 제공 • 최소한 WM_DESTROY 처리 -> WM_QUIT 생성

  41. Message Handler Main 함수 Application specific Initialization (Window class 등록) Instance specific Initialization (Main window(UI)생성, 보여줌) Message loop Application의 기본 요소

  42. Source 1 : C/SDK • #include <windows.h> • HANDLE hInst; /* current instance */ • LRESULT CALLBACK MainWndProc(HANDLE hWnd, UINT message, WPARAM wParam, LPARAM lParam) • { • switch(message) { • case WM_LBUTTONDOWN: • MessageBox(hWnd,“Left mouse button clicked”, NULL, MB_OK); • break; • case WM_DESTROY: • PostQuitMessage(0); • break; • default: /* Passes it on if unprocessed */ • return (DefWindowProc(hWnd, message, wParam, lParam)); • } • return 0; • }

  43. BOOL InitApplication(HANDLE hInstance){ • WNDCLASS wc; • wc.style = 0; /* Class style(s) */ • wc.lpfnWndProc = MainWndProc; /* Message handler */ • wc.cbClsExtra = 0; /* No per-class extra data */ • wc.cbWndExtra = 0; /* No per-window extra data */ • wc.hInstance = hInstance; /* Application that owns the class*/ • wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); • wc.hCursor = LoadCursor(NULL, IDC_ARROW); • wc.hbrBackground = GetStockObject(WHITE_BRUSH); • wc.lpszMenuName = NULL; /* Name of menu */ • wc.lpszClassName = “MinimalWClass”; /* Name of window class */ • return (RegisterClass(&wc)); • }

  44. BOOL InitInstance(HANDLE hInstance, int nCmdShow) { • HWND hWnd; /* Main window handle */ • hInst = hInstance; // needed for loading resources // • hWnd = CreateWindow( • “MinimalWClass”, /* Window class */ • “Minimal”, /* Caption */ • WS_OVERLAPPEDWINDOW, /* Window style */ • CW_USEDEFAULT, /* Default horizontal pos. */ • CW_USEDEFAULT, /* Default vertical pos. */ • CW_USEDEFAULT, /* Default width */ • CW_USEDEFAULT, /* Default height. */ • NULL, /* No parent */ • NULL, /* Use the window class menu */ • hInstance, /* This instance owns the window. */ • NULL);

  45. if (!hWnd) • return (FALSE); • ShowWindow(hWnd, nCmdShow); • UpdateWindow(hWnd); • return (TRUE); • }

  46. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, • LPSTR lpCmdLine, int nCmdShow) { • MSG msg; /* message */ • if (!hPrevInstance) { /* First instance? */ • if (!InitApplication(hInstance)) /* Shared stuff */ • return (FALSE); /* cannot initialize */ • } • if (!InitInstance(hInstance, nCmdShow)) • return (FALSE); • while (GetMessage(&msg, NULL, 0, 0)) { • TranslateMessage(&msg); • DispatchMessage(&msg); • } • return(msg.wParam);/*Returns the value from PostQuitMessage*/ • }

  47. Source 2 : MFC • #include <afxwin.h> // MFC 주요 클래스 선언 • class CGenericApp : public CWinApp { • public: • virtual BOOL InitInstance(); • }; • class CGenericWindow : public CFrameWnd { • public: • CGenericWindow() { • Create(NULL, “Generic”); • } • afx_msg void OnLButtonDown(UINT nFlags, CPoint point); • DECLARE_MESSAGE_MAP() • };

  48. BEGIN_MESSAGE_MAP(CGenericWindow, CFrameWnd) • ON_WM_LBUTTONDOWN() • END_MESSAGE_MAP() • void CGenericWindow::OnLButtonDown(UINT nFlags, CPoint point) { • MessageBox(“Left mouse button pressed…”, NULL, MB_OK); • } • BOOL CGenericApp::InitInstance() { • m_pMainWnd = new CGenericWindow(); • m_pMainWnd->ShowWindow(m_nCmdShow); • m_pMainWnd->UpdateWindow(); • return TRUE; • } • CGenericApp GenericApp;

  49. C/SDK와 MFC의 비교 • WinMain() Function • C/SDK : 존재 • MFC : where? ( part of application framework ) • Window class 등록 • C/SDK : 존재 • MFC : where? • Message loop • C/SDK : 존재 • MFC : where? • Additional functions : idle processing, PreTranslateMessage()

  50. C/SDK와 MFC의 비교 (cont’d) • Instance initialization • C/SDK : 존재 • MFC : 존재, 그러나 언제 실행? • Message handling • C/SDK : 존재 • MFC : 존재, 그러나 어떻게 command-routing, message-dispatch? • Member functions + Message map • AfxWndProc() : 공통 window procedure •  항상 시작점이다.

More Related