04. MFC框架
MFC框架
- mfc:微软基础类库。并且包含一个应用程序框架,其中包含的类包含大量Windows句柄封装类和很多 Windows的内建控件和组件的封装类。
MFC和Win32的关系
- MFC是高层的,Win32是低层的。
- win32是windows下的最基本的编程方式,它是其它所有方式实现的基础。
- mfc是封装的类,最后还是会调用win32 api,可以理解为mfc是对win32的封装,使用win32编程的 方式,写了一个又一个的类,使用方便。
MFC分类
MFC分为:
- 单文档
- 多文档
- 基于对话框
- 多个顶级文档
MFC程序组成
以单文档为例。
在类视图中,后缀是dlg的是对话框类,mainframe是程序框架类,后缀带APP的类为MFC应用程序实例 类,后缀为doc为文档类,后缀为view为视图类。
theApp
每一个应用程序都有一个唯一的自动生成的全局变量:theApp类对象。
在app类里面定义且赋值
CMainFrame类
框架类表示应用程序的主框架窗口,其主要作用是响应标准的窗口消息。不过它通常先将消息按照一定 的次序传递给视图类以及文档类等其它命令处理类。
另外,它还为视图类提供可视化的边框,同时也包括标题栏,一些标准的窗口组件等。
视图类
占用框架窗口的客户区,主要负责显示文档数据,也为文档对象和用户之间提供了用以交互的可视接口。
通常,一般的绘制操作都是在该类中完成,因此有时也称为“绘制窗口”。
文档类
实际上是一种数据结构。通常,它不但包含应用中所需的数据,而且也包含了处理这些数据的方法。 注意:每个类可以通过继承链往上找父类,去看类的继承结构。
MFC应用程序框架
- 主要是类写类之间的联系。
- win32应用程序的执行过程:winmain->WNDCLASSEX->RegisterClassEx->CreateWindow- >ShowWindow->UpdateWindow->消息循环
- mfc应用程序的执行过程:全局对象theApp->相关构造函数->WinMain函数
- 调用完CWinApp的构造函数以后由连接器向程序内自动链接的AfxWinMain函数将被调用,而这个函数可以被看作MFC程序的入口函数。
消息映射
win32中的消息一般由三个部分组成:
-
一个无符号整数,消息ID
-
消息附带的WPARAM类型的参数
-
消息附带的LPARAM类型的参数
然后使用消息队列。当应用程序在消息队列去获得消息时,通过窗口消息处理函数去匹配相应的消息ID 再进行处理。
在MFC中使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数建 立一一对应的消息映射表,以及消息处理函数的声明和实现等代码。
当窗口接收到消息时,会到消息映射表中查找该消息对应的消息处理函数,然后由消息处理函数进行相应的处理
消息映射表
- 除了一些没有基类的类或CObject的直接派生类外,其他的类都可以自动生成消息映射表。
//BEGIN和END区间就为消息映射表
BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
...
END_MESSAGE_MAP()
添加消息处理函数
- 当鼠标双击对话框的控件时,会自己生成与控件对应的消息处理函数,并把这个映射的过程写入映射表 中。
- 该过程有3步:
- 在类定义时加入消息处理函数的函数声明,注意:要以afx_msg开头
- 在类的消息映射表中添加该消息的消息映射入口项。
- 在类实现中添加消息处理函数的函数实现。
- 所以,删除一个控件之后,需要把三处的内容一并删除
无控件直接添加消息处理函数
-
在”类向导“中,找到要响应的消息,找到后点击右侧的”添加处理程序“,这样也能直接为该对话框类添加 一个消息处理函数。
*:处理回车键闪退的问题:
- 右键项目文件,选择“类向导”
- 找到“虚函数” -> OnOK,双击或点击右侧添加函数来重写这个函数
- 将
CDialogEx::OnOK();
删掉或者注释掉,因为父类函数会接收回车闪退
控件的值变量与控件变量
- control型变量是这个控件所属类的一个实例(对象)可以通过这个变量来对该控件进行一些设置。
- value型变量仅仅可以获得该控件的public型变量。
- Value 就是一个变量, control 就是一个控件。 主要的区别也就是变量和控件之间的区别,虽然他们 实质上都是一样的。 可是选择 Value ,MFC 会把控件的内容对应到一个变量上。除非你用其他API取 得这个
- 控件进行操作,否则,就是一个变量而已。主要的用途是 UpdateData,进行数据读写。
UpdateData
- 可以更新数据,当参数为true代表从界面中输入数据到关联的变量。如果为false代表反向,将关联变量的值更新到界面上
- 一个UpdateData的函数将会对所有的数值型关联变量进行更新或输出,不需要多次调用。
对话框模板属性
-
模态对话框:一般用的是模态,理解为当这个对话框没有处理完,是无法跳过该对话框进行操作 (如MessageBox)
-
非模态对话框:这个对话框和其它窗口的操作是可以独立操作的。(如QQ聊天框)
控件位置编辑
- 在对话框中选中多个控件,在vs的工具栏里面就会有一个“对话框编辑器”。在编辑器中会有一些:左对 齐,右对齐,顶对齐,底对齐,垂直,水平等等,可以自行使用,让控件变得对齐。
- 横向:有3个控件,中间的控件会移到前后两个控件的水平位置的中间。纵向,同上。
- 使宽度、高度、大小相同:先操作的第一个控件,变成和后操作的第二个控件一样的宽度或高度或大小。
图片控件
- picture control 图片的绘制在windows中讲过
- 需要.bmp格式(BitMap位图)的图片。
图片控件示例
-
导入bmp格式图片。
-
拖入一个”picture control“控件。修改属性”type“。再修改”image“。
-
如果在MFC中出现了错误:error RC2108: expected numerical dialog constant。选择双击这个错误,然后系统会弹出一个.rc的文件,在这个文件中找到刚图片控件的代码:
CONTROL IDB_BITMAP1,IDC_STATIC,202,12,105,129,NOT WS_GROUP
改为:
CONTROL IDB_BITMAP1,IDC_STATIC,"Static",SS_BITMAP,202,12,105,129,NOT WS_GROUP
即可解决报错的问题。
-
通过外部文件加载,创建一个”picture control“控件,修改ID。修改属性页”type“。然后在初始化函 数中加入代码:
CStatic *pPic = (CStatic*)GetDlgItem(IDC_STATIC_BMG); HBITMAP bitmap; bitmap = (HBITMAP)LoadImage(AfxGetApp()- >m_hInstance,_T("8.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE); pPic->SetBitmap(bitmap);// <br>//在Picture的Type调为Bitmap