第一章 Hello MFC
1、Windows是事件驱动编程模型,应用程序通过处理操作系统发送来的消息来响应事件。
2、c程序进入点是Main函数,Windows程序进入点是WinMain,MFC则是由afxWinMain创建应用程序对象。
3、1.1.2使用匈牙利标记法,用小写前缀用于数据数据类型。
4、MFC类将对象句柄存储在CWnd的公用数据成员m_hWnd中。
5、MFC的基石是文档/视图体系结构。
5、CObject是所有类的基类,提供了串行化支持、运行时类信息支持、诊断与调试支持。
6、应用程序对象:CWinApp类是应用程序对象,一个应用程序仅有此一个实例,包含虚拟函数:InitInstance(初始化一些信息)、ExitInstance(释放初始化信息)、OnIdle(空闲处理)、Run(WindThread类-->Run-->PumpMessage,消息循环)、PreTranslateMessage(对消息进行预处理)。
7、主窗口(框架窗口):CFrameWnd类,继承于CWnd类,为窗口和应用程序提供了面向对象的接口,它是应用程序与外部世界的主要接口,通过Create或者CreateEx创建一个主窗口。
8、绘制:设备环境类CPaitDC(仅用于OnPaint函数内部)、设备环境类CDC、矩形Rect类、获取客户区域GetClientRect、输出文本DrawText函数。
9、从CCmdTarget派生的任何类都可以包含消息映射。
10、#define DECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name;\
virtual CRuntimeClass *GetRuntimeClass() const;
这句话中的\为续行符,表示这些语句属于同一行,因为太长所以分开写,##表示把字符串连接起来,const 表示该函数是只读函数,既不能改变数据成员的值,也不能调用改变数据成员值的函数。
11、消息映射,消息映射宏,BEGIN_MESSAGE_MAP(CCurrClass,CParentClass) ON_WM_PAINT() END_MESSAGE_MAP,通过继承来传递,MFC没有提供消息映射宏的消息,可以通过ON_MESSAGE(WM_PAINT,OnSetText)宏来处理,消息处理函数原型 afx_msg LRESULT OnSetText(WPARAM wParam,LPARAM lParam);
其他特殊用途消息映射宏 ON_COMMAND、ON_UPDATE_COMMAND_UI、ON_COMMAND_RANGE、ON_UPDATE_COMMAND_UI_RANGE、ON_NOTIFY、ON_NOTIFY_RANGE。
DECLARE_MESSAGE_MAP()宏定义了包含消息ID和消息处理过程的afx_msgmap_entry结构的数组_messageEntries和一个包含指向_messageEntries数组的指针和指向基类messagemap的指针的messagemap的结构和另外一个获取messagemap地址的虚函数GetMessageMap。BEGIN_MESSAGE_MAP()包含GetMessageMap的实现,BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间的宏则填入到_messageEntries数组中。
流程:框架窗口CMainWindow调用从CWnd继承下来的WindowProc函数,WindowProc函数调用OnWndMsg,OnWndMsg调用GetMessageMap获取指向框架窗口的CMainWindow::messageMap指针,messageMap搜索_messageEntries数组来获取与当前消息ID匹配的项,找到此项后,则执行指向框架的对应的函数,否则沿着继承链往上继续重复此过程。
优点:使用消息映射所使用的内存的数量与他所包含的消息映射条目的个数成比例,一般窗口类不会处理所有的消息,而使用虚函数,则需要虚表,即使不覆盖虚函数,也要消耗内存。
13、#Define 宏名 字符串,再预编译时,宏名替换为字符串。
14、typedef 定义数据结构以及定义同义词。
15、DECLARE_DYNCREATE 动态创建宏。
16、MFC与字符集无关编程:
(1)使用_T宏修饰字符串常量。
(2)将字符声明为TCHAR类型而不是char类型。
(3)LPTSTR和TPCTSTR来声明指向TCHAR类型和const TCHAR类型的指针。
(4)使用Sizeof(TCHAR)来划分字符缓冲区。
(5)对C运行时间库中的字符串函数的调用替换为Windows头文件Tchar.h中对应的宏。
1、Windows是事件驱动编程模型,应用程序通过处理操作系统发送来的消息来响应事件。
2、c程序进入点是Main函数,Windows程序进入点是WinMain,MFC则是由afxWinMain创建应用程序对象。
3、1.1.2使用匈牙利标记法,用小写前缀用于数据数据类型。
4、MFC类将对象句柄存储在CWnd的公用数据成员m_hWnd中。
5、MFC的基石是文档/视图体系结构。
5、CObject是所有类的基类,提供了串行化支持、运行时类信息支持、诊断与调试支持。
6、应用程序对象:CWinApp类是应用程序对象,一个应用程序仅有此一个实例,包含虚拟函数:InitInstance(初始化一些信息)、ExitInstance(释放初始化信息)、OnIdle(空闲处理)、Run(WindThread类-->Run-->PumpMessage,消息循环)、PreTranslateMessage(对消息进行预处理)。
7、主窗口(框架窗口):CFrameWnd类,继承于CWnd类,为窗口和应用程序提供了面向对象的接口,它是应用程序与外部世界的主要接口,通过Create或者CreateEx创建一个主窗口。
8、绘制:设备环境类CPaitDC(仅用于OnPaint函数内部)、设备环境类CDC、矩形Rect类、获取客户区域GetClientRect、输出文本DrawText函数。
9、从CCmdTarget派生的任何类都可以包含消息映射。
10、#define DECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name;\
virtual CRuntimeClass *GetRuntimeClass() const;
这句话中的\为续行符,表示这些语句属于同一行,因为太长所以分开写,##表示把字符串连接起来,const 表示该函数是只读函数,既不能改变数据成员的值,也不能调用改变数据成员值的函数。
11、消息映射,消息映射宏,BEGIN_MESSAGE_MAP(CCurrClass,CParentClass) ON_WM_PAINT() END_MESSAGE_MAP,通过继承来传递,MFC没有提供消息映射宏的消息,可以通过ON_MESSAGE(WM_PAINT,OnSetText)宏来处理,消息处理函数原型 afx_msg LRESULT OnSetText(WPARAM wParam,LPARAM lParam);
其他特殊用途消息映射宏 ON_COMMAND、ON_UPDATE_COMMAND_UI、ON_COMMAND_RANGE、ON_UPDATE_COMMAND_UI_RANGE、ON_NOTIFY、ON_NOTIFY_RANGE。
DECLARE_MESSAGE_MAP()宏定义了包含消息ID和消息处理过程的afx_msgmap_entry结构的数组_messageEntries和一个包含指向_messageEntries数组的指针和指向基类messagemap的指针的messagemap的结构和另外一个获取messagemap地址的虚函数GetMessageMap。BEGIN_MESSAGE_MAP()包含GetMessageMap的实现,BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间的宏则填入到_messageEntries数组中。
流程:框架窗口CMainWindow调用从CWnd继承下来的WindowProc函数,WindowProc函数调用OnWndMsg,OnWndMsg调用GetMessageMap获取指向框架窗口的CMainWindow::messageMap指针,messageMap搜索_messageEntries数组来获取与当前消息ID匹配的项,找到此项后,则执行指向框架的对应的函数,否则沿着继承链往上继续重复此过程。
优点:使用消息映射所使用的内存的数量与他所包含的消息映射条目的个数成比例,一般窗口类不会处理所有的消息,而使用虚函数,则需要虚表,即使不覆盖虚函数,也要消耗内存。
13、#Define 宏名 字符串,再预编译时,宏名替换为字符串。
14、typedef 定义数据结构以及定义同义词。
15、DECLARE_DYNCREATE 动态创建宏。
16、MFC与字符集无关编程:
(1)使用_T宏修饰字符串常量。
(2)将字符声明为TCHAR类型而不是char类型。
(3)LPTSTR和TPCTSTR来声明指向TCHAR类型和const TCHAR类型的指针。
(4)使用Sizeof(TCHAR)来划分字符缓冲区。
(5)对C运行时间库中的字符串函数的调用替换为Windows头文件Tchar.h中对应的宏。