MFC学习笔记--MFC创建窗口

MFC创建窗口

  • 基本说明
  • 过程
  • 消息映射机制
  • 应用例子
  • 利用模版创建窗口
  • 文化建设

基本说明

mfc:微软基础类库(microsoft foundation classes)微软公司提供的类库,以 **c++** 形式封装了windows api,并且包含了一个应用程序框架,减少开发工作量。
mfc需要包含头文件#include
源文件是.cpp

配置:
MFC学习笔记--MFC创建窗口_第1张图片

过程

  1. 程序开始时,先实例化应用程序类对象
  2. 执行程序的入口函数InitInstance
  3. 给框架类MyFrame对象动态分配控件(调用他的构造函数),在构造函数内部,通过CWnd::Create创建窗口
  4. 框架类对象显示窗口CWnd::ShowWindow
  5. 框架类对象更新窗口CWnd::UpdateWindow
  6. 保存框架类对象执行CWinThread::m_pMainWnd

消息映射机制

 消息映射是一个将消息和成员函数相互关联的表:
	比如,窗口接收到了一个鼠标单击消息,mfc将搜索该窗口的消息映射,如果有一个
	处理WM_LBUTTONDOWN消息的处理程序,就会调用OnLButtonDown
  1. 声明宏写到.h中
    DECLARE_MESSAGE_MAP()
  2. 分界宏 写到.cpp中
    BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
    END_MESSAGE_MAP()
  3. 找到消息宏 写到分界宏中间
    ON_WM_LBUTTONDOWN()
    ON_WM_CHAR()
    ON_WM_PAINT()
  4. 把函数原型声明写到.h中
    afx_msg void OnLButtonDown(UINT, CPoint);
    afx_msg void OnChar(UINT, UINT,UINT);
    afx_msg void OnPaint();
  5. 函数的实现写到.cpp中

应用例子

头文件

#pragma once
#include//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学习笔记--MFC创建窗口_第2张图片
暂时选择,单个文档,MFC标准
MFC学习笔记--MFC创建窗口_第3张图片
一路下一步,在这里可以配置窗口样式
MFC学习笔记--MFC创建窗口_第4张图片
  鉴于解决方案比较多,可以在类视图中进行查看。
  在类视图中双击其中一个类,可以定位到该类的头文件中;双击类视图下方的函数可进入cpp中。
  类视图中右键类,选择属性,右侧选择消息
MFC学习笔记--MFC创建窗口_第5张图片
  在创建出的五个类中,CAboutDlg为关于的窗口;
  数据的存储和加载由文档类来完成,数据的显示和修改则通过视类(view)来完成;
  view覆盖在frame之上,所有鼠标事件写在view类中;
  在Frame类中,有一个PreCreateWindow函数,可以在窗口生成前修改窗口外观,通过传递CREATESTRUCT结构体参数完成;create()创建窗口成功后会发送一个消息WM_CREATE,OnCreate()来相应这个消息;
  MFC中Afx前缀的函数都是全局函数;
  如在CXXXXXView类中右键属性–消息–鼠标左键,在填充的代码中完成想要的操作
MFC学习笔记--MFC创建窗口_第6张图片
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覆盖。

文化建设

少年行
新丰美酒斗十千,咸阳游侠多少年。 相逢意气为君饮,系马高楼垂柳边。
汉家君臣欢宴终,高议云台论战功。 天子临轩赐侯印,将军佩出明光宫。
出身仕汉羽林郎,初随骠骑战渔阳。 孰知不向边庭苦,纵死犹闻侠骨香。
一身能臂两雕弧,虏骑千群只似无。 偏坐金鞍调白羽,纷纷射杀五单于。

你可能感兴趣的:(MFC,c++)