MFC的CPen类封装了画笔对象,其中的成员函数CreatePen实现创建画笔的功能,函数原型如下:
BOOL CreatePen(
int nPenStyle, //画笔风格
int nWidth, //画笔宽度
COLORREF crColor //画笔颜色
);
一旦不再需要画笔,记得用DeleteObject函数将其删除。
设置线型
创建画笔的函数中,nPenStyle参数表示画笔风格,可以设置下列值之一。nPenStyle ------ Long,指定画笔样式,可以是下述常数之一:
- PS_SOLID : 画笔画出的是实线。
- PS_DASH: 画笔画出的是虚线(nWidth必须不大于1)。
- PS_DOT: 画笔画出的是点线(nWidth必须不大于1)。
- PS_DASHDOT:画笔画出的是点划线(nWidth必须不大于1)。
- PS_DASHDOTDOT: 画笔画出的是点-点-划线(nWidth必须不大于1)。
- PS_NULL: 空画笔,画笔不能画图。
- PS_INSIDEFRAME:内侧实线画笔 由椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框时,画线宽度向内扩展。如指定的准确RGB颜色不存在,就进行抖动处理。
设置线宽
创建画笔的函数中,nWidth表示画笔线宽,是一个逻辑值,这个值越小,画出的图形线越细;这个值越大,绘制的图形线条越粗。
设置画笔颜色
画笔颜色通过RGB宏控制,例如需要画红色的图形,RGB(255,0,0)。MFC中有许多引用颜色宏RGB,这里总结了一些常见的颜色的宏,供大家参考。
基本颜色三种:红绿蓝,其他的颜色都是由这三种基本的颜色组成。例如,红RGB(255,0,0)、绿RGB(0, 255,0)、蓝RGB(0,0, 255)、浅粉红 #FFB6C1 255,182,193、紫色 #800080 128,0,128等。
示例:使用GDI对象CPen绘图示例
编写一个程序,练习一下画笔的创建。上面有八种不同风格的画笔,现在用这八种不同风格的画笔分别话一个圆,同时修改画笔的线宽和颜色。
代码写在前面新建的工程SDITest中,读者可以从网站提供的链接中获取。阅读程序是请参考注释。
1) 定义数据结构:
struct my_Eclipse{
CRect rect; //图形显示区域
CPen pen; //画笔
};
2) 定义成员变量
//定义8个结构,用于绘制8个图形
my_Eclipse m_myEclipse[8];
3) 在View类中初始化绘图区域:
void CSDITestView::InitRect()
{
//界面上要显示8个图形,准备好8个区域,分两行显示,每一行显示四个
//图形左右间隔10个像素,上下间隔20个像素
//左上 右下
CRect rect(0,0,100,100);
for (int i=0;i<8;i++)
{
if (i<4)
{
//第一行图形
CRect rect;
rect.left=20+i*150;
rect.top=20;
rect.right=100+i*150;
rect.bottom=120;
m_myEclipse[i].rect.CopyRect(rect);
}
else
{
//第二行图形
CRect rect;
rect.left=20+(i-4)*150;
rect.top=250;
rect.right=100+(i-4)*150;
rect.bottom=350;
m_myEclipse[i].rect.CopyRect(rect);
}
}
}
4) 在View类中初始化画笔:
void CSDITestView::InitPen()
{
//创建普通画笔
m_myEclipse[0].pen.CreatePen(PS_SOLID,10,RGB(255,0,0));
m_myEclipse[1].pen.CreatePen(PS_DASH,5,RGB(0,255,0));
m_myEclipse[2].pen.CreatePen(PS_DOT,1,RGB(0,0,255));
m_myEclipse[3].pen.CreatePen(PS_DASHDOT,10,RGB(0,0,0));
m_myEclipse[4].pen.CreatePen(PS_DASHDOTDOT,5,RGB(255,0,255));
m_myEclipse[5].pen.CreatePen(PS_NULL,1,RGB(0,255,255));
m_myEclipse[6].pen.CreatePen(PS_INSIDEFRAME,10,RGB(0,255,255));
//创建集合画笔
LOGBRUSH LogBrush;
LogBrush.lbStyle=BS_HATCHED;
LogBrush.lbColor=RGB(0,0,255);
LogBrush.lbHatch=HS_DIAGCROSS;
m_myEclipse[7].pen.CreatePen(PS_GEOMETRIC,20,&LogBrush);
}
5) 在View类中的OnDraw函数中添加画图代码,代码如下:
//采用GDI绘图
CClientDC cdc(this);
CPen* pOldPen = NULL;
for (int i=0;i<8;i++)
{
//把当前的画笔选入DC
pOldPen = cdc.SelectObject(&m_myEclipse[i].pen);
cdc.Ellipse(m_myEclipse[i].rect);
cdc.SelectObject(pOldPen);
}
6) 编译并运行程序,生成结果如图4-2-1所示:
图4-2-1 用不同风格不同颜色的画笔画图效果图
示例中演示了8种画笔效果
- 1号:PS_SOLID风格,实现画笔;
- 2号:PS_DASH 风格,实现画笔;
- 3号:PS_DOT 风格,实现画笔;
- 4号:PS_DASHDOT风格,实现画笔;
- 5号:PS_DASHDOTDOT风格,实现画笔;
- 6号:PS_NULL 风格,实现画笔;
- 7号:PS_INSIDEFRAME风格,实现画笔;
- 8号:PS_GEOMETRIC 风格,实现画笔。