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

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

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

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

MFC和Windows 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应用程序就是用MFC的C++库进行这一系列“窗口”的开发。正如我们掌握printf、fopen进行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_MAO和END_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消息的对应关系,形成了成员函数

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

原文地址:https://www.cnblogs.com/hs-pingfan/p/10472901.html

时间: 2024-10-05 04:19:36

MFC Windows程序开发究竟是什么?的相关文章

Windows程序开发必须知道的几个注册表项

1.Windows服务程序列表位置 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 2.卸载程序列表位置 32位系统 当前用户软件HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 所有用户软件HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 64位系统 当前用

Windows程序开发的背景知识---Windows消息机制

一,消息 消息(Message)指的就是Windows 操作系统发给应用程序的一个通知,它告诉应用程序某个特定的事件发生了.比如,用户单击鼠标或按键都会引发Windows 系统发送相应的消息.最终处理消息的是应用程序的窗口函数,如果程序没处理的话操作系统有默认函数将会作出处理.      从数据结构的角度来说,消息是一个结构体,它包含了消息的类型标识符以及其他的一些附加信息.系统定义的结构体MSG用于表示消息,MSG 具有如下定义形式: typedef struct MSG {      HWN

windows程序开发窗口截图实现一

1.2编写窗口截图 本次选择窗口截图一共3步:鼠标按下.移动.弹起. 知识点:改变鼠标图标.截图函数封装.窗口画图 本节新学习AIP: LoadCursor SetCursor(m_hCursor); SetCapture(); CreateDC CreateCompatibleDC CreateCompatibleBitmap ClientToScreen WindowFromPoint CreateSolidBrush FrameRect -------------.. 视频观看地址: ht

C语言Windows程序开发—MessageBox函数介绍【第01天】

(一)MessageBox函数的参数介绍: 1 int MessageBox ( 2 HWND hWnd, //弹出MessageBox对话框所属的窗口句柄 3 LPCTSTR lpText, //指向MessageBox对话框内容的字符串指针 4 LPCTSTR lpCaption, //指向MessageBox对话框标题的字符串指针 5 UINT uType //MessageBox对话框的风格 6 ) ; 函数调用示例: 1 MessageBox ( NULL, TEXT ("程序运行出错

C语言Windows程序开发—TextOut函数介绍【第02天】

(一)TextOut函数的参数介绍: 1 BOOL TextOut ( //如果函数调用成功,返回TRUE,否则,返回FALSE 2 HDC hdc, //用于显示字符串的控件ID 3 int nXStart, //字符串所在起始位置左上角(X,Y)的X坐标 4 int nYStart, //字符串所在起始位置左上角(X,Y)的Y坐标 5 LPCTSTR lpString, //显示的字符串内容 6 int cbString //字符串长度 7 ) ; 函数调用示例: 1 TextOut ( h

C语言Windows程序开发—CreateWindow函数介绍【第03天】

(一)CreateWindow函数的参数介绍: 1 HWND CreateWindow( 2 LPCTSTR lpClassName, //Windows窗口中预定义的控件结构体,包括:BUTTON(按钮),EDIT(文本框),LISTBOX(列表),MDICLIENT(子窗口),SCROLLBAR(滚动条),RICHEDIT(富文本),STATIC(静态控件): 3 LPCTSTR lpWindowName, //窗口控件中显示的内容,即Caption属性: 4 DWORD dwStyle,

Linux及Arm-Linux程序开发笔记(零基础入门篇)

Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html 目录 一.Arm-Linux程序开发平台简要介绍... 3 1.1程序开发所需系统及开发语言... 3 1.2系统平台搭建方式... 4 二.Linux开发平台搭建... 5 2.1安装虚拟工作站... 5 2.2安装Linux虚拟

Linux及Arm-Linux程序开发

一.Arm-Linux程序开发平台简要介绍 Arm-Linux程序的开发并不像我们以前接触的Windows程序开发那样,关于平台的搭建就繁琐很多,所以在正式进入程序开发之前先对这种开发模式进行简要介绍,让一个即使没有任何Linux开发经验的程序员也能够看懂后面的内容. 1.1程序开发所需系统及开发语言 开发arm-linux程序至少需要三种系统: Windows系统.     主要用来文件传送和一些简单的文本文件编辑.这个系统其实并非必需,只是因为目前PC机上最流行的系统仍然是Windows系统

Windows程序代码重构

代码重构:在程序功能实现之后,对代码进行一定规模的整理,使之符合"高内聚.低耦合"的软件设计原则,便于维护和使用. ①用函数封装消息处理代码--对Windows程序窗口函数中的每一个case程序段进行封装以形成一个消息处理函数,而在case中调用这个函数. ②利用数组或链表实现消息映射表进一步实现代码的隔离--因为窗口函数switch-case结构实质上实现的就是一个根据消息标识来查找消息处理代码的功能,故可以用消息映射表和一段查表程序来替代它,表中的每一项可以使用一个函数指针来指向消