以下为本人学习笔记
原视频:黑马程序员MFC教程
一、基础概念
- SDK:软件开发工具包(Software Development Kit),第三方工具
- API:Windows擦欧总系统提供给应用程序编程的接口
- 窗口:一个Windows应用程序至少有一个窗口,称为主窗口。是Windows应用程序与用户进行交互的接口。两种窗口:子窗口和父窗口;窗口由两部分构成:客户区和非客户区
- 句柄(HANDLE):Windows程序中,有各种各样的资源(窗口、图标、光标、画刷等),系统在创建这些资源时会为他们分配内存,并返回标识这些资源的标识号,即句柄
- WinMain函数:当Windows操作系统启动一个程序时,他调用的就是该程序的WinMain函数(实际是由插入到可执行文件中的启动代码调用的)。WinMain是Windows程序的入口点函数,当WinMain函数结束或返回时,Windows应用程序结束
- Windows编程模型:
1 WinMain函数的定义
2 创建一个窗口
3 进行消息循环
4 编写窗口的过程函数
二、创建MFC窗口
一个简单的MFC程序:
- 因为MFC是由C++编写的,编写MFC程序需要包含
#include<afxwin.h>
头文件 - 自定义类MyApp继承于CWinApp应用程序类;MyApp app应用程序对象,有且仅有一个
- 程序入口InitInstance
- 入口中创建窗口
- 窗口类MyFrame继承于CFrameWnd
- MyFrame构造中 Create(NULL, 窗口名称)
- 创建窗口对象
- 显示和更新
m_pMainWnd=frame
保存指向应用程序的主窗口的指针(一种绑定,规定循环监听哪个窗口的消息)return True
三、消息映射机制
消息映射是一个将消息和成员函数相互关联的表。
将消息映射添加到一个类中的流程:
- 在所操作的类中,声明消息映射宏
- 通过放置标识消息的宏来执行消息映射,相对的类将在对BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间处理消息
- 对应消息处理函数分别在类中声明,类外定义
消息映射机制总结:
- 声明宏,写到.h中
- 分界宏,写到.cpp中
- 消息宏,写到分界宏中间
- 消息处理函数原型,声明到.h中
- 消息处理函数实现,写到.cpp中
四、MFC框架中一些重要的函数
- CtestAPP-InitInstance()
应用程序类的一个虚函数,MFC应用程序入口
- CMainFrame-PreCreateWindow()
当框架调用CreateEx函数创建窗口时,会首先调用PreCreateWindow函数。通过修改传递给PreCreateWindow的结构体类型参数CREATESTRUCT,应用程序可以更改用于创建窗口的属性。在产生窗口之前让程序员有机会修改窗口的外观。最后再调用CreateWindowEx函数完成窗口的创建
- CMainFrame-OnCreate()
OnCreate是一个消息响应函数,是响应WM_CREATE消息的一个函数,而WM_CREATE消息是由Create函数调用的。一个窗口创建(Create)之后,会向操作系统发送WM_CREATE消息,OnCreate函数主要是用来响应此消息的。OnCreate不产生窗口,只是在窗口显示之前设置窗口的属性,如风格、位置等。
- CtestView-OnPaint() vs OnDraw()
View类中,如果OnDraw和OnPaint同时存在,OnPaint会覆盖掉OnDraw
OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用;
OnDraw,一般来说,用户自己的绘图代码应该放在OnDraw中。
当视图变得无效时(包括大小的改变、移动、被遮盖等),Windows发送WM_PAINT消息,该视图的OnPaint处理函数通过创建CPaintDC类的DC对象来响应消息并调用视图的OnDraw成员函数。OnPaint最后也要调用OnDraw,因此一般在OnDraw函数中进行绘制。
五、其他
- MFC中后缀名为Ex的函数都是扩展函数
- MFC中,以Afx为前缀的函数都是全局函数,可以在程序的任何地方调用