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,
, ,
, ,
this->m_hWnd,
(HMENU), // 标识
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,
, ,
, ,
this->m_hWnd,
(HMENU), // 标识
AfxGetInstanceHandle(), // 获取实例句柄
NULL);
CRect rect(, , , );
pBtn = new CButton();
pBtn->Create(TEXT("Button"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
rect,
this,
); // 创建一个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(,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,
, ,
, ,
this->m_hWnd,
(HMENU), // 标识
AfxGetInstanceHandle(), // 获取实例句柄
NULL); CRect rect(, , , );
pBtn = new CButton();
pBtn->Create(TEXT("Button"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
rect,
this,
); // 创建一个Button按钮
} void MainWindow::HandleButton(){
::MessageBox(NULL, TEXT("hello"), TEXT("MFC"), MB_OK);
}

MFC的概要小结

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

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

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

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

  1. C++ MFC应用程序开发实例

    MFC:微软基础类(Microsoft Foundation Classes),同VCL类似,是一种应用程序框架,随微软Visual C++ 开发工具发布.作为Application Framewor ...

  2. 第十三章:MFC库与Windows程序开发概述

    主要内容: 1.Windows程序的基本结构 2.MFC库简介 3.使用Visual C++开发Windows程序 具体内容略

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

    (一)MessageBox函数的参数介绍: int MessageBox ( HWND hWnd, //弹出MessageBox对话框所属的窗口句柄 LPCTSTR lpText, //指向Messa ...

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

    (一)CreateWindow函数的参数介绍: HWND CreateWindow( LPCTSTR lpClassName, //Windows窗口中预定义的控件结构体,包括:BUTTON(按钮), ...

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

    (一)TextOut函数的参数介绍: BOOL TextOut ( //如果函数调用成功,返回TRUE,否则,返回FALSE HDC hdc, //用于显示字符串的控件ID int nXStart, ...

  6. C语言Windows程序开发—Windows窗口样式与常用控件样式【第04天】

    (一)Windows窗口(MDICLIENT)样式介绍 /* Windows窗口样式 */ WS_BORDER //带有边框的窗口 WS_CAPTION //带有标题栏的窗口 WS_CHILD //子 ...

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

    Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/bee ...

  8. Windows编程 Windows程序的生与死(上)

    引子 “Windows 程序分为‘程序代码’和‘UI(User Interface)资源’两大部份,两部份最后以RC编译器(资源编译器)整合为一个完整的EXE 文件.所谓UI 资源是指功能菜单.对话框 ...

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

    Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer ...

随机推荐

  1. ios 获取当前wifi名称

    ios5之前可以通过读取配置文件获取,ios5以后苹果修改wifi列表文件位置,只有root权限才可以读取. ios4:/System/Library/SystemConfiguration/WiFi ...

  2. SQLite介绍

    优点:轻量级.绿色组件.单一文件.跨平台.查询效率极高.使用事务插入速度极快.支持limit分页. 适合查询速度要求较高,内存占用较少的场合,尤其是嵌入式操作系统,如各种手机操作系统,低并发web(9 ...

  3. 发现ramnit样本一枚

    https://files.cnblogs.com/files/yfish/DesktopLayer.rar

  4. golang之递归

    翠花,上代码 package main import ( "fmt" "time" ) /* 递归原则,一个大问题分解成相似的小问题 定义好出口条件,否则死循环 ...

  5. Alpha冲刺 - (6/10)

    Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 基于ssm框架的前后端交互测试,结合 ...

  6. [毕业设计][期末作业]二手闲置小程序 免费信息发布系统功能源码(小程序+php后台管理)

    最近做了一个小程序,主要是二手闲置免费信息发布系统的功能,里面包括了登录,发布商品,商品管理,违规投诉,canva商品海报生成,分享等一些基础的功能,可以说代码都是自己辛辛苦苦写出来的.可作为毕业设计 ...

  7. nginx 内置参数

    $args #这个变量等于请求行中的参数.$content_length #请求头中的Content-length字段.$content_type #请求头中的Content-Type字段.$docu ...

  8. solr分词一:mmseg4j

    刚接触Lucene2.x和Solr2.x的时候,谈到中文分词,会让我立即想到用庖丁中文分词,庖丁中文分词因巨大的中文词库以及支持不限制个数的用户自定义词库,而且是纯文本格式,一行一词,使用后台线程检测 ...

  9. Linux 批量管理工具

    pssh/pscp(Python) ansible(Python) saltstack(Python) chef puppet(Ruby) fabric(Python)

  10. C#——Socket

    最近公司让我搞个socket小程序(服务端). 主要的功能:客户端发字符串到服务端,服务端接收后在界面上显示. 参照了网上许多代码,自己从中修改整理代码. public Form4() { Initi ...