ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

04. MFC框架

2022-06-15 14:03:43  阅读:165  来源: 互联网

标签:控件 MFC 04 框架 对话框 映射 消息 处理函数


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
    

    即可解决报错的问题。

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

标签:控件,MFC,04,框架,对话框,映射,消息,处理函数
来源: https://www.cnblogs.com/WZ-1120232314/p/16378176.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有