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中的字符串 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创建窗口相关推荐

  1. MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结

    MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...

  2. C++ MFC 学习笔记+小型通讯录系统实现

    MFC 最详细入门教程 [MFC常用函数总结](https://www.cnblogs.com/jiu0821/p/4606639.html) [C++ & MFC]https://www.c ...

  3. 深入浅出MFC学习笔记

    深入浅出MFC学习笔记 ithzhang CSDN博客:http://blog.csdn.net/ithzhang/article/category/1159054 转载于:https://blog. ...

  4. PowerBuilder学习笔记(4)数据窗口(DataWindow)

    PowerBuilder学习笔记(4)数据窗口(DataWindow) 一.数据窗口对象(Object)与数据窗口控件(Control)     数据窗口对象是利用PowerBuilder所提供的数据 ...

  5. Django:学习笔记(2)——创建第一个应用

    Django:学习笔记(2)--创建第一个应用 创建应用 在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定.Django 自带一个工具,可以帮你生成应用的基础目录结构, ...

  6. spring学习笔记02-spring-bean创建的细节问题

    spring学习笔记02-spring-bean创建的细节问题 三种创建Bean对象的方式 Bean的作用范围 Bean的生命周期 <?xml version="1.0" e ...

  7. JavaScript学习笔记:创建、添加与删除节点

    JavaScript学习笔记:创建.添加与删除节点 文章目录 JavaScript学习笔记:创建.添加与删除节点 一.DOM对象节点类型 二.创建节点 1.创建元素节点 2.创建文本节点 3.创建属性 ...

  8. Python学习笔记:创建分数类

    Python学习笔记:创建分数类 1.编写创建分数类.py # 创建分数类from math import gcd# 定义分数类 class Fraction: def __init__(self, ...

  9. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

最新文章

  1. css3弹性盒子模型之box-flex
  2. C# 往excel出力数据
  3. HTML输入学生成绩并排序java_JS实现冒泡排序,插入排序和快速排序并排序输出...
  4. 也谈如何构建高性能服务端程序
  5. 如何用unit test测试controller_如何用电缆故障测试仪冲闪测试确定故障点?
  6. 2017.6.4 problem b 失败总结
  7. python基础小结(麻瓜图文总结版)
  8. win7中jar包不能安装的问题
  9. 关闭win7 透明化效果 aero
  10. ASIHTTPRequest報錯解決辦法
  11. ProxySQL Getting started
  12. 移动端浏览器识别PHP,PHP判断访客是否移动端浏览器访问
  13. 逆向分析CrackMe系列——CrackMe003
  14. 简单小巧实用IP端口扫描工具 ScanPort 绿色单文件版
  15. Orangleliu的2018年小结
  16. 科技感十足五款APP软件,让你的手机不再低调!
  17. 丧心病狂!华为折叠屏手机一秒售罄,炒到9万一部!
  18. 微信视频号运营 1000 问
  19. 物种多样性学习之Beta多样性
  20. Kafka 压缩、限流和 SASL_PLAIN 、 SASL_SCRAM-SHA-256简单认证

热门文章

  1. pyarrow.lib.ArrowInvalid: Casting from timestamp[us] to timestamp[ns] would result in out of bounds
  2. python 计算两个日期之间的月数差额
  3. 当谈论机器学习中的公平公正时,我们该谈论些什么?
  4. DDD 为什么能火起来?和微服务有啥关系?
  5. 如何作一名成功创业者
  6. Mapper(XML)文件不识别大于号 小于号
  7. mac 删除系统默认的ABC输入法
  8. [深度学习][原创]使用labelImg+yolov5完成所有slowfast时空动作检测项目-训练测试篇
  9. java实现mysql还原_java代码实现mysql的备份与还原
  10. Qimage颜色显示反色总结