zoukankan      html  css  js  c++  java
  • MFC---简介、编码、结构和消息响应

    MFC简介

    • MFC是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数
    • 在MFC中,可以直接调用 windows API,同时需要引用对应的头文件或库文件
    • MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。xx是版本,它封装了mfc内核,在代码中看不到原本的SDK编程中的消息循环等等东西,因为MFC框架已经封装好了,这样程序员就可以专心地考虑程序的逻辑,而不是每次编程都要重复的东西。
    • 由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率,但是MFC的封装很浅,所以在灵活性以及效率上损失不大,可以忽略不计。
    • MFC程序就是基于MFC编译出来的可执行程序,是一种GUI程序。

    MFC编码

    • 字符编码是一个复杂的过程。简单地讲,就是将机器语言(0和1组成的字符串)转换成我们能识别的信息的一个过程。MFC有两种编码方式,Unicode和多字节并且可以设置切换。切换方法是打开项目属性页,常规项对应的字符集中可切换编码方式。Visual C++6.0用的是多字节编码;Virtual Studio 2010 默认使用的是Unicode编码。
    • 在代码移植的时候经常会提示很多编码方式相关的错误,解决方法是将Unicode编码改为多字节编码即可。值得注意的是,使用 _T 宏有条件地编写字符串的代码,使之可移植到 Unicode。这一招可以解决大多数编码方式不匹配引发的问题。

    MFC项目结构

    • 主要有4个部分组成:
      • 资源文件Resource.h:主要是定义资源的ID。
      • 预编译头文件stdafx.h:用来解决头文件包含冲突的问题,定义一些需要全局性包含的文件。
      • 应用程序类对应文件:项目名称是TestOne,对应类名为CTestOneApp。
      • 对话框类:项目名称是TestOne,对应类名为CTestOneDlg。

    应用程序类

    • MFC定义了一个应用程序基类CWinApp,所有基于MFC的应用程序都会继承这个类。TestOne项目也不例外,此时的应用程序类是CTestOneApp,定义如下:
    class CTestOneApp : public CWinApp
    {
    public:
        CTestOneApp();
    public:
        // 重写
        virtual BOOL InitInstance();
        // 实现
        DECLARE_MESSAGE_MAP()
    };
    
    • 这个类的定义很简单,重点来看一下InitInstance函数。
    BOOL CTestOneApp::InitInstance()
    {  
        //初始化应用程序环境包控件等操作,省略部分代码.
        CWinApp::InitInstance();
        
        //省略部分代码... 
        
        //定义对话框对象
        CTestOneDlg dlg;
        //保存对话框到全局变量
        m_pMainWnd = &dlg; 
        //显示对话框
        INT_PTR nResponse = dlg.DoModal();
        if (nResponse == IDOK)
        {
            //“确定”来关闭对话框的代码
        }
        else if (nResponse == IDCANCEL)
        {
            //“取消”来关闭对话框的代码
        }
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, 而不是启动应用程序的消息泵。
        return FALSE;
    }
    
    • 这个函数可以看作MFC程序的入口函数,main函数隐藏在这个函数中。

    • 在实际的开发中,一般不需要对这个类进行操作,但如果需要在建立主对话框之前处理一些数据或者准备工作,就可以把代码添加到这个函数中,主对话框显示之前。

    • 这里有两个比较典型的应用。

      • 启动界面之前弹出登陆界面,需要正确输入用户名和密码才能弹出主界面;
      • 启动界面之前,弹出一个项目配置界面,例如操作员,设备编号,项目名称,批次等信息,同时这些信息需要传递到主界面中,主界面根据项目和批次决定某种操作方式。
    • 第一个需求不涉及数据传递,可以在代码中将用户名和密码固定,如果输入的结果与设定的结果一致,那么就开放此软件的使用权限;稍微复杂一点的,可以比较输入的结果与数据库中存储的用户名和密码是否匹配,如果匹配,才开放此软件的使用权限;再稍微复杂一点的,还可以将界面输入结果与服务器中的信息比较,查看当前用户是否有此软件的使用权限,当然这个还涉及到服务端的处理,与网络通信有关。

    • 第二个需求涉及不同对话框之间的数据传递,应用也比较广泛。

    对话框类

    • MFC主对话框类,主对话框是指与项目名称一致的那个类对应的对话框,CTestOneDlg继承CDialogEx类,CDialogEx又继承CDialog类,这个可以通过类转到定义查看,对话框类负责与用户交互,处理用户消息,接受用户输入。类的定义如下:
    // CTestOneDlg 对话框
    class CTestOneDlg : public CDialogEx
    {
    public:
        // 标准构造函数
        CTestOneDlg(CWnd* pParent = NULL);
        // 对话框数据
        enum { IDD = IDD_TESTONE_DIALOG }; 
    protected:
        // 动态数据交换,负责控件与变量之间的关联
        virtual void DoDataExchange(CDataExchange* pDX);   
    protected:
        //应用程序句柄
        HICON m_hIcon;
    
        //重载初始化对话框
        virtual BOOL OnInitDialog();
        //定义消息WM_SYSCOMMAND处理函数
        afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
        //定义消息WM_PAINT处理函数
        afx_msg void OnPaint();
        //定义消息ON_WM_QUERYDRAGICON处理函数
        afx_msg HCURSOR OnQueryDragIcon();
        //消息映射
        DECLARE_MESSAGE_MAP()
    };
    
    • 从这个类的定义可以看出以下几点:
      • 控件与数据关联,可以简单地交给框架来实现;
      • 在MFC框架上开发主要是针对消息处理机制。

    MFC消息响应

    • MFC消息响应机制过程比较复杂,这里只是基础部分,做一个简单的过程演示,在界面中添加一个按钮的消息响应。

    • 首先把工作区间切换到资源视图,如果工作区间没有显示资源视图,在菜单中的视图中查找资源视图并点击。切换到资源视图后,找到Dialog文件夹找到IDD_TESTONE_DIALOG。

    • 双击对话框ID就会显示这个对话框窗口,从工具栏中选择Button按钮后,可以直接将按钮拖至显示的这个对话框窗口中。工具栏只有当主工作区间显示对话框时才会显示。用鼠标右键点击按钮,选择属性切换到属性页,修改按钮的名称(对应Caption)“Test”,同时修改按钮的ID为IDC_BTN_TEST。

    • 有两种方式可以完成添加按钮的消息处理函数。

      • 直接双击按钮;

      • 右键选中按钮,点击“添加事件处理程序”;

      • 两种方式区别在于,第一种方式添加的消息响应函数名称是默认的,第二种方式添加的消息响应函数名称是可以编辑的。

      • 代码如下所示:

        //添加按钮IDC_BTN_TEST的单击消息处理函数
        void CTestOneDlg::OnBtnTest()
        {
            AfxMessageBox(_T("测试成功!"));
        }
        
      • 添加一个MessageBox之后,编译并执行。

  • 相关阅读:
    To Do List
    Linux 替换文本中对空格为下划线
    Jumpserver开源堡垒机
    用jmeter编写脚本做实时线上监控
    Supervisor使用详解
    Python模块之pysnooper
    Java读取json文件并进行处理
    IOS APP自动化测试 真机测试 遇到的坑
    测试人员入职必须了解的东西包括下面一些内容
    linux 和MacBook下的批替换
  • 原文地址:https://www.cnblogs.com/KX-Lau/p/13064633.html
Copyright © 2011-2022 走看看