微软基础类库(英语:Microsoft Foundation Classes,简称MFC)
一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
MFC把Windows SDK API函数包装成了几百个类,MFC给Windows操作系统提供了面向对象的接口,支持可重用性、自包含性以及其他OPP原则。MFC通过编写类来封装窗口、对话框以及其他对象,引入某些关键的虚函数(覆盖这些虚函数可以改变派生类的功能)来完成,并且MFC设计者使类库带来的总开销降到了最低。
编写MFC程序需要包含#include <afxwin.h>头文件
如何新建?
新建一个头文件和源文件
//mfc.h
#include <afxwin.h> //编写MFC程序需要包含#include <afxwin.h>头文件
/*
MFC应用程序的核心就是基于CWinApp类的应用程序对象。
CWinApp提供了消息循环来检索消息并将消息调度给应用程序窗口。
还包括可被覆盖的、用来自定义应用程序行为的主要虚函数。
*/
class MyApp :public CWinApp //CWinApp应用程序类
{
public:
virtual BOOL InitInstance();//程序的入口函数InitInstance()
};
/*
CFrameWnd是从CWnd(窗口基类)派生出来的。CFrameWnd模仿框架窗口行为,我们可以把框架窗口作为顶层窗口看待,它是应用程序与外部世界的主要接口。
*/
class MyFrame :public CFrameWnd //窗口框架类
{
public:
MyFrame();
/*
将消息映射添加到一个类中所做的全部工作:
1) 所操作类中,声明消息映射宏。
2) 通过放置标识消息的宏来执行消息映射,相应的类将在对BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间处理消息。
*/
DECLARE_MESSAGE_MAP()//所操作类中,声明消息映射宏。
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnChar(UINT, UINT, UINT);
afx_msg void OnPaint();
};
mfc.cpp
#include "mfc.h"
MyApp app; //一个MFC程序可以有且仅有一个应用程序对象,此对象必须声明为在全局范围内有效,以便它在程序开始时即在内存中被实例化。
/*
InitInstance的目的是给应用程序提供一个自身初始化的机会,其返回值决定了框架接下来要执行的内容,如果返回FALSE将关闭应用程序,
如果初始化正常返回TRUE以便允许程序继续进行。此函数是MFC应用程序的入口。
*/
BOOL MyApp::InitInstance()//
{
//创建窗口
MyFrame * frame = new MyFrame;//给框架类MyFrame对象动态分配空间
//显示和更新
frame->ShowWindow(SW_SHOWNORMAL);//框架类对象显示窗口CWnd::ShowWindow
frame->UpdateWindow();//框架类对象更新窗口CWnd::UpdateWindow
m_pMainWnd = frame; //保存框架类对象指针CWinThread::m_pMainWnd
return TRUE; //返回正常初始化
}
//分界宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)//通过放置标识消息的宏来执行消息映射,相应的类将在对BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间处理消息。
ON_WM_LBUTTONDOWN() //鼠标左键按下
ON_WM_CHAR() //键盘
ON_WM_PAINT() //绘图宏
END_MESSAGE_MAP()
MyFrame::MyFrame()//自动调用的构造函数,在其构造函数内部,通过CWnd::Create创建窗口
{
Create(NULL, TEXT("mfc"));
//lpszClassName指定了窗口基于WNDCLASS类的名称,为此将其设定为NULL将创建一个基于已注册的WNDCLASS类的默认框架窗口
//lpszWindowName参数指定将在窗口的标题栏出现的文字。
}
void MyFrame::OnLButtonDown(UINT, CPoint point)
{
/*TCHAR buf[1024];
wsprintf(buf, TEXT("x = %d, y =%d"), point.x, point.y);
MessageBox(buf);*/
//mfc中的字符串 CString
CString str;
str.Format(TEXT("x = %d ,,,, y = %d "), point.x, point.y);
MessageBox(str);
}
void MyFrame::OnChar(UINT key, UINT, UINT)
{
CString str;
str.Format(TEXT("按下了%c 键"), key);
MessageBox(str);
}
void MyFrame::OnPaint()
{
CPaintDC dc(this); //CDC里找其他的能画的图形
dc.TextOutW(100, 100, TEXT("为了部落"));
//画椭圆
dc.Ellipse(10, 10, 100, 100);
//多字节转为 宽字节
//TEXT是由自适应编码的转换
// TCHER 自适应编码的转换
//MessageBox(L"aaa");
//统计字符串长度
int num = 0;
char * p = "aaaa";
num = strlen(p);
//统计宽字节的字符串长度
wchar_t * p2 = L"bbbb";
num = wcslen(p2);
//char * 与 CString之间的转换 C++ string .c_str();
//char* -> CString
char * p3 = "ccc";
CString str = CString(p3);
//CString -> char *
CStringA tmp;
tmp = str;
char * pp = tmp.GetBuffer();
}