UNIT 13 MFC E-MAIL nadinetan@163.com
MFC 2
MFC 3
MFC 4
5
6
7 1 MFC
1.1 MFC MFC Microsoft Foundation Class Windows mfc*.dll Windows MFC C++ 8
1.1 MFC MFC Microsoft Foundation Class MFC Windows Windows MFC OnPain() CWnd WM_PAINT MFC / 9
1.2 MFC MFC MFC Windows API MFC MessageBox() MFC Windows API C++CWnd API API CWnd 10
1.3 MFC Windows Microsoft MFC Windows C++ Windows Windows Windows Windows API Windows API Windows API Windows API ActiveX 11
1.4 MFC 1. 1989 Application Framework C++ AFX(Applicatin Framework GUI AFX 12
1.4 MFC 2. AFXMFC Windows API C++ Windows OS/2 Presentation Manager Apple Macintosh C++ Windows API Windows API Win16 MFC API Windows API 13
1.4 MFC AFX MFC AFX Windows MFC MFC Windows API AFX 14
1.4 MFC MFC MFC AFX AfxGetApp() AFX_IDS_APP_TITLE AFX_MSGMAP_ENTRY Windows APIAFX MFC MFC AFX Microsoft MFCSDK Windows 15
1.5 C++ MFC MFC MicroSoft MFC 16
1.5 C++ MFC MFC Windows MFC VC 17
1.6 MFC MFCMFC C MFC C C o l o r D i a l o g Class Color Dialog 18
19
20 2 MFC
2.1 MFC 1. MFC 200 2. MFC MFC 3. 4. MSDN hierarchy chart MSDN MFC 21
22 2.1 MFC
2.2 Cobject CObject CmdTargrt CWnd CObject MFC MFC MFCMFC 23
2.3 1 CCmdTarget CObject MFC CCmdTarget CView CWinApp CDocument CWnd CframeWnd CCmdTarget CCmdTargetCView CWinApp 24
2.3 2CWinApp MFCCWndApp VC Windows WinMain() CWinApp 1 CWinApp AfxGetApp CWinApp AfxGetResourceHabdle: 25
2.3 AfxGetAppName CWinApp m_pszexename 2 CWinApp m_pszappname m_ncmdshow m_pmainwnd 26
2.3 3 CWinApp LoadCursor LoadStandardCursor Windows windows.h IDC LoadIcon LoadStandardIcon Windows windows.h IDI OpenDocumentFile 27
2.3 4 CWinApp InitApplication InitInstance Windows Run OnIdle PreTranslateMessage TranslateMessage() DispatchMessage() 5 CWinApp SetDialogBkColor Enable3dConrtols 28
2.3 3CWinThread CWinApp CWinThread CWinApp 1 CWinThread m_hthread m_nthreadid ID m_pmainwnd 2 CWinThread GetMainWnd GetThreadPriority ResumeThread 29
30 2.3 4. / CDocTemplate CMultiDocTemplate (MDI) CSingleDocTemplate (SDI) CDocument CView
1. CWnd 2.4 CWndMFC CWnd Windows CWndCWnd Windows Windows createdestroywindow Windows (1) CWnd m_hwnd CWndHWND (2 CWnd Create CWnd PreCreateWindow CWnd 31 UNIT THIRTEEN Windows 2009-12-13
2.4 GetStyle SubclassWindow CWnd CWnd FromHandle CWnd GetSafeHand m_hwnd; NULL, NULL 3 CWnd EnableWindow GetActiveWindow SetActiveWindow SetFocus GetFocusCWnd 4 GetWindowPlacement 32
SetWindowPlacement MoveWindow CWnd SetWindowPos GetWindowRect CWnd GetClientRect CWnd 5 FindWindow GetTopWindow CWnd GetParent CWnd 2.4 GetDlgItem ID GetDescendantWindow ID UNIT THIRTEEN CenterWindow 2009-12-13 33
6 / 2.4 GetDC GetWindowDC ReleaseDC Invalidate ShowWindow 7 SetWindowText GetWindowText SetFont GetFont 8 GetScrollPos ScrollWindow 34
2.4 SetScrollPos SetScrollRange 9 GetMen SetMenu HiliteMenuItem 10 OpenClipboard GetClipboardOwner GetOpenCilpboardWindow 35
2.4 2 CFrameWnd 1 CFrameWnd SDI 2 CMDIFrameWnd MDI 3 CMDIChildWnd MDI 36
2.4 3 1 CView 2 CScrollView 3 CFormView 4 CRecordViewODBC 5 CEditView Windows 37
4 2.4 CWnd CDialog 1 CDialog 2 CCommonDialog 3 CFileDialog 4 CColorDialog 5 CFontDialog 6 CPrintDialog 38
2.4 5 Windows 1 CStatic 2 CButton 3 CEdit 39
2.4 4 CScrollBar 5 CSliderCtrl 6 CListBox 7 CComboBoxl 8 CBitmapButton 40
2.4 9 CAnimateCtrl Windows / AVI 10 CTreeCtrl 11 CListCtrl 4 41
6. 2.4 1 CControlBox MFC 2 CToolBar 3 CStatusBar 4 CDialogBar 5 CStatusBarCtrl 6 CToolBarCtrl Windows 42
2.5 Windows CObject 1 Windows VC 1 DECLARE_MESSAGE_MAP( ) 2 BEGIN_MESSAGE_MAP 3 END_MESSAGE_MAP() 43
2.5 2 CObject CRuntimeClass CObject IsKindOf CObject VC 1 DECLARE_DYNCREATE ( ) 2 IMPLEMENT_DYNCREATE 44
45 2.5 3 RUNTIME_CLASS CObject IsKindOf
2.5 4 CObject 1 CObject DECLARE_SERIAL 2 CObject IMPLEMENT_SERIAL 3 CObject Serialize MFC MSDN 46
47
48 3 MFC
49 3.1
50 3.1 MFC
3.2 1 LIB 2Windows DLL COM COM 51
3.2 3 VC Visual Studio IDE IE 4 Win32CreateProcess API SHELL API ShellExecute 5 MFC 52
3.3 53
3.4 MFC MFC 1 MFC SimpleDialogMfc 2 54
3.4 MFC 1. SimpleDialogMfc.vcproj VC++ VC 2. SimpleDialogMfc.h ( Resource.h) CSimpleDialogMfcApp 3. SimpleDialogMfc.cpp CSimpleDialogMfcApp 55
3.4 MFC 4. SimpleDialogMfc.rc Microsoft Windows RES VC 2052 5. res\simpledialogmfc.ico SimpleDialogMfc.rc 6. res\simpledialogmfc.rc2 VC 56
3.4 MFC 5. : SimpleDialogMfcDlg.h SimpleDialogMfcDlg.cpp - CSimpleDialogMfcDlg SimpleDialogMfc.rc VC 6. : StdAfx.h StdAfx.cpp SimpleDialogMfc.pch (PCH) StdAfx.obj 57
58 3.4 MFC 6. : Resource.h ID SimpleDialogMfc.manifest Windows XP.manifest
3.4 MFC // SimpleDialogMfc.h : PROJECT_NAME // #pragma once #ifndef AFXWIN_H #error " stdafx.h PCH " #endif #include "resource.h" // // CSimpleDialogMfcApp: // SimpleDialogMfc.cpp // 59
3.4 MFC class CSimpleDialogMfcApp : public CWinApp { public: // // }; CSimpleDialogMfcApp(); public: virtual BOOL InitInstance(); DECLARE_MESSAGE_MAP() extern CSimpleDialogMfcApp theapp; c++, :(public, private, or protected) 60
3.4 MFC // SimpleDialogMfcDlg.h : // #pragma once // CSimpleDialogMfcDlg class CSimpleDialogMfcDlg : public CDialog { // public: CSimpleDialogMfcDlg(CWnd* pparent = NULL); // 61
3.4 MFC // // enum { IDD = IDD_SIMPLEDIALOGMFC_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pdx); // DDX/DDV protected: HICON m_hicon; // virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nid, LPARAM lparam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() 62
3.4 MFC }; public: BOOL m_vradio1; // public: afx_msg void OnBnClickedRadio3(); public: double m_vedit1; // 1 public: double m_vedit2; // 2 public: afx_msg afx_msg void OnEnChangeEdit1();// 1 public: afx_msg void OnEnChangeEdit2(); // 2 public: double m_result; // 3 public: afx_msg void OnBnClickedOk();//OK public: afx_msg void OnBnClickedRadio2();// 63
3.4 MFC // SimpleDialogMfc.cpp : // #include "stdafx.h" #include "SimpleDialogMfc.h" #include "SimpleDialogMfcDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CSimpleDialogMfcApp BEGIN_MESSAGE_MAP(CSimpleDialogMfcApp, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP() 64
3.4 MFC // CSimpleDialogMfcApp CSimpleDialogMfcApp::CSimpleDialogMfcApp() { // TODO: // InitInstance } // CSimpleDialogMfcApp CSimpleDialogMfcApp theapp; 65
3.4 MFC // CSimpleDialogMfcApp BOOL CSimpleDialogMfcApp::InitInstance() { // Windows XP // ComCtl32.dll 6 // InitCommonControlsEx() INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(initctrls); // // InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); 66
3.4 MFC CWinApp::InitInstance(); AfxEnableControlContainer(); // // // // // // TODO: // SetRegistryKey(_T(" ")); CSimpleDialogMfcDlg dlg; m_pmainwnd = &dlg; 67
} 3.4 MFC INT_PTR nresponse = dlg.domodal(); if (nresponse == IDOK) { // TODO: // } else if (nresponse == IDCANCEL) { // TODO: // } // FALSE // return FALSE; 68
3.4 MFC // SimpleDialogMfcDlg.cpp : // #include "stdafx.h" #include "SimpleDialogMfc.h" #include "SimpleDialogMfcDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif 69
3.4 MFC // CAboutDlg class CAboutDlg : public CDialog { public: CAboutDlg(); // enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pdx); // DDX/DDV // protected: DECLARE_MESSAGE_MAP() UNIT THIRTEEN }; 2009-12-13 70
3.4 MFC CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pdx) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() 71
3.4 MFC // CSimpleDialogMfcDlg CSimpleDialogMfcDlg::CSimpleDialogMfcDlg(CWnd* pparent /*=NULL*/) { } : CDialog(CSimpleDialogMfcDlg::IDD, pparent), m_vradio1(false), m_vedit1(0), m_vedit2(0), m_result(0) m_hicon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 72
3.4 MFC void CSimpleDialogMfcDlg::DoDataExchange(CDataExchange* pdx) { } CDialog::DoDataExchange(pDX); DDX_Radio(pDX, IDC_RADIO1, m_vradio1); DDX_Text(pDX, IDC_EDIT1, m_vedit1); DDX_Text(pDX, IDC_EDIT2, m_vedit2); DDX_Text(pDX, IDC_EDIT3, m_result); DoDataExchange UpdateData DDX 73
3.4 MFC UNIT THIRTEEN END_MESSAGE_MAP() 2009-12-13 BEGIN_MESSAGE_MAP(CSimpleDialogMfcDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_RADIO3, &CSimpleDialogMfcDlg::OnBnClickedRadio3) ON_EN_CHANGE(IDC_EDIT1, &CSimpleDialogMfcDlg::OnEnChangeEdit1) ON_EN_CHANGE(IDC_EDIT2, &CSimpleDialogMfcDlg::OnEnChangeEdit2) ON_BN_CLICKED(IDOK, &CSimpleDialogMfcDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_RADIO2, &CSimpleDialogMfcDlg::OnBnClickedRadio2) ON_EN_CHANGE WM_COMMAND EN_CHANGE 74
3.4 MFC // CSimpleDialogMfcDlg BOOL CSimpleDialogMfcDlg::OnInitDialog() { CDialog::OnInitDialog(); //... // IDM_ABOUTBOX ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* psysmenu = GetSystemMenu(FALSE); 75
3.4 MFC if (psysmenu!= NULL) { CString straboutmenu; straboutmenu.loadstring(ids_aboutbox); if (!straboutmenu.isempty()) { psysmenu->appendmenu(mf_separator); psysmenu->appendmenu(mf_string, IDM_ABOUTBOX, straboutmenu); } } 76
3.4 MFC // // SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); // // // TODO: } return TRUE; // TRUE 77
3.4 MFC void CSimpleDialogMfcDlg::OnSysCommand(UINT nid, LPARAM lparam) { } if ((nid & 0xFFF0) == IDM_ABOUTBOX) { } else { } CAboutDlg dlgabout; dlgabout.domodal(); CDialog::OnSysCommand(nID, lparam); nid SC_CLOSE 78
3.4 MFC // // / MFC // void CSimpleDialogMfcDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // SendMessage(WM_ICONERASEBKGND, reinterpret_cast<wparam>(dc.getsafehdc()), 0); // int cxicon = GetSystemMetrics(SM_CXICON); 79
3.4 MFC int cyicon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.width() - cxicon + 1) / 2; int y = (rect.height() - cyicon + 1) / 2; // dc.drawicon(x, y, m_hicon); } else { CDialog::OnPaint(); } UNIT THIRTEEN } 2009-12-13 80
3.4 MFC void CSimpleDialogMfcDlg::OnEnChangeEdit1() { // TODO: RICHEDIT // CDialog::OnInitDialog() // CRichEditCtrl().SetEventMask() // ENM_CHANGE } // TODO: // UpdateData(TRUE); 81
3.4 MFC void CSimpleDialogMfcDlg::OnBnClickedRadio2() { // TODO: UpdateData(TRUE); } 82
3.4 MFC 4MFC VC2005 ALI_F7 MFC DLL NFC 5 83
84 3.5 VC ClassView
3.4 MFC void CSimpleDialogMfcDlg::OnBnClickedOk() { // TODO: if(m_vradio1==0) m_result = m_vedit1 + m_vedit2; else if(m_vradio1==1) m_result = m_vedit1 - m_vedit2; else m_result = m_vedit1 * m_vedit2; UpdateData(FALSE); } 85
3.4 MFC void CSimpleDialogMfcDlg::OnEnChangeEdit2() { // TODO: RICHEDIT // CDialog::OnInitDialog() // CRichEditCtrl().SetEventMask() // ENM_CHANGE } // TODO: // UpdateData(TRUE); 86
87
4.1 88
4.1 SDI SDI MDI 89
4.2 90
4.3 MFC 1 91
92 4.3
4.3 MFC 2 SDI MFC CSingleDocTemplate MDI CMultiDocTemplate 93
4.4 MFC MFC Windows 4 CMyApp CMyWnd CMyViewCMyWnd CMyDoc CMyDoc 94
95 4.4 MFC
96 4.5 CObject CCmdTarget CDocument CDocument, CDocument Cdocument OnNewDocument Serialize SetModifiedFlag UpdateAllViews
97 4.5 CDocument OnNewDocument virtual BOOL OnNewDocument(); File New MFC MFC
98 4.5 OnNewDocument 1. MFC 2. 3.
99 4.5 OnNewDocument 4. 5. OnNewDocument
100 4.5 // BOOL CSDI_MouseDrawerDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // TODO: // (SDI ) } return TRUE;
101 4.5 CDocument Serialize virtual void Serialize(CArchive& ar); ar Cobject << >>
102 4.5 // CSDI_MouseDrawerDoc void CSDI_MouseDrawerDoc::Serialize(CArchive& ar) { if (ar.isstoring()) { // TODO: } else { // TODO: } }
4.5 CDocument SetModifiedFlag virtual void SetModifiedFlag(BOOL bmodified=true); CDocument m_bmodeified SetModifiedFlag(TRUE); m_bmodeified MFC m_bmodeified MFC m_bmodeified 103
104 4.5 CPtrList m_viewlist; CView CView CDocument UpdateAllViews MDI UpdateAllViews
105 4.6 CObject CCmdTarget CWnd CView CView OnDraw OnUpdate
106 4.6 CView OnDraw virtual void OnDraw(CDC* PDC) = 0; WM_PAINT MFC
107 4.6 CPtrList m_viewlist; CView CDocument* m_pdocument CView OnDraw virtual void OnDraw(CDC* PDC) = 0; m_pdocument
CView OnUpdate 4.6 UpdateAllViews OnUpdate void CSDI_MouseDrawerView::OnUpdate(CView* psender, LPARAM /*lhint*/, CObject* /*phint*/) { // TODO: / ASSERT(pSender!= this); } // Invalidate(TRUE); WM_PAINT OnDraw 108
1. MFC API 2. MFC 3. MFC 4. MFC 109
110 16 1. 2. Windows API MFC Windows Form 3. 15 VC2005 363 11 10 Windows API MFC Windows Form VC2005 363 11 11