您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 关于MFC的基础知识
Day01一MFC课程的知识点1MFC微软基础类库和框架2COM组件的原理以及应用3ADO-MFC对数据库的访问4SOCKEDT-windows平台下网络通信二MFC课程中需要掌握的技能1断点调试程序2使用callstack查看函数的调用关系3熟练使用向导(生成向导,类向导)和工具4借助MSDN查看三对大家期望和要求1不要缺课,课程连续极强。2多思考,多练习。3营造良好的课堂气氛。四自我介绍..........*************************************************一MFC的概念,历史和作用1什么MFC?全称是MicrosoftFoundationClassLibrary微软基础类库它封装了WINDOWS应用程序的各种API函数,以及相关的机制,C++语法中的数据结构。1.1MFC就是一个大类库1.2MFC还是一个程序的框架2MFC历史VC6.0-MFC5.XVC7.0(VC2003)-MFC6.XVC8.0(VC2005)-MFC7.XVC9.0(VC2008)-MFC8.XVC10.0(VC2010)-MFC9.X二MFC的头文件afx.h-包含了MFC的大部分类的头文件afxwin.h-包含了afx.h和windows.hafxext.h-提供了扩展窗口类的支持,例如工具栏,状态栏。三MFC应用程序类型1支持MFC的控制台程序1.1main函数不同于普通的控制台程序的main函数1.2CWinApptheApp多了一个全局对象。1.3AfxWinInit-初始化MFC库的各个信息。(在MFC库中以Afx....开头的函数基本可以确定为全局函数)2MFC库程序2.1支持MFC的静态库程序2.2支持MFC的动态库程序1)MFC规则库使用静态MFC库生成自己的DLL使用动态MFC库生成自己的DLL2)MFC扩展库规则库可以被所有程序调用,扩展库只能被支持MFC的程序使用。2.3支持MFC的窗口程序1)单文档视图构架程序(SDI)CFrameWnd-框架窗口类(负责管理主窗口)CWinApp-应用程序类(负责管理整个程序的流程)CDocument-文档类(负责管理数据)CView-视图窗口类(负责显示数据)2)多文档视图构架程序(MDI)CMDIChildWnd-子框架窗口类(负责管理子框架窗口CMDIFrameWnd-主框架窗口类(负责管理主窗口)CWinApp-应用程序类(负责管理整个程序的流程)CDocument-文档类(负责管理数据)CView-视图窗口类(负责显示数据)3)对话框构架程序CWinApp-应用程序类(负责管理整个程序的流程)CDialog-对话框类(负责管理对话框)四MFC相关类的说明1CObject类MFC库中绝大部分类的基类,提供了MFC类库中一些最基本的机制运行时类信息机制动态创建机制序列化机制2CWinApp应用程序类,负责整个程序的流程。3CDocTemplate-文档模板类4CDocument-文档类,负责管理数据5FrameWindows框架窗口类,封装了窗口程序的各种框架窗口CSplitterWnd-用来拆分窗口。6ControlBars-各种控制栏类7PropertySheets-属性页类8DialogBoxes-对话框类,封装各种对话框类9Views-视图类,封装了各种视图窗口10Controls-控件类11Exception-异常类,封装了MFC程序的各种异常。12File-文件类,各种文件I/O操作。13绘图类,包含了CDC类和CGdiObject14对数据库的操作ODBC/DAO.15数据集合类CArraryCListCMap封装了相应数据结构的管理16非CObject类提供了各种数据结构的相关管理CPoint,CRect,CString等五第一个MFC程序1设置环境1.1删除入口函数1.2将包含的头文件更改为afxwin.h1.3在Project--Setting--General中选择使用MFC库2程序的编写2.1定义一个派生自CFrameWnd类的子类。2.2定义一个派生自CWinApp类的子类,并且重写虚函数InitInstance,在函数内部创建并显示窗口。六程序的启动1程序的入口与Win32相同WinMain但是MFC库已经实现了入口函数,所以程序中不需要实现。2程序的执行过程2.1程序的启动构造theApp全局对象开始,调用CWinApp的构造函数2.1.1将全局对象theApp的地址保存到当前程序模块状态信息中。2.1.2将全局对象theApp的地址保存到当前程序线程状态信息中。AfxGetApp()/AfxGetThread()-获取全局对象theApp的地址。2.2进入WinMain函数,调用AfxWinMain函数2.3AfxWinMain函数执行2.3.1获取theApp的地址。2.3.2调用AfxWinInit初始化MFC库2.3.3调用CWinApp类的虚函数InitApplication初始化应用程序。2.3.4调用CWinApp类的虚函数InitInstance创建框架类的对象,并创建显示窗口。2.3.5使用CWinApp类的虚函数Run,实现消息循环。2.3.6结束MFC程序善后处理调用CWinApp类的虚函数ExitInstance3CWinApp类3.1InitInstance3.2ExitInstance-善后处理3.3OnIdle-空闲处理3.4Run-消息循环变量m_pMainWnd-用于保存当前程序的主窗口对象地址。一MFC窗口的创建1加载菜单2调用CWnd::CreateEx创建窗口2.1调用了PreCreateWindow函数设计窗口类调用了AfxDeferRegisterClass函数,在函数内部设计窗口类WNDCLASSwndcls;wndcls.lpfnWndProc=DefWindowProc;..........将窗口的窗口处理定义为缺省处理函数。调用了AfxRegisterWithIcon函数,在这个函数内部调用了AfxRegister函数,在这个函数内部调用windowsapi函数::RegisterClass将设计的窗口类各项信息注册到操作系统。2.2调用了AfxHookWindowCreate函数1)在函数内部,调用SetWindowsHookEx函数在程序中创建一个钩子钩子类型为WH_CBT,钩子处理函数为_AfxCbtFilterHook。2)将程序员自己new窗口类对象地址,保存到线程信息中。2.3调用CreateWindowEx创建窗口,马上调用钩子处理函数。3钩子处理函数3.1将窗口句柄以及窗口类对象进行绑定(一对一)3.2通过AfxGetAfxWndProc获取AfxWndProc函数的地址。3.3通过SetWindowLong函数将窗口处理函数更改为AfxWndProc。注意:窗口处理函数不能为DefWindowProc。4处理消息4.1当收到消息进入窗口处理函数AfxWndProc4.2根据消息所属窗口的句柄,从MFC的数据结构中(映射类)查找窗口句柄对应的窗口类对象4.3调用AfxCallWndProc,在这个函数内部调用WindowProcstructAFX_MSGMAP_ENTRY{UINTnMessage;//消息IDUINTnCode;//通知码UINTnID;//命令ID(控件ID)UINTnLastID;//最后一个控件IDUINTnSig;//消息处理函数的类型AFX_PMSGpfn;//消息处理函数的指针(成员函数指针)};structAFX_MSGMAP{constAFX_MSGMAP*pBaseMap;//指向AFX_MSGMAP结构体的指针constAFX_MSGMAP_ENTRY*lpEntries;//指向上面的结构体指针};Day02一MFC消息映射机制(CCmdTarget为消息映射机制的最基类)1消息映射机制的使用1.1在框架窗口类的定义中,增加消息映射机制的声明宏DECLARE_MESSAGE_MAP()1.2在框架窗口类的实现中,增加消息映射机制的实现宏BEGIN_MESSAGE_MAP(theClass,baseClass)END_MESSAGE_MAP()1.3在类内增加消息处理的成员函数LRESULTOnCreate(UINTmessage.........);1.4在声明宏之间增加,消息ID和对应的消息处理成员函数地址BEGIN_MESSAGE_MAP(theClass,baseClass)ON_MESSAGE(WM_CREATE,OnCreate)........END_MESSAGE_MAP()2消息映射机制的原理2.1数据结构structAFX_MSGMAP_ENTRY{UINTnMessage;//消息IDUINTnCode;//通知码UINTnID;//命令ID/控件IDUINTnLastID;//控件的最后一个IDUINTnSig;//消息处理函数的指针类型AFX_PMSGpfn;//消息处理函数};structAFX_MSGMAP{constAFX_MSGMAP*pBaseMap;//父类的静态变量地址constAFX_MSGMAP_ENTRY*lpEntries;//本类的静态数组首地址};2.2各个部分的作用messageMap-静态变量1指向父类的静态变量地址(生成链表,链表的节点)2指向本类静态数组首地址(找到数组)_messageEntries[]-静态数组每个元素保存了消息ID和对应成员处理函数指针GetMessageMap-虚函数获取本类的静态变量地址(获取了链表尾节点)3执行过程3.1获取本类静态变量地址(pMessageMap),进而获取本类的静态数组首地址,遍历数组所有元素匹配消息ID。3.2如果匹配到了,返回匹配到的数组元素地址(lpEntry),并调用数组元素的最后一个成员(类的成员函数地址),完成消息的处理3.3如果没有匹配到,循环获取到父类的静态变量地址,并执行遍历数组所有元素,一直到CCmdTarget类中静态变量为止。3.4如果一直没有匹配到,调用DefWindowProc函数做默认处理。二MFC消息的分类1标准的WINDOWS消息,窗口消息,鼠标,键盘等消息ON_WM_CREATE/ON_WM_PAINTON_WM_XXX2用户自定义消息#defineWM_MYMESSAGEWM_USER+NON_MESSAGE3命令消息,点击菜单项,加速键,控件,工具栏...等ON_COMMAND(命令ID,处理函数)ON_COMMAND_RANGE(起始ID,终止ID,处理函数)4系统注册消息UINTRegisterWindowMessage(LPCTSTRlpString//消息的名称);//消息的ID三菜单1MFC菜单相关问题WIN32-HMENUCMenu-封装了菜单句柄,和操作菜单的相关的API函数。2菜单的使用2.1添加菜单资源2.2在窗口的WM_CREATE消息中将菜单设置到窗口中调用CMenu类成员函数LoadMenu加载菜单资源。调用CWnd类的成员函数SetMenu设置到窗口。2.3WM_COMMAND消息的处理顺序Frame--App3右键菜单马志国mazhiguo01@163.com麻烦、乱、绕。/基于MFC快速开发-----------------------------------day04一工具栏1工具栏相关类CToolBar-封装了和窗口之间的关系。CToolBarCtrl-封装了对工具栏上控件的设置2头文件#includeafxext.h3工具栏的使用3.1创建工具栏Create/CreateEx3.2加载工具栏LoadToolBar3.3停靠工具栏3.3.1设置工具栏允许停靠EnableDocking3.3.2设置框架窗口允许被停靠CFrameWnd::EnableDocking3.3.3停靠工具栏CFrameWn
本文标题:关于MFC的基础知识
链接地址:https://www.777doc.com/doc-2674601 .html