1.84k likes | 3.08k Views
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.
E N D
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
Chapter01 MFC 개관
Contents • Application Frameworks 정의 • MFC의 역사 • MFC의 설계 목적 • MFC의 구성 • MFC code basics
Application Frameworks • Framework • 특정 영역의 작업을 도와 주는 class 집합 • Application Framework • 특정 OS의 application 개발 작업을 도와 주는 class 집합 • MFC (Microsoft Foundation Classes) • Windows용 application 개발 작업을 도와 주는 framework
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
MFC의 역사 (cont’d) • 1992년 • MFC version 1.0 • C/C++ version 7.0과 함께 나옴 • 60개가 넘는 Windows application 개발을 위한class포함 • 일반 목적의 여러 class포함 • 완벽하지 못했음 • 개발자로부터 많은 불평을 받음
MFC의 역사 (cont’d) • 1993년 • MFC version 2.0 • Visual C++ version 1.0과 Windows NT와 함께 나옴 • 100개가 넘는 class포함 • 새로 포함된 내용 • 새로운 application architecture • 새로운 high-level abstractions
MFC의 역사 (cont’d) • 1993년 말 • MFC version 2.5 • Visual C++ version 1.5와 함께 나옴 • OLE2.0과 ODBC 지원이 추가됨 • 1994년 • MFC version 3.0 • Thread에 대한 기능이 보강됨
MFC의 역사 (cont’d) • 1995년 • MFC version 3.1 • 추가된 기능 • Simple Messaging Application Programming Interface(MAPI) • WinSock • MFC version 4.0 • Visual C++ version 4.0과 함께 나옴 • 개발환경의 발전, 재사용성의 향상
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
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
MFC 설계 목적 • AFX 그룹의 설계 목적 • Real-World Application • Simplifying the Windows API • Using the existing knowledge of Windows • Foundation for large-scale applications • Small and fast framework
MFC의 구성 • MFC class 의 분류 • General-purpose classes • Windows API classes • Application framework classes • High-level abstractions • Operating System Extension
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 등과 연계되어 작용
MFC의 구성(cont’d) (2) Exception-handling class • memory, I/O error 발생 시 처리 • CException : base class • CArchiveException, CFileException • CMemoryException, CResourceException • CNotSupportedException, CUserException • COleException, CDBException
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
MFC의 구성(cont’d) (4) Dynamic string class • CString • concatenation, comparison, assignment 등의 기본 연산 제공 (5) File class • CFile, CStdioFile, CMemFile • 추상적으로 disk상의 파일 제어, 실제로는 memory상의 파일 제어
MFC의 구성(cont’d) (6) Time class • CTime, CTimeSpan (7) 기타 • CPoint, CSize, CRect : Windows structure
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을 표현
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
MFC의 구성(cont’d) • CPropertySheet, CPropertyPage • Controls : CButton, CEdit, … • Cmenu • GDI 관련 class • CDC, CPaintDC, CWindowDC, CClientDC, CMetaFileDC • CPen, CBrush, CFont, ...
MFC의 구성(cont’d) • Application framework class • Document/View Architecture • CDocTemplate, CSingleDocTemplate, CMultiDocTemplate : document와 view를 연결 • CDocument : data를 관리 • CView : data를 redering하여 보여 줌 • Context-Sensitive Help
MFC의 구성(cont’d) • High-level abstraction • Enhanced Views • CScrollView, CFormView • CEditView, CListView, CRichEditView, CTreeView • Splitter Window • CSplitterWnd : dynamic, static • Control Views • CToolBar, CStatusBar, CDialogBar
MFC Code Basics • Class Declaration Subsections • MFC library 개발 팀의 코딩 규칙 • Not based public/protected/private • Private 변수는 거의 사용하지 않는다. • Header / source file • // Constructors • // Attributes • // Operations • // Overridables • // Implementation
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: • ... • };
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 함수들
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
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)
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)
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
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
Chapter02 MFC와 C/CDK
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
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 등록, 메시지 루프, …
Issue • MFC가 어떻게 Windows application을 만드는가 • The application itself(응용프로그램 그 자체) - main thread • Windows • Message handling(위의 두가지를 연결해줌) • The Graphics Device Interface (GDI)
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 • 필요한 부분만 변경
Boilerplate Code • 왜 필요한가? • Windows is event-driven OS • Imposes a grate deal of overhead • Windows OS • H/W 와 응용 프로그램을 연결하는 위치 • Application에게 발생하는 이벤트를 알림 • 이벤트를 다루기 위해 상당한 양의 코드가 항상 필요
메시지 처리를 위한 작업들 • Set up a message handler and register it • RegiserClass() : 윈도우 프로시져 등록 • Windows가 application의 instance들을 추적 • application은 Windows에게 메시지를 요청(ask)하고, 처리(dispatch)한다. • application이 종료될 때까지 위 작업을 반복한다.
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 생성
Message Handler Main 함수 Application specific Initialization (Window class 등록) Instance specific Initialization (Main window(UI)생성, 보여줌) Message loop Application의 기본 요소
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; • }
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)); • }
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);
if (!hWnd) • return (FALSE); • ShowWindow(hWnd, nCmdShow); • UpdateWindow(hWnd); • return (TRUE); • }
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*/ • }
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() • };
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;
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()
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 • 항상 시작점이다.