关于MFC的基础知识.docx
- 文档编号:11971350
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:62
- 大小:37.83KB
关于MFC的基础知识.docx
《关于MFC的基础知识.docx》由会员分享,可在线阅读,更多相关《关于MFC的基础知识.docx(62页珍藏版)》请在冰豆网上搜索。
关于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.X
VC7.0(VC2003)-MFC6.X
VC8.0(VC2005)-MFC7.X
VC9.0(VC2008)-MFC8.X
VC10.0(VC2010)-MFC9.X
二MFC的头文件
afx.h-包含了MFC的大部分类的头文件
afxwin.h-包含了afx.h和windows.h
afxext.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库生成自己的DLL
2)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类和CGdiObject
14对数据库的操作ODBC/DAO.
15数据集合类CArraryCListCMap封装了相应数据结构的管理
16非CObject类
提供了各种数据结构的相关管理CPoint,CRect,CString等
五第一个MFC程序
1设置环境
1.1删除入口函数
1.2将包含的头文件更改为afxwin.h
1.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类的虚函数
ExitInstance
3CWinApp类
3.1InitInstance
3.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当收到消息进入窗口处理函数AfxWndProc
4.2根据消息所属窗口的句柄,从MFC的数据结构中(映射类)查找
窗口句柄对应的窗口类对象
4.3调用AfxCallWndProc,在这个函数内部调用WindowProc
structAFX_MSGMAP_ENTRY
{
UINTnMessage;//消息ID
UINTnCode;//通知码
UINTnID;//命令ID(控件ID)
UINTnLastID;//最后一个控件ID
UINTnSig;//消息处理函数的类型
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;//消息ID
UINTnCode;//通知码
UINTnID;//命令ID/控件ID
UINTnLastID;//控件的最后一个ID
UINTnSig;//消息处理函数的指针类型
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_PAINT
ON_WM_XXX
2用户自定义消息
#defineWM_MYMESSAGEWM_USER+N
ON_MESSAGE
3命令消息,点击菜单项,加速键,控件,工具栏...等
ON_COMMAND(命令ID,处理函数)
ON_COMMAND_RANGE(起始ID,终止ID,处理函数)
4系统注册消息
UINTRegisterWindowMessage(
LPCTSTRlpString//消息的名称
);//消息的ID
三菜单
1MFC菜单相关问题
WIN32-HMENU
CMenu-封装了菜单句柄,和操作菜单的相关的API函数。
2菜单的使用
2.1添加菜单资源
2.2在窗口的WM_CREATE消息中将菜单设置到窗口中
调用CMenu类成员函数LoadMenu加载菜单资源。
调用CWnd类的成员函数SetMenu设置到窗口。
2.3WM_COMMAND消息的处理顺序
Frame-->App
3右键菜单
马志国mazhiguo01@
麻烦、乱、绕。
/基于MFC快速开发
-----------------------------------
day04
一工具栏
1工具栏相关类
CToolBar-封装了和窗口之间的关系。
CToolBarCtrl-封装了对工具栏上控件的设置
2头文件#include
3工具栏的使用
3.1创建工具栏
Create/CreateEx
3.2加载工具栏
LoadToolBar
3.3停靠工具栏
3.3.1设置工具栏允许停靠
EnableDocking
3.3.2设置框架窗口允许被停靠
CFrameWnd:
:
EnableDocking
3.3.3停靠工具栏
CFrameWnd:
:
DockControlBar
3.4设置工具栏按钮的提示信息
3.4.1工具栏风格加上CBRS_TOOLTIPS
3.4.2在工具栏按钮资源中添加提示信息
3.5工具栏的消息处理
工具栏按钮的ID设置成相关菜单的ID
3.6工具栏的显示/隐藏
CFrameWnd:
:
ShowControlBar
补充:
菜单的状态
ON_UPDATE_COMMAND_UI宏
二状态栏
1状态栏相关类
CStatusBar-封装了和窗口之间的关系。
CStatusBarCtrl-封装了对状态栏上控件的设置
2头文件#include
3状态栏的使用
3.1创建状态栏
Create/CreateEx
3.2设置状态栏指示器
SetIndicators
3.3设置状态栏的文件
SetPaneText
三视图
1视图相关类
CView以及CView子类-父类是CWnd,主要功能和作用显示数据的窗口。
2头文件
CView#include
CEditView#include
CTreeView#include
3CView的使用
3.1创建
继承自CView类创建对象时,实现纯虚函数OnDraw
3.2显示
AFX_IDW_PANE_FIRST
3.3销毁
CView类在函数PostNcDestroy中调用deletedthis;自我销毁
所以,new视图对象。
防止销毁两次
3.4视图的命令消息处理
把视图设置为框架窗口的活动视图,两种方式去设置
3.4.1指针赋值
m_pViewActive=m_pwndView;
3.4.2调用函数
SetActiveView(m_pwndView);
3.5对命令消息的处理顺序
View->FramWnd->App
3.6OnDraw函数,作用显示数据
------------------------------------
作业:
WM_PAINT的消息处理函数OnPaint作用是显示数据,他和OnDraw函数
的关系是什么?
如果在自定义的视图类中,两个函数都存在,哪个会执行?
提示:
设置断点,查看CallStack。
一切分窗口
1切分窗口的类型
静态切分-在创建切分窗口时,就完成了窗口切分。
每一个切分单元可以选择不同的视图类。
动态切分-在程序运行时,完成窗口切分。
每一个切分单元都使用相同的视图类
2相关类以及头文件
CSplitterWnd-父类是CWnd,完成窗口切分。
#include
3动态切分
3.1创建CSplitterWnd对象
3.2在框架窗口的OnCreateClient函数中完成切分
3.2.1在结构CCreateContext中指定使用的视图的运行时类信息
3.2.2CSplitterWnd:
:
Create
3.3注意:
切分数量最大2*2
4静态切分
4.1创建CSplitterWnd对象
4.2在框架窗口的OnCreateClient函数中完成切分
4.2.1CSplitterWnd:
:
CreateStatic
4.2.2CSplitterWnd:
:
CreateView
(**)4.3切分窗口的再切分
1IdFromRowCol-获取相关切分窗口的ID
2SetColumnInfo/SetRowInfo-设置行/列的信息(切分条位置)
4.4注意:
切分数量,最大16*16
二运行时类信息
1概念
程序在运行时,获取对象的类的信息。
CDog->CAnimal->CObject
CDogdog;
dogisaCDog?
TRUE
dogisaCAnimal?
TRUE
dogisaCObejct?
TRUE
dogisaCWnd?
FALSE
2定义支持运行时类信息的类
2.1继承自CObject
2.2添加运行时类信息的宏
声明宏DECLARE_DYNAMIC(theClass)
实现宏IMPLEMENT_DYNAMIC(theClass,baseClass)
3CObject类中和运行时类信息相关的函数
3.1CRuntimeClass*GetRuntimeClass(),获取对象的运行时类信息
3.2BOOLIsKindOf(constCRuntimeClass*pClass),判断对象是否属于某个类
4实现原理
4.1结构
structCRuntimeClass
{
LPCSTRm_lpszClassName;//类的名称
intm_nObjectSize;//对象的大小
UINTm_wSchema//类的版本
CObject*(PASCAL*m_pfnCreateObject)();//创建对像的函数指针
CRuntimeClass*(PASCAL*m_pfnGetBaseClass)();//函数指针,指向父类的CRuntimeClass变量的地址
...
};
4.2作用
4.2.1classCDog-结构体变量,存储了类的名称、大小、版本号,指向_GetBaseClass函数的指针。
4.2.2GetRuntimeClass-获取当前类的运行时类信息变量classCDog的地址
4.2.3GetRuntimeClass-获取父类的运行时类信息变量classCAnimal
的地址
4.3关系(类的信息链表)
CDog:
:
GetRuntimeClass()
|->&classCDog
|->类的名称、大小、版本号
|->CDog:
:
_GetBaseClass()
|->&classCAnimal
|->类的名称、大小,版本号
|->CAnimal:
:
_GetBaseClass()
|->&classCObject
|->类的名称、大小、版本号
|->CObject:
:
_GetBaseClass()
(NULL)
4.4dog.IsKindOf(RUNTIME_CLASS(CWnd))?
参数"CWnd"
对象CDog类的对象dog,"CDog"=>"CAnimal"=>"CObject"=>NULL
三动态创建
1概念
创建未知类型的对象
2作用
通常,我们使用系统的(MFC的)类创建对象,调用对象的成员函数完成相应的功能。
有了动态创建,系统的(MFC的)底层代码就可以创建我们定义的类的对象了。
3定义支持动态创建的类
3.1继承自CObject
3.2添加动态创建宏
DECLARE_DYNCREATE(theClass)
IMPLEMENT_DYNCREATE(theClass,baseClass)
4实现原理
4.1展开宏,在运行时类信息的宏的基础上,多了一个创建对象的CreateObject函数。
4.2作用
1CreateObject-创建对象的函数
2classCDog-原来包含的创建对象的函数指针NULL,现在指向CreateObject函数.
4.3创建过程
4.3.1获取类的运行时类信息classCDog
4.3.2调用classCDog的CreateObject函数
4.3.3在CreateObject函数中,根据在classCDog结构中保存的CreateObject的函数指针调用该函数(CDog:
:
CreateObject)
4.3.4在CDog:
:
CreateObject函数中,returnnewCDog;
MFC六个机制:
1启动机制2窗口创建机制3消息映射
4运行时类信息5动态创建6(序列化)
C++语法:
虚函数,多态(虚析构作用?
虚继承?
),指针,结构,链表
作业:
完成窗口切分的再切分。
一文档类
1文档类相关
CDocument-继承自CCmdTarget类,作用管理数据。
2文档类的使用
2.1在视图中显示文档数据的例子
CView:
:
OnInitialUpdate-函数在附加文档后,视图显示前被调用
CFrameWnd:
:
InitialUpdateFrame-调用时,引起所有与它相关的视图窗口的OnInitialUpdate的调用,在创建窗口之后调用
2.2(创建过程)思考?
视图如何被创建?
在什么时候被创建?
文档类与视图的关系如何建
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 MFC 基础知识
![提示](https://static.bdocx.com/images/bang_tan.gif)