MFC创建窗口
基本说明过程消息映射机制应用例子利用模版创建窗口文化建设
基本说明
mfc:微软基础类库(microsoft foundation classes)微软公司提供的类库,以 **c++** 形式封装了windows api,并且包含了一个应用程序框架,减少开发工作量。
mfc需要包含头文件#include
源文件是.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
// 应用程序类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覆盖。
文化建设
少年行
新丰美酒斗十千,咸阳游侠多少年。 相逢意气为君饮,系马高楼垂柳边。
汉家君臣欢宴终,高议云台论战功。 天子临轩赐侯印,将军佩出明光宫。
出身仕汉羽林郎,初随骠骑战渔阳。 孰知不向边庭苦,纵死犹闻侠骨香。
一身能臂两雕弧,虏骑千群只似无。 偏坐金鞍调白羽,纷纷射杀五单于。