• MFC Windows程序开发究竟是什么?


    MFC Windows程序开发究竟是什么?

    MFC是一个Application Framework.他是一个完整的程序模型。

    什么是MFCMFC是微软公司出品一个Application Framework。基本上,我们可以认为Application Framework就是一个完整的程序模型,具备标准软件所需的一切基本功能,比如文件存取、打印等等。从C++语言层面来看,Application Framework就是有一整套组合好的“对象”构建起来的模型。从C++语法上来说,MFC就是一套微软提供给我们的类库。比如,我们在编写标准C程序的时候,经常会代用各种库函数来辅助完成某些功能:比如C库函数printfscanffopen等等。在Windows平台下,Windows操作系统本身提供各种各样的API

    MFCWindows API

    API函数:Windows操作系统提供给应用程序编程的接口(Application Programming Interface

    Windows应用程序API函数是通过C语言实现的。Windows操作系统提供了1000多种API函数。我们使用Windows API是可以开发出Windows应用程序的。

    MFC就是一组类库,在程序运行的时候就已经规划好了一堆有活力的对象。同时,这些对象之间的关联关系已经建立好了,不需要我们程序员在操心。比如当我们按下文件菜单,选择文件的对话框就会自动跳出等等。

    GUI设计快速上手MFC

    窗口是Windows应用程序中一个非常重要的元素,一个Windows应用程序至少要有一个窗口,成为主窗口。窗口是屏幕上的一块矩形区域,是Windows应用程序与用户进行交互的接口。

    建立一个Win32空项目,显示窗口

    #include <afxwin.h>
    
    // 应用程序类
    class MyFstApp : public CWinApp { // 一个实例,Windows应用程序实例
    public:
        virtual BOOL InitInstance();  // 多态创建实例
    };
    
    // 框架窗口类
    class MainWindow : public CFrameWnd { // 这是一个用C++对象表明的Windows窗口
    public:
        MainWindow(); // 公有的构造函数
    };
     
    MyFstApp theApp; // 构建全局对象
    
    BOOL MyFstApp::InitInstance() {
        // 创建一个框架窗口
        MainWindow *pMain = new MainWindow();
        // 显示
        pMain->ShowWindow(m_nCmdShow);
        pMain->UpdateWindow();  // 刷新
        this->m_pMainWnd = pMain;  // 建立Window对象与App对象的关联关系
        return TRUE;
    }
    
    MainWindow::MainWindow(){
        Create(NULL, TEXT("我的第一个MFC程序"));
    }

    通过代码逐项对比MFC对象与Windows对象的概念

    GUI快速入手MFC

    Windows操作系统顾名思义就是视窗的意思,开发Windows引用程序,就是组织一个又一个“窗口”。

    MFC应用程序就是用MFCC++库进行这一系列“窗口”的开发。正如我们掌握printffopen进行C语言开发一样,我们需要知道MFC为我们提供哪些针对这些“窗口”的对象。

    句柄:MFC Windows应用程序开发的核心概念

    Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。我们要对某个窗口进行操作,首先就要得到这个窗口的句柄。在Windows程序中,有各种各样的资源(窗口、图标、光标、画刷等),系统在创建这些资源时会为他们分配内存,并返回这些资源的标识号,即句柄。句柄时Windows对象的身份证。

    MFC开发Windows应用就是对一个个MFC对象的熟悉、改造的过程----MFC对象就是把一个个零散的Windows对象变成易于标准化程序开发的C++对象。

    CButton案例

    #include <afxwin.h>
    
    // 应用程序类
    class MyFstApp : public CWinApp { // 一个实例,Windows应用程序实例
    public:
        virtual BOOL InitInstance();  // 多态创建实例
    };
    
    // 框架窗口类
    class MainWindow : public CFrameWnd { // 这是一个用C++对象表明的Windows窗口
    public:
        MainWindow(); // 公有的构造函数
    };
    
    MyFstApp theApp; // 构建全局对象
    
    BOOL MyFstApp::InitInstance() {
        // 创建一个框架窗口
        MainWindow *pMain = new MainWindow();
        // 显示
        pMain->ShowWindow(m_nCmdShow);
        pMain->UpdateWindow();  // 刷新
        this->m_pMainWnd = pMain;  // 建立Window对象与App对象的关联关系
        return TRUE;
    }
    
    MainWindow::MainWindow(){
        Create(NULL, TEXT("我的第一个MFC程序"));
        HWND hBtn = ::CreateWindow(TEXT("Button"),  // 创建一个button        按钮
        TEXT("按钮"),
        WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
        150, 45,
        160, 65,
        this->m_hWnd,
        (HMENU)10001,  // 标识
        AfxGetInstanceHandle(),  // 获取实例句柄
        NULL);
    }

    Windows对象到MFC对象,成员变量与函数的辨析-CButton为例

    消息映射:从Windows对象到MFC对象

    消息映射从语义上看就是事件驱动编程,从语法上是一个将消息和成员函数相互关联的表。比如,框架窗口接收到一个窗口绘制消息,MFC将搜索该窗口的消息映射,如果存在一个处理WM_PAINT消息的处理程序,然后就调用OnPaint

    #include <afxwin.h>
    
    // 应用程序类
    class MyFstApp : public CWinApp { // 一个实例,Windows应用程序实例
    public:
        virtual BOOL InitInstance();  // 多态创建实例
    };
    
    // 框架窗口类
    class MainWindow : public CFrameWnd { // 这是一个用C++对象表明的Windows窗口
    public:
        CButton *pBtn;
    public:
        MainWindow(); // 公有的构造函数
    };
    
    MyFstApp theApp; // 构建全局对象
    
    BOOL MyFstApp::InitInstance() {
        // 创建一个框架窗口
        MainWindow *pMain = new MainWindow();
        // 显示
        pMain->ShowWindow(m_nCmdShow);
        pMain->UpdateWindow();  // 刷新
        this->m_pMainWnd = pMain;  // 建立Window对象与App对象的关联关系
        return TRUE;
    }
    
    MainWindow::MainWindow(){
        Create(NULL, TEXT("我的第一个MFC程序"));
    HWND hBtn
    = ::CreateWindow(TEXT("Button"), // 创建一个button按钮 TEXT("按钮"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 150, 45, 160, 65, this->m_hWnd, (HMENU)10001, // 标识 AfxGetInstanceHandle(), // 获取实例句柄 NULL); CRect rect(300, 450, 500, 600);
    pBtn
    = new CButton(); pBtn->Create(TEXT("Button"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rect, this, 10002); // 创建一个Button按钮 }

    消息映射与Windows事件驱动编程

    消息映射:从Windows对象到MFC对象

    MFC为执行消息映射在内部所做的总做隐藏在某些十分复杂的宏。实现过程如下:

    1、通过将DECLARE_MESSAGE_MAP添加到类声明中,声明消息映射

    2、通过防止标识消息的宏来执行消息映射,相应的类将在对BEGIN_MESSAGE_MAOEND_MESSAGE_MAP的调用之间处理消息。

    3、添加成员函数来处理消息。

    #include <afxwin.h>
    
    // 应用程序类
    class MyFstApp : public CWinApp { // 一个实例,Windows应用程序实例
    public:
        virtual BOOL InitInstance();  // 多态创建实例
    };
    
    // 框架窗口类
    class MainWindow : public CFrameWnd { // 这是一个用C++对象表明的Windows窗口
    public:
        CButton *pBtn;
    public:
        MainWindow(); // 公有的构造函数
    
        afx_msg void HandleButton();
        DECLARE_MESSAGE_MAP()
    };
    
    BEGIN_MESSAGE_MAP(MainWindow,CFrameWnd)  // 消息映射
        ON_BN_CLICKED(10002,HandleButton)
    END_MESSAGE_MAP()
    
    MyFstApp theApp; // 构建全局对象
    
    BOOL MyFstApp::InitInstance() {
        // 创建一个框架窗口
        MainWindow *pMain = new MainWindow();
        // 显示
        pMain->ShowWindow(m_nCmdShow);
        pMain->UpdateWindow();  // 刷新
        this->m_pMainWnd = pMain;  // 建立Window对象与App对象的关联关系
        return TRUE;
    }
    
    MainWindow::MainWindow(){
        Create(NULL, TEXT("我的第一个MFC程序"));
    
        HWND hBtn = ::CreateWindow(TEXT("Button"),  // 创建一个button按钮
            TEXT("按钮"),
            WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
            150, 45,
            160, 65,
            this->m_hWnd,
            (HMENU)10001,             // 标识
            AfxGetInstanceHandle(),  // 获取实例句柄
            NULL);
    
        CRect rect(300, 450, 500, 600);
        pBtn = new CButton();
        pBtn->Create(TEXT("Button"),
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            rect,
            this,
            10002); // 创建一个Button按钮
    }
    
    void MainWindow::HandleButton(){
        ::MessageBox(NULL, TEXT("hello"), TEXT("MFC"), MB_OK);
    }

    MFC的概要小结

    MFC封装了Windows对象形成一个个C++对象

    消息映射完成了这些C++对象与Windows消息的对应关系,形成了成员函数

    程序员只需要关注业务逻辑,把这些逻辑编码到这些成员函数,完成业务系统。

  • 相关阅读:
    mysql 批量插入与单条插入 的效率比较
    jQuery Validate自定义验证方法实现方式
    分析比较多表查询中的IN与JOIN
    SQL中on条件与where条件的区别
    jQuery.ajax向后台传递数组问题
    jquery ajax post 传递数组 ,多checkbox 取值
    孙俪袭击入股海润影视折射啥弊端?
    [WebView学习之三]:使用WebView来创建Apps
    hdu1010 dfs+路径剪枝
    poj 3696 The Luckiest number 欧拉函数在解a^x=1modm的应用
  • 原文地址:https://www.cnblogs.com/hs-pingfan/p/10472901.html
Copyright © 2020-2023  润新知