第四章 简单绘图
4.1 MFC消息映射机制
4.1.1 ClassWizard
1.ClassWizard有五个选项卡,功能分别如下:
MessageMap选项卡: 可以通过此选项卡添加消息处理函数
MemberVariables选项卡: 可以加入与对话框相关联的成员变量
Automation选项卡: 允许用户加入属性或方法
ActiveX Events选项卡: 允许用户加入事件以支持ActiveX控件
ClassInfo选项卡: 观察当前类的有关信息
4.1.2 消息映射机制
1. 当收到某一消息时,应用程序框架窗口类基类会调用一个名为WindowProc的函数;该函数又会调用
OnWndMsg函数来查找并运行消息响应函数;如果没有查找到,该消息就会交还框架窗口类基类处理。
2. OnWndMsg函数是这样查找消息响应函数的:
在H文件上,在两个注释宏(//{{和//}})之间,查找是否有响应的消息响应函数原型声明。
在CPP文件上,在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间,查找是否有相应的消息映射宏。
3. 函数前面用Afx_msg声明,表明这是一个消息响应函数。
4.不使用虚函数实现消息映射机的原因是这样会需要一个容量很大的表
4.2 绘制线条
4.2.1 利用SDK全局函数实现画线功能
4.2.2 利用MFC的CDC类实现画线功能
4.2.3 利用MFC的CClientDC类实现画线功能
4.2.4 利用MFC的CWindowDC类实现画线功能
1.四种方法特点比较:
(1) SDK全局函数是最底层的绘图函数;
(2) MFC的CDC类封装了绘图相关操作,不需要主动获取窗口设备描述表hdc,已经提 供了一个数据成员
m_hDC用来保存CDC类相关的DC句柄。
并且可以使用CPoint数据类型,简化参数。
(3) MFC的ClientDC类只需定义DC对象,不再需要显示地调用GetDC函数和ReleaseDC函数。并且结束时会
自动释放DC.
通过使用 CClientDC dc(GetParent()),可以在非客户区上绘图。
(4) MFC的CWindowsDC类既具有ClientDC类的功能,并且使用 CClientDC dc(GetParent())后,还可以再
框架窗口上绘图。
2.四种方法代码比较:
(1)SDK全局函数:
HDC hdc;
hdc = ::GetDC(m_hWnd);
MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL);
LineTo(hdc, point.x, point.y);
::ReleaseDC(m_hWnd,hdc);
(2) MFC的CDC类:
CDC* pDC = GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
(3) MFC的ClientDC类:
CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
(4) MFC的CWindowsDC类:
CWindowDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
4.2.5 在桌面窗口中画线
CWindowDC dc(GetDesktopWindow())可以创建含桌面窗口句柄的dc。
4.2.6 绘制彩色线条
1. MFC提供CPen类来创建画笔对象。
CPen pen(类型,宽度,颜色);
2. MFC提供COLORREF类来创建颜色对象。
COLORREF rgb(红色深度,绿色深度,蓝色深度,)
4.3 使用画刷绘图
4.3.1 简单画刷
1. MFC提供CBrush类来创建画笔对象。
CBrush brush(COLORREF);
CBrush brush(RGB(red,green,blue));
2. FillRect可以利用指定的画刷填充一块指定的矩形区域。
FillRect(RECT,&brush);
4.3.2 位图画刷
1. 用一个画刷导入一幅图片。
CBrush brush(&bitmap);
2. 导入一幅图片的常用方法。
(1)LoadBitmap(文件路径名)
(2)LoadBitmap(资源ID)
4.3.3 透明画刷
1.透明画刷可以用来绘画一个矩形而不遮盖矩形内部的部分。要创建透明画刷,有三步:
(1)用GetStockObject函数获取透明画刷句柄。(HGDIOBJECT类型)
(2)将句柄强制转换成HBRUSH类型。
(3)用CBrush::FormHandle函数将画刷句柄转变为画刷对象。
三步合起来是这样使用:
CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
2.静态成员知识。
(1)静态成员属于类本身,在类加载的时候,即为它们分配了空间。
(2)可以通过类名:函数名 或 类名:变量名 来访问。
(3)成员函数或成员变量只有占有了内存,才能被访问。
(4)静态成员函数只能调用 静态成员 。
4.4 绘制连续线条
在OnMouseMove函数上(消息响应函数),用函数提供的point参数作为线段的起点,用成员变量m_ptOrigin作为终点,然后就可以绘制连续线条,即鼠标移到哪画到哪。
4.5 绘制扇形效果的线条
1. 只要保持起点不变,按照上面的方法就可以画扇形。
2. MFC提供一个设置绘图模式的的函数 SetROP2
SetROP2( int nDrawMode )
nDrawMode有三种模式:
R2_BLACK: 画黑线
R2_WHITE: 画白线
R2_MERGENOPEN: 先把画笔颜色取反,再与屏幕颜色进行或操作。