MFC初步教程(一)
学习过很多语言以及环境,对于Java、C++、Qt等都很容易理解,并且能很快上手做项目,唯独对MFC一直浑浑噩噩,不太清楚,参与项目总是独立负责一块,与业务逻辑更相关,用std库的机会多,与GUI、Doc/View打交道的时间少,没有对其进行系统地学习。现在独立完成项目,各方面都要清楚,尤其觉得MFC是自己的一个短板,更觉得有系统一学的必要。
一、用MFC创建窗口
MFC的目的是减轻程序员的工作量,让程序员专注于程序的逻辑而非一堆离散的SDK函数,其主要作用是将绝大部分常用的函数包装好,提供一个完整的框架。在MFC中,有两个类最为重要,一个是CWinApp,另一个是CFrameWnd ,前者负责实现应用级别的功能,后则实现GUI相关的功能。
MFC中的所有类都继承与CCmdTarget,CCmdTarget类都具有处理消息映射中的消息的能力(即能处理windows消息)。在CWinApp中,一个重要的重载函数是InitInstance,它负责窗口的创建;它还有一个重要的数据成员m_pMainWnd,它是指向窗口的指针。
以下我们用CWinApp和CFrameWnd两个类构建一个window是程序,(新建一个Win32空项目,添加如下代码的文件)其代码如下所示:
#include <afxwin.h> class MFC_Tutorial_Window: public CFrameWnd { public: MFC_Tutorial_Window() { Create(NULL, "MFC Tutorial"); } }; class MyApp: public CWinApp { MFC_Tutorial_Window *wnd; public: BOOL InitInstance() { wnd = new MFC_Tutorial_Window(); m_pMainWnd = wnd; m_pMainWnd->ShowWindow(1); return 1; } }; MyApp theApp;
然后选择project->setting->General->using MFC in a shared dll
二、消息映射
继承自CCmdTarget的类均具有处理windows消息的能力,MFC提供了一中消息映射的机制,即每个集成自CCmdTarget的类均可声明自己处理的消息,下面通过简单的实例说明MFC中消息映射的实现方式。
#include <afxwin.h> class MFC_Tutorial_Window :public CFrameWnd { public: MFC_Tutorial_Window() { Create(NULL,"MFC Tutorial Part 2 CoderSource Window"); } void OnLButtonDown(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP() // 说明MFC_Tutorial_Window会处理相关window是消息 }; BEGIN_MESSAGE_MAP( MFC_Tutorial_Window, CFrameWnd) // 定义MFC_Tutorial_Window中的消息映射,MFC_Tutorial_Window是CFrameWnd的子类,声明事件处理链 ON_WM_LBUTTONDOWN() //Macro to map the left button click to the handler // 如果在此声明的消息在MFC_Tutorial_Window中没有提供消息处理函数,则在CFrameWnd中寻找 END_MESSAGE_MAP() void MFC_Tutorial_Window::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CFrameWnd::OnLButtonDown(nFlags, point); MessageBox("Left Button clicked"); } class MyApp :public CWinApp { MFC_Tutorial_Window *wnd;? public: BOOL InitInstance() { wnd = new MFC_Tutorial_Window(); m_pMainWnd = wnd; m_pMainWnd->ShowWindow(1); return 1; } }; MyApp theApp;