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

基本说明

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

配置:
在这里插入图片描述

过程

  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<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覆盖。

文化建设

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值