mfc 学习的第二天
MFC 入门
1.1 MFC是什么
微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
MFC把Windows SDK API 函数包装成了几百个类,MFC给Windows操作系统提供了面向对象的接口,支持可重用性、自包含性以及其他OPP原则。MFC通过编写类来封装窗口、对话框以及其他对象,引入某些关键的虚函数(覆盖这些虚函数可以改变派生类的功能)来完成,并且MFC设计者使类库带来的总开销降到了最低。
1.2 编写第一个MFC应用程序
1、代码的编写
项目的创建和之前一样,只是此次的源文件后缀为.cpp,因为MFC是由C++编写的,编写MFC程序需要包含#include<afxwin.h>头文件。
mfc.h:
#include<afxwin.h> //mfc头文件
//应用程序类CWinApp,派生类(子类)
class MyApp:public CWinApp
{
public:
//基类的虚函数,派生类只是重写
//MFC程序的入口地址
virtual BOOL InitInstance();
};
//框架类 CFrameWnd,派生类(子类)
class MyFrame:public CFrameWnd
{
public:
MyFrame(); //构造函数
};
mfc.cpp:
#include "mfc.h" //对应类声明的头文件
MyApp app; //有且只有一个全局的应用程序类对象
BOOL MyApp::InitInstance() //程序入口地址
{
MyFrame *frame = new MyFrame; //1、创建框架类对象
frame->ShowWindow(SW_SHOWNORMAL); //2、显示窗口
frame->UpdateWindow(); //3、 更新窗口
m_pMainWnd = frame; //4、 保存框架类对象指针
return TRUE; //初始化正常则返回TRUE
};
MyFrame::MyFrame()
{
Create(NULL,TEXT("mfc")); //创建窗口
}
2、程序执行流程
1、程序开始时,先实例化应用程序对象(有且只有一个)
2、执行程序的入口函数InitInstance
3、给框架类MyFrame对象动态分配空间(自动调用它的构造函数),在其构造函数内部,通过CWnd::Create创建窗口
4、框架类对象显示窗口CWnd::ShowWindow
5、框架类对象更新窗口CWnd::UpdateWindow
6、保存框架类对象指针CWindTread::m_pMainWnd
3、代码分析
1、CFrameWnd框架窗口类
CFrameWnd是从CWnd(窗口基类)派生出来的。CFrameWnd模仿框架窗口行为,我们可以把框架窗口作为顶层窗口看待。它是应用程序与外部世界的主要接口。
如果想要创建一个窗口,可以在此类中调用CWnd::Create或CWnd::CreateEX函数:
virtual BOOL Create(
LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID,
CCreateContext* pContext = NULL
);
Create接收的8个参数后6个有默认值定义。
lpszClassName指定了窗口基于WNDCLASS类的名称,为此将其设定为NULL将创建一个基于已注册的WNDCLASS类的默认框架窗口
lpszWindowName参数指定将在窗口的标题栏出现的文字。
2、CWinApp应用程序类
MFC应用程序的核心就是基于CWinApp类的应用程序对象。CWinApp提供了消息循环来检索消息并将消息调度给应用程序窗口。它还包括可被覆盖的、用来自定义应用程序行为的主要虚函数。
一个MFC程序有且仅有一个应用程序对象,此对象必须声明为在全局范围内有效,以便它在程序开始时即在内存中被实例化。
3、InitInstance函数
CWinApp::InitInstance函数是一个虚函数,其默认操作仅有一条语句:
BOOL MyApp::InitInstance() //程序入口地址
{
return TRUE; //返回正常初始化
}
InitInstance的目的是给应用程序提供一个自身初始化的机会,其返回值决定了框架接下来要执行的内容,如果返回FALSE将关闭应用程序,如果初始化正常返回TRUE便允许程序继续进行。
此函数是MFC应用程序的入口。
4、m_pMainWnd成员变量
在CWinApp中有一个名为CWinThread::m_pMainWnd的成员变量。该变量是一个CWnd类型的指针,它保存了应用程序框架窗口对象的指针。也就是说,是指向CFrameWnd对象(框架窗口类对象)的指针。
vs2013创建mfc项目
步骤:文件→新建→项目→选择Win32项目,确定→下一步→勾上空项目,完成→源文件右键→添加→新建项→C++文件→名称为:mfc.cpp→添加→头文件右键→添加→新建项→头文件→名称为:mfc.h→添加
配置环境后,代码才可编译运行:
步骤:鼠标右击 mfc项目→属性→常规→MFC的使用→在共享DLL中使用MFC→确定
3 利用mfc创建窗口
3.1 mfc头文件afxwin.h
3.2 自定义类 继承于CWinApp 应用程序类
MyApp app应用程序对象,有且仅有一个
3.3 程序入口 InitInstance
3.4 入口里 创建窗口
3.5 窗口类MyFrame 继承于 CFrameWnd
3.6 MyFrame 构造中 Create(NULL,标题名称)
3.7 创建窗口对象
3.8 显示和更新
3.9 m_pMainWnd = frame; //保存指向应用程序的主窗口的指针
3.10 return TRUE
3.11 对项目进行配置 在共享DLL中使用MFC
小技巧:
解决中文注释下有红线的问题
点击番茄助手→Underlines→取消所有勾选→确定
mfc.h的源码
#include <afxwin.h> //mfc头文件
class MyApp:public CWinApp //继承CWinApp应用程序类
{
public:
//程序入口
virtual BOOL InitInstance();
};
class MyFrame:public CFrameWnd //继承窗口框架类
{
public:
MyFrame();
};
mfc.cpp的源码
#include "mfc.h"
MyApp app; //全局应用程序对象,有且仅有一个
BOOL MyApp::InitInstance()
{
//创建窗口
MyFrame * frame = new MyFrame;
//显示和更新
frame->ShowWindow(SW_SHOWNORMAL);
frame->UpdateWindow();
m_pMainWnd = frame; //保存指向应用程序的主窗口的指针
return TRUE; //返回正常初始化
}
MyFrame::MyFrame()
{
Create(NULL, TEXT("mfc"));
}