MFC框架

  • mfc:微软基础类库。并且包含一个应用程序框架,其中包含的类包含大量Windows句柄封装类和很多 Windows的内建控件和组件的封装类。

MFC和Win32的关系

  • MFC是高层的,Win32是低层的。
  1. win32是windows下的最基本的编程方式,它是其它所有方式实现的基础。
  2. mfc是封装的类,最后还是会调用win32 api,可以理解为mfc是对win32的封装,使用win32编程的 方式,写了一个又一个的类,使用方便。

MFC分类

MFC分为:

  1. 单文档
  2. 多文档
  3. 基于对话框
  4. 多个顶级文档

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中的消息一般由三个部分组成:

  1. 一个无符号整数,消息ID
  2. 消息附带的WPARAM类型的参数
  3. 消息附带的LPARAM类型的参数

然后使用消息队列。当应用程序在消息队列去获得消息时,通过窗口消息处理函数去匹配相应的消息ID 再进行处理。

在MFC中使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数建 立一一对应的消息映射表,以及消息处理函数的声明和实现等代码。

当窗口接收到消息时,会到消息映射表中查找该消息对应的消息处理函数,然后由消息处理函数进行相应的处理

消息映射表

  • 除了一些没有基类的类或CObject的直接派生类外,其他的类都可以自动生成消息映射表。
//BEGIN和END区间就为消息映射表
BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ...
END_MESSAGE_MAP()

添加消息处理函数

  • 当鼠标双击对话框的控件时,会自己生成与控件对应的消息处理函数,并把这个映射的过程写入映射表 中。
  • 该过程有3步:
  1. 在类定义时加入消息处理函数的函数声明,注意:要以afx_msg开头
  2. 在类的消息映射表中添加该消息的消息映射入口项。
  3. 在类实现中添加消息处理函数的函数实现。
  • 所以,删除一个控件之后,需要把三处的内容一并删除

无控件直接添加消息处理函数

  • 在”类向导“中,找到要响应的消息,找到后点击右侧的”添加处理程序“,这样也能直接为该对话框类添加 一个消息处理函数。
    *:处理回车键闪退的问题:
  1. 右键项目文件,选择“类向导”
  2. 找到“虚函数” -> OnOK,双击或点击右侧添加函数来重写这个函数
  3. CDialogEx::OnOK(); 删掉或者注释掉,因为父类函数会接收回车闪退

控件的值变量与控件变量

  • control型变量是这个控件所属类的一个实例(对象)可以通过这个变量来对该控件进行一些设置。
  • value型变量仅仅可以获得该控件的public型变量。
  • Value 就是一个变量, control 就是一个控件。 主要的区别也就是变量和控件之间的区别,虽然他们 实质上都是一样的。 可是选择 Value ,MFC 会把控件的内容对应到一个变量上。除非你用其他API取 得这个
  • 控件进行操作,否则,就是一个变量而已。主要的用途是 UpdateData,进行数据读写。

UpdateData

  1. 可以更新数据,当参数为true代表从界面中输入数据到关联的变量。如果为false代表反向,将关联变量的值更新到界面上
  2. 一个UpdateData的函数将会对所有的数值型关联变量进行更新或输出,不需要多次调用。

对话框模板属性

  • 模态对话框:一般用的是模态,理解为当这个对话框没有处理完,是无法跳过该对话框进行操作 (如MessageBox)
  • 非模态对话框:这个对话框和其它窗口的操作是可以独立操作的。(如QQ聊天框)

控件位置编辑

  • 在对话框中选中多个控件,在vs的工具栏里面就会有一个“对话框编辑器”。在编辑器中会有一些:左对 齐,右对齐,顶对齐,底对齐,垂直,水平等等,可以自行使用,让控件变得对齐。
  • 横向:有3个控件,中间的控件会移到前后两个控件的水平位置的中间。纵向,同上。
  • 使宽度、高度、大小相同:先操作的第一个控件,变成和后操作的第二个控件一样的宽度或高度或大小。

图片控件

  • picture control 图片的绘制在windows中讲过
  • 需要.bmp格式(BitMap位图)的图片。

图片控件示例

  1. 导入bmp格式图片。
  2. 拖入一个”picture control“控件。修改属性”type“。再修改”image“。
  3. 如果在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

即可解决报错的问题。

  1. 通过外部文件加载,创建一个”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