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之后,编译并执行。
MFC---简介、编码、结构和消息响应的更多相关文章
- MFC之目录结构及消息流转(一)
跟上时代,用vs2010, 新建一个MFC应用程序Helloworld. 目录结构: 所有文件分为6个部分:解决方案相关文件.工程相关文件.应用程序头文件和源文件.资源文件.预编译头文件和编译链接生成 ...
- MFC消息响应机制 q
MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows ...
- MFC消息响应机制分析
---- 摘要: ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析 ...
- MFC中消息响应机制
由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击.鼠标移动等操作都只能由视类窗口捕获.一个MFC消息响应函数在程序中有三处相关信息:函数原型.函数实现和以及用来关联消息和消息响应函数的 ...
- MFC动态按钮的创建及其消息响应(自定义消息)
动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC_D_BTN 10000 2.在类的OnInitDialog()函数中动态创建按钮(建立按钮对象时最好建立对象的指针 ...
- MFC动态按钮的创建及其消息响应 和 自定义消息
原文链接: http://www.cnblogs.com/gaohongchen01/p/4046525.html 动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC ...
- MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应
MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文: http://blog.csdn.net/supermanking/article/detail ...
- MFC-01-Chapter01:Hello,MFC---1.2 MFC简介
1.2 MFC简介 MFC是Microsoft提供的放置Windows API的面向对象的包装的C++类库.MFC大约封装了好几百个类,其中有一些可以直接调用,有些类可以作为用户自己的类的基类.一些M ...
- 图解MFC基本框架(深入消息映射机制)
首先,先看整体的消息流向图: 上图解释: 起点是消息循环,在winmain函数中(mfc中winmain函数是隐含的调用的,在app全局对象构造完后紧接着调用winmain函数),while循环中不断 ...
随机推荐
- Ubuntu 11.04 LAMP+JSP环境安装过程
安装LAMP命令:sudo apt-get install apache2 php5 libapache2-mod-php5 mysql-server libapache2-mod-auth-mysq ...
- 程序设计基础·Java学习笔记·面向对象(上)
Java程序设计基础之面向对象(上) (自适应学习进度而进行记录的笔记,希望有一些小小的用处吧(^∀^●)ノシ) (新人上路,望多指教,如有错误,望指正,万分感谢(o゚v゚)ノ) 目录 一.面向对象 ...
- java-计算机
计算机 硬件 装机:CPU 内存 主板 IO设备(input output) 冯诺依曼体系结构 CPU读取数据在运算器中运算传输到存储器,控制器控制输出结果. 软件
- 超详细GoodSync11.2.7.8单机、两个服务器之间的文件同步使用教程
GoodSync安装教程 第一步:双机GoodSync_v11.2.7.8.exe文件 链接:https://pan.baidu.com/s/16FVater4f9vu07QiGGIK9A 提取码:b ...
- phpmyadmin 4.8.1 文件包含漏
一. 启动环境 1.双击运行桌面phpstudy.exe软件 2.点击启动按钮,启动服务器环境 二.代码审计 1.双击启动桌面Seay源代码审计系统软件 3.点击新建项目按钮,弹出对画框中选择(C:\ ...
- 修道士与野人问题(BFS广度搜索)
#include "iostream.h" #include "string.h" //定义一个状态节点 typedef struct //存储各个状态 { i ...
- Bigdecimal 比较问题
- JavaScript中call如何使用?
一句话概括:call是函数才能调用的方法.作用是改变属性环境.有点绕,举个例子. 此处代码是在window环境下声明的变量和函数. var name='王延朋'; var age=18; var ex ...
- Thread 类的 sleep()方法和对象的 wait()方法都可以让线 程暂停执行,它们有什么区别?
sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程 暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保 持,因此休眠时间结束后会自动恢复(线程回 ...
- Java 中的 HashSet,内部是如何工作的?
HashSet 的内部采用 HashMap 来实现.由于 Map 需要 key 和 value,所以 所有 key 的都有一个默认 value.类似于 HashMap,HashSet 不允许重复的 k ...