MFC学习笔记--MFC创建窗口
MFC创建窗口
- 基本说明
- 过程
- 消息映射机制
- 应用例子
- 利用模版创建窗口
- 文化建设
基本说明
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中的字符串 CStringCString 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覆盖。
文化建设
少年行 新丰美酒斗十千,咸阳游侠多少年。 相逢意气为君饮,系马高楼垂柳边。 汉家君臣欢宴终,高议云台论战功。 天子临轩赐侯印,将军佩出明光宫。 出身仕汉羽林郎,初随骠骑战渔阳。 孰知不向边庭苦,纵死犹闻侠骨香。 一身能臂两雕弧,虏骑千群只似无。 偏坐金鞍调白羽,纷纷射杀五单于。
MFC学习笔记--MFC创建窗口相关推荐
- MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结
MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...
- C++ MFC 学习笔记+小型通讯录系统实现
MFC 最详细入门教程 [MFC常用函数总结](https://www.cnblogs.com/jiu0821/p/4606639.html) [C++ & MFC]https://www.c ...
- 深入浅出MFC学习笔记
深入浅出MFC学习笔记 ithzhang CSDN博客:http://blog.csdn.net/ithzhang/article/category/1159054 转载于:https://blog. ...
- PowerBuilder学习笔记(4)数据窗口(DataWindow)
PowerBuilder学习笔记(4)数据窗口(DataWindow) 一.数据窗口对象(Object)与数据窗口控件(Control) 数据窗口对象是利用PowerBuilder所提供的数据 ...
- Django:学习笔记(2)——创建第一个应用
Django:学习笔记(2)--创建第一个应用 创建应用 在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定.Django 自带一个工具,可以帮你生成应用的基础目录结构, ...
- spring学习笔记02-spring-bean创建的细节问题
spring学习笔记02-spring-bean创建的细节问题 三种创建Bean对象的方式 Bean的作用范围 Bean的生命周期 <?xml version="1.0" e ...
- JavaScript学习笔记:创建、添加与删除节点
JavaScript学习笔记:创建.添加与删除节点 文章目录 JavaScript学习笔记:创建.添加与删除节点 一.DOM对象节点类型 二.创建节点 1.创建元素节点 2.创建文本节点 3.创建属性 ...
- Python学习笔记:创建分数类
Python学习笔记:创建分数类 1.编写创建分数类.py # 创建分数类from math import gcd# 定义分数类 class Fraction: def __init__(self, ...
- Java学习笔记:创建线程的两种方法
Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程
最新文章
- css3弹性盒子模型之box-flex
- C# 往excel出力数据
- HTML输入学生成绩并排序java_JS实现冒泡排序,插入排序和快速排序并排序输出...
- 也谈如何构建高性能服务端程序
- 如何用unit test测试controller_如何用电缆故障测试仪冲闪测试确定故障点?
- 2017.6.4 problem b 失败总结
- python基础小结(麻瓜图文总结版)
- win7中jar包不能安装的问题
- 关闭win7 透明化效果 aero
- ASIHTTPRequest報錯解決辦法
- ProxySQL Getting started
- 移动端浏览器识别PHP,PHP判断访客是否移动端浏览器访问
- 逆向分析CrackMe系列——CrackMe003
- 简单小巧实用IP端口扫描工具 ScanPort 绿色单文件版
- Orangleliu的2018年小结
- 科技感十足五款APP软件,让你的手机不再低调!
- 丧心病狂!华为折叠屏手机一秒售罄,炒到9万一部!
- 微信视频号运营 1000 问
- 物种多样性学习之Beta多样性
- Kafka 压缩、限流和 SASL_PLAIN 、 SASL_SCRAM-SHA-256简单认证
热门文章
- pyarrow.lib.ArrowInvalid: Casting from timestamp[us] to timestamp[ns] would result in out of bounds
- python 计算两个日期之间的月数差额
- 当谈论机器学习中的公平公正时,我们该谈论些什么?
- DDD 为什么能火起来?和微服务有啥关系?
- 如何作一名成功创业者
- Mapper(XML)文件不识别大于号 小于号
- mac 删除系统默认的ABC输入法
- [深度学习][原创]使用labelImg+yolov5完成所有slowfast时空动作检测项目-训练测试篇
- java实现mysql还原_java代码实现mysql的备份与还原
- Qimage颜色显示反色总结