Top Banner

Click here to load reader

of 60

第六章 MFC 原理与方法

Jan 02, 2016

Download

Documents

chanda-kim

面向对象程序设计. 第六章 MFC 原理与方法. MFC (Microsoft Foundation Class) 微软基础类 是一个由 Microsoft 公司设计的类库。 MFC 框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员要做的就是通过接口把具体应用程序特有的东西填入这个轮廓。 MFC 的目的是让应用程序员在应用程序框架的基础上建立 Windows 下的应用程序,这种方法相对于 SDK 来说更为简单。 采用 MFC 方式编程提高了 Windows 应用程序的开发效率。 认识 MFC 只是一个过程、一个手段,最终目的是为了良好并熟练地运用 MFC。. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • MFC

  • MFCMicrosoft Foundation ClassMicrosoftMFCMFCWindowsSDKMFCWindowsMFCMFC

  • WindowsMFCMFCMFCMFCMFCMFC

  • Windows WindowsWindowsDOSDOSWindowsMessageWindowsWindows

  • Windows API ?Windows()(Application)Application Programming InterfaceAPI Windows APIWindowsWindows

  • Windows APIWindows APIWindows Windows Windows APIWindowsWindows API Windows APIDLLDLLUser32.dllGdi32.dllKernel32.dll

  • Windows APIAPI(API) API

  • Windows SDKSDKsoftware develope kitWindowsAPIAPIAPISDKVisual C++VC++WindowsWindowsSDK

  • SDK VC++SDKSDKVC++WindowsSDKMFCOWLObject Window Library, Borland C++ VBDelphiSDKSDKWindowsMFC

  • Visual C++SDK

    Win32 ApplicationWindows

  • 1File|NewNewProjectWin32 ApplicationHello1 A typital Hello world! applicationFinish2WndProc()switch-caseWM_LBUTTONDOWN case WM_LBUTTONDOWN: MessageBox(NULL, "You pressed the left button of mouse !","Message",NULL); break; 1 HelloSDKAPI

  • Windows?

  • SDKAPIWindowsWindowsWindowsWindows

  • WinMain()WindowswhileWinMain()WndProcswitchcase

  • Windows HICON)HCURSORHWNDHINSTANCEWindowsAPIAPIWindowsMFCWindowsMFC

  • MFCpublicCWndm_hWndMFCAttach()MFCMFCDetach()CWnd myWnd; HWND hWnd; myWnd.Attach(hWnd); . . . . . . myWnd.Detach();

  • WindowsWindowsWM_WM_COMMANDWM_MOVE WM_PAINTControl NotificationWM_COMMANDWM_COMMANDCommandWM_COMMAND

  • typedef struct tagMSG { HWND hWnd; // UINT message;// WPARAM wParam;// 116 LPARAM lParam;// 232 DWORD time;// POINT pt; // } MSG;MSG

  • 2 HelloAa HelloHello.cppWndProc()switch case WM_KEYDOWN: // if(wParam==0x41) // Aa0x41HMessageBox(NULL, "The key you pressed is A or a !","KEYDOWN",NULL); else MessageBox(NULL, "The key you pressed is not A or a !","KEYDOWN",NULL); break;

  • MFC Windows APIWindowsWindowsWindows Visual C++MFCWindows

  • MFCC++MFCWindows200Windows MFCMicrosoft Windows/MFCH

  • MFCVisual C++MFCMFC AppWizardMFCClassWizardWindowsMFCWindows C5%MFCWindows APIWindows

  • MFCMFCMFCMFCMFCMFCCObjectWindowsMFC MFCAfxafx

  • MFCWindowsAPIWindows API Visual C++MFCMFCMFCMFC MFCMFCMFC MFCWizard

  • MFC MFCMFC theAppWinMain()MFCWinMain()MFC

  • MDI

  • MFC

  • MFC

  • MFC MFCCWinApptheAppMFCtheApptheAppMFCAfxWinMain() AfxWinMain()AfxGetApp()theApppApppAppRun()WM_PAINTOnPaint()Run()WM_QUITExitInstance()

  • WinMain

  • MFC InitInstance()

  • MFC

  • MFC MFCMFCMFCMFCSDKMFCWindowsMFCAPIMFC

  • MFC MFCMessage MapC/C++switch-caseMFC,WindowsDECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP()END_MESSAGE_MAP()ON_COMMAND:ID ON_COMMAND(ID_FILE_NEWCWinApp::OnFile New)MFC ClassWizard

  • AppWizard //{{AFX_MSG(CTttApp)afx_msg void OnAppAbout();//}}AFX_MSGDECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP(CTApp, CWinApp)//{{AFX_MSG_MAP(CTttApp)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)//}}AFX_MSG_MAPEND_MESSAGE_MAP() ID_APP_ABOUTOnAppAbout

  • MFCMESSAGE_MAPBEGIN_MESSAGE_MAP(theclass, baseclass)//{{AFX_MSG_MAP(theclass)ON_ . . . . . . // MFCON_MESSAGE(message , memberFxn) // . . . . . . //}}AFX_MSG_MAPEND_MESSAGE_MAP()//{{AFX_MSG_MAPClassWizard

  • ClassWizardWM_CLOSEWM_DESTROYEdit|CopyClassWizard ClassWizardClassWizard BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() // MFC AppWizard ON_WM_CLOSE() // ClassWizard ON_WM_DESTROY() ON_COMMAND(ID_EDIT_COPY, OnEditCopy) //}}AFX_MSG_MAP END_MESSAGE_MAP()

  • ClassWizardclass CMainFrame : CFrameWnd{public: CMainFrame();protected: //{{AFX_MSG(CMainFrame) // afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // afx_msg void OnClose(); // ClassWizard afx_msg void OnDestroy(); afx_msg void OnEditCopy(); //}}AFX_MSG DECLARE_MESSAGE_MAP() // };

  • SendPostWindowsAPISendMessage() PostMessage()SendDlgItemMessage()

  • MFCCWndpMyView->SendMessage()pMyViewPostSend

  • :IDMFCWM_USER0x0400WM_USER#define#define WM_USER1 WM_USER+0#define WM_USER2 WM_USER+1

  • BEGIN_MESSAGE_MAP()END_MESSAGE_MAP() ON_MESSAGE(message, memberFxn) messagememberFxn afx_msg afx_msg LRESULT memberFxn (WPARAM wParam , LPARAM lParam);wParamlParamCWnd::SendMessage()CWnd:: PostMessage()

  • WM_TIMER 1MFC AppWizard[exe]RotateClassWizardCRotateViewWM_CREATEWM_TIMER SetTimer(1,200,NULL); // 2RotateView.cpp#define WM_MYMESSAGE WM_USER+1 ClassWizardCRotateViewWM_TIMESendMessage(WM_MYMESSAGE);

  • 3CRotateViewafx_msg LRESULT OnMyMessage( WPARAM wParam, LPARAM lParam); RotateView.cppBEGIN_MESSAGE_MAP END_MESSAGE_MAPON_MESSAGE(WM_MYMESSAGE,OnMyMyessage) 4CRotateViewprivateintm_dEscapementCRotateViewm_dEscapement=0; 5RotateView.cpp6ClassWizardWM_DESTROYKillTimer(1);

  • MFC #defineMFCMFCMFCMFCAfxwin.hAfx.hAfxmsg_.hMFCMFC

  • MFC

  • MFC CRuntimeClass CRuntimeClassMFCCRuntimeClassCObjectRTTICRuntimeClass CObjectCRuntimeClassCRuntimeClassRUNTIME_CLASS()MFC

  • CObjectMFCCObjectCObjectMFCCObject MFCAssertValid()Dump() GetRuntimeClass()IskindOf()

  • 1 Insert|New ClassCObjectCHumanCHumanAssertValid()ASSERT void CHuman::AssertValid() const{ CObject::AssertValid(); ASSERT(m_year>0); ASSERT(m_year
  • 2 CHumanDump()m_year void CHuman::Dump(CDumpContext &dc ) const{CObject::Dump(dc); dc
  • CCmdTargetCCmdTargetCObjectMFCCCmdTarget3BeginWaitCursor()EndWaitCursor()BeginWait- Cursor()RestoreWaitCursor() void CMyView::OnSomeCommand(){BeginWaitCursor(); // . . . . . . // EndWaitCursor(); // }

  • CWinAppMFCCWinAppWinMain()SDKSDKWinMain()CWinAppInitApplication()InitInstance()Run()MFCCWinApp

  • CWndCWndCCmdTargetCWndMFCGUIMFCCWnd

  • CFrameWndCFrameWndCWndSDKWndProc()CFrameWndCFrameWndSDIMDICMDIFrameWndCMDIChildWndCFrameWnd

  • CDocumentCViewCDocumentCDocument CDocument CViewMFCMFC

  • 631HelloSDKHELPMessage,Message _itoa()632Win32 Application WizardWindows1 A empty projectHello MFC! 633 SDIAPISetTimer()APILineDDA()635HelloSDKAPIWM_CHARXx 638 639WM_TIMER645: SDI2

    hwndVCHWNDmessageVCWM_xxxxxxWM_MOUSEMOVEWM_KEYDOWNWM_CHARWM_xxxWM_xxxWM_xxxgoto definitionwParamlParammessagewParamlParam17