本章介绍了MFC的消息映射机制,探讨发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的处理函数进行响应的。讨论设备描述表及其封装类CDC的应用,结合画图程序进行分析。
4.1消息映射机制
为视类添加一个鼠标左键按下的消息,在源文件中会添加3处代码。
1.[DrawView.h]
1 protected:
2 //{{AFX_MSG(CDrawView)
3 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
4 //}}AFX_MSG
5 DECLARE_MESSAGE_MAP()
此次为一个OnLButtonDown函数的声明。
2. [DrawView.cpp]
1 BEGIN_MESSAGE_MAP(CDrawView, CView)
2 //{{AFX_MSG_MAP(CDrawView)
3 ON_WM_LBUTTONDOWN()
4 //}}AFX_MSG_MAP
5 END_MESSAGE_MAP()//消息映射表
此处为将一个鼠标左键按下的消息和一个消息响应函数关联起来。
3. [DrawView.cpp]
1 void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
2 {
3 // TODO: Add your message handler code here and/or call default
4 //MessageBox("OK");
5 CView::OnLButtonDown(nFlags, point);
6 }
OnLButtonDown函数实现。
MFC消息映射机制的具体实现方法是:在每个能接收和处理消息的类中(View,Frame。。)定义了一个消息和消息静态函数对照表,即消息映射表,在消息映射表中,消息与对应的消息处理函数指针是成对出现的。某个类能处理所有消息及其对应的消息处理函数的地址都列在这个对应的静态表中,当有消息需要处理时,程序只需要搜索改消息静态表,查看表中是否有改信息,就知道该类能否处理该消息,如果能,则通过静态表找到与之对应的消息处理函数。
在CDrawView类中,CDrawView对象相关一个窗口,当然有它的窗口句柄,该句柄与CDrawView对象的一个指针CDrawView*存在一一对应的关系。
4.2绘制线条
步骤1:定义一个CPoint全局变量,存放鼠标按下去的时候的起点信息;
步骤2:在鼠标按下去消息处记录鼠标位置;
步骤3:记录鼠标弹起时的位置,并在2个位置之间划一条线。
01 void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
02 {
03 // TODO: Add your message handler code here and/or call default
04 HDC hdc;
05 hdc=::GetDC(m_hWnd);
06 MoveToEx(hdc,m_point.x,m_point.y,NULL);
07 LineTo(hdc,point.x,point.y);
08 ::ReleaseDC(m_hWnd,hdc);
09 CView::OnLButtonUp(nFlags, point);
10 }
4.2.2MFC的CDC绘制线条
1 CDC* pDC=GetDC();
2 pDC->MoveTo(m_point);
3 pDC->LineTo(point);
4 ReleaseDC(pDC);
4.2.3MFC的CClientDC类绘制线条
1 CClientDC dc(this/*GetParent()//在父框架上绘图*/);
2 //CPen pen(PS_SOLID,1,RGB(255,0,0)); 新建一个画笔对象
3 // CPen * oldPen=dc.SelectObject(&pen); 将画笔对象选人设备描述表,并将原先的保存
4 dc.MoveTo(m_point.x,m_point.y);
5 dc.LineTo(point.x,point.y);
6 //dc.SelectObject(oldPen); //将原先的画笔对象选择回
4.2.4MFC的CWindowDC类绘制线条
1 CWindowDC dc(GetDesktopWindow());
2 dc.MoveTo(m_point.x,m_point.y);
3 dc.LineTo(point.x,point.y);
4.3静态数据成员与函数
静态数据成员和函数属于类的本身,在类加载的时候为其分配空间。非静态成员函数和变量属于对象的方法和数据。静态成员函数只能访问静态数据成员。
责任编辑:小草