MFC学习:(一)简单绘图
1.View类和MainFrame类的区别
文档中view挡在MainFrame的前面。此时如果编写针对MainFrame的mouseClick
事件,将不会有反应。因为MFC视类窗口是覆盖在框架窗口上的,因此框架窗口不能感
到鼠标消息。
2.MFC的消息映射机制:
- 机制讲解
在每个能接收和处理消息的类中,定义一个消息和消息函数对照表,即消息映射表.在消息映射表中,消息与对应的消息处理函数指针成对出现.某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中.当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可知道该类能否处理此消息.如果能处理该消息,则同样依照静态表很容易找到并调用对应的消息处理函数.
MFC消息映射机制是针对能接受消息和处理消息的类来定义对应的消息映射表,而不是由父类来定义所有消息对应的虚函数,由子类来覆盖其函数实现,因为这样做会使程序背着一个很大的虚拟函数表的包袱运行,对内存是一种浪费.
2.代码块讲解
(1): CDrawView视类的头文件.h
//{
{AFX_MSG(CDrawView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP();
//}}AFX_MSG
两个AFX_MSG注释宏(因为加了注释符)之间,afx_msg是限定符(也是宏),表明函数是一个消息响应函数的声明,如果是用户自定义的消息函数响应声明则在注释宏下, DECLARE_MESSAGE_MAP之上加写代码。
(2)CDrawView的cpp(源文件)的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间,
定义了CDrawView类的消息映射表,其中ON_WM_LBUTTONDOWN
映射宏就是将鼠标左键按下消息(WM_LBUTTONDOWN)与一个消息响应函数
(OnLButtonDown)关联.
BEGIN_MESSAGE_MAP(CDrawView, CView)
//{
{AFX_MSG_MAP(CDrawView)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(