视类窗口(CView)覆盖在框架窗口(CFrameWnd)之上的,所有操作,包括鼠标单击、鼠标移动邓操作都只能由视类窗口捕获,框架窗口中收不到鼠标左键单击这一消息。
消息映射机制:
1,消息响应函数原型,在头文件CDrawView中。如: AFX_MSG之间声明消息响应函数原型。
//{{AFX_MSG(CDrawView) --注释宏,之间为消息的响应函数。
afx_msg void OnButtonDown(UINT nFlags,CPoint point); --afx_msg:表明其后跟着的函数原型,是一个消息响应函数的声明。
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
在DECLARE_MESSAGE_MAP()宏上有两个AFX_MSG注释宏,他们实际上是宏,但因为在前面加了注释符,所以称之为注释宏。这两个函数之间有一个函数原型void OnLButtonDown(UINT nFlags,CPOINT point),是函数原型,因为它位于两个注释宏之间,所以以灰色显示的。该函数声明的前部有一个afx_msg限定符,这也是一个宏,该宏表明这个函数是一个消息响应函数的声明。
2,ON_WM_LBUTTONDWON消息映射宏 BEING_MESSAGE之间为消息映射宏。
BEGIN_MESSAGE_MAP(CDrawView,CView)
//{{AFX_MSG(CDrawView)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG
END_MESSAGE_MAP
消息映射表:本例中,有一个ON_WM_LBUTTONDOWN这消息映射宏,这个宏的作用就是把鼠标左键按下消息(WM_LBUTTONDOWN)与一个消息响应函数关联起来。通过这种机制,一旦有消息产生,程序就会自动调用相应的消息响应函数来进行处理。
3,消息响应函数的定义
消息响应函数的具体实现。
一,windows OS事件驱动策略基于3种消息。标准消息、通告消息、命令消息。
二,事件就是消息,事件是有形形象的,是站在人类能理解的角度来定义的。消息是无形抽象的,是站在OS能理解的角度来定义的。
三,句柄和指针,句柄是由系统分配的资源ID(我们认为它是一个标志某个系统资源的32位的整数),用于标志系统所分配的资源,这里的资源包括进程、线程等。句柄和指针都是地址。句柄可以认为是某种意义上的指针,但不是指针。句柄是一些表的索引;也就是指针指针的指针(即二级指针),是windows系统在内存中维护的一个对象或一个窗口,因为以虚拟存储方式,需要调度页面,所以程序实际的物理地址是不断变化的,系统中用一个内存地址不变的表来维护这个变化的值(进行登记),因此当访问到这个不变的表项时就能确定程序的物理地址(所以叫句柄为指向指针的指针)。
Win32里,句柄是指向一个无类型对象(void*)的指针,是一个4字节长的数据。
MFC消息映射机制的具体实现方法是:
在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,即消息映射表。在消息映射表中,消息与对应的消息处理函数指针式成对出现的。某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中。当有消息需要处理时,程序只需要搜索该消息静态表,查看表中是否含有该消息,就可知道该类能否处理此消息。如果能处理该消息,则同样依照静态表能很容易找到并调用对应的消息处理函数。
MFC消息映射机制的实际实现过程:MFC在后台维护了一个窗口句柄与对应的C++对象指针的对照表,该句柄与CView对象的一个指针存在一一对应的关系。
MFC当中,所有窗口相关的东西都封装到了CWnd类中,所有与作图相关的东西都封装到了CDC中。
画图DC:HDC,通过SDK函数得到;CDC类;CClientDC类;CWindowDC,可以获取屏幕DC。
GetDestopWindow()获取桌面窗口,桌面其实也是一个窗口。
框架窗口有客户区和非客户区:非客户区为标题栏和菜单栏,以及四周的边界;客户区为工具栏和CView窗口。
绘图的函数中,对于函数的参数列表带有画刷或画笔等函数可以指定绘图的画刷或画笔;对于不带此类参数的函数,会使用当前选入设备环境的画刷或画笔进行作图,因此此时想使用自定义的画笔或画刷作图,需要首先将自定义的画刷或画笔选入设备环境。
例如:
CDC *pDc=GetDC();
CBrush *pBrush=CBrush::FromHandle((HBRUSH)::GetStockObject(NULL_BRUSH));
CBRUSH *pOldBrush=pDc->SelectObject(pBrush);
pDc->Rectangle(CRect(pt1,pt2));
pDc->SelectObject(pOldBrush);
ReleaseDC();
设置文字的背景透明方式:SetBkMode();