基本说明
mfc:微软基础类库(microsoft foundation classes)微软公司提供的类库,以 **c++** 形式封装了windows api,并且包含了一个应用程序框架,减少开发工作量。
mfc需要包含头文件#include<afxwin.h>
源文件是.cpp
配置:
过程
- 程序开始时,先实例化应用程序类对象
- 执行程序的入口函数InitInstance
- 给框架类MyFrame对象动态分配控件(调用他的构造函数),在构造函数内部,通过CWnd::Create创建窗口
- 框架类对象显示窗口CWnd::ShowWindow
- 框架类对象更新窗口CWnd::UpdateWindow
- 保存框架类对象执行CWinThread::m_pMainWnd
消息映射机制
消息映射是一个将消息和成员函数相互关联的表:
比如,窗口接收到了一个鼠标单击消息,mfc将搜索该窗口的消息映射,如果有一个
处理WM_LBUTTONDOWN消息的处理程序,就会调用OnLButtonDown
- 声明宏写到.h中
DECLARE_MESSAGE_MAP() - 分界宏 写到.cpp中
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
END_MESSAGE_MAP() - 找到消息宏 写到分界宏中间
ON_WM_LBUTTONDOWN()
ON_WM_CHAR()
ON_WM_PAINT() - 把函数原型声明写到.h中
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnChar(UINT, UINT,UINT);
afx_msg void OnPaint(); - 函数的实现写到.cpp中
应用例子
头文件
#pragma once
#include<afxwin.h>//mfc头文件
// 应用程序类CWinApp,派生类(子类)
class MyApp :public CWinApp
{
public:
// 基类的虚函数,派生类只是重写
// MFC程序的入口地址
virtual BOOL InitInstance();
};
// 框架类(窗口类) CFrameWnd派生类(子类)
class MyFrame : public CFrameWnd
{
public:
MyFrame();//构造函数
//声明宏 提供消息映射机制 必须用在类声明中
DECLARE_MESSAGE_MAP()
//对应消息的处理函数
//鼠标左击函数声明
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnChar(UINT, UINT,UINT);
afx_msg void OnPaint();
};
cpp
#include "mfcp.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
}
//分界宏 定义消息宏 必须用在类实现中
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)//消息映射机制应用的类,该类的基类 //开始
ON_WM_LBUTTONDOWN()//鼠标左键按下
ON_WM_CHAR()//键盘
ON_WM_PAINT()//绘图
END_MESSAGE_MAP()//结束
MyFrame::MyFrame()
{
Create(NULL, TEXT("mfc"));//创建窗口
}
void MyFrame::OnLButtonDown(UINT, CPoint point)
{
TCHAR buf[1024];//mfc中的字符数组
wsprintf(buf, TEXT("x = %d, y = %d"), point.x, point.y);
MessageBox(buf);//mfc中的messagebox
//mfc中的字符串 CString
CString str;
str.Format(TEXT("cstring: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("forward"));
//画椭圆
dc.Ellipse(10, 10, 500, 500);
}
利用模版创建窗口
创建时选择MFC应用程序
暂时选择,单个文档,MFC标准
一路下一步,在这里可以配置窗口样式
鉴于解决方案比较多,可以在类视图中进行查看。
在类视图中双击其中一个类,可以定位到该类的头文件中;双击类视图下方的函数可进入cpp中。
类视图中右键类,选择属性,右侧选择消息
在创建出的五个类中,CAboutDlg为关于的窗口;
数据的存储和加载由文档类来完成,数据的显示和修改则通过视类(view)来完成;
view覆盖在frame之上,所有鼠标事件写在view类中;
在Frame类中,有一个PreCreateWindow函数,可以在窗口生成前修改窗口外观,通过传递CREATESTRUCT结构体参数完成;create()创建窗口成功后会发送一个消息WM_CREATE,OnCreate()来相应这个消息;
MFC中Afx前缀的函数都是全局函数;
如在CXXXXXView类中右键属性–消息–鼠标左键,在填充的代码中完成想要的操作
draw事件
void CMFCGuideView::OnDraw(CDC* pDC)
{
CMFCGuideDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
pDC->TextOutW(100, 100, TEXT("go to"));
}
如果有了OnDraw 就不要有OnPaint,同时存在时,OnPaint会把OnDraw覆盖。