绘制粗虚线
以前很少画虚线,因此不太关心绘制粗虚线该怎么办。最近需要用到这个功能,因此学习了一下,与大家共享。
CPen类有两个构造函数,我们经常用第一个,而忽略了第二个。其实很多网友问到画粗线时希望改变线头的默认显示方式,比如希望是圆弧头而不是默认的方形头等。都可以用这个构造函数定义的CPen对象来实现。
这里我主要说一下绘制粗虚线,其它的都可以通过MSDN上的帮助来了解。
函数原型:
BOOL CreatePen(
int nPenStyle,
int nWidth,
const LOGBRUSH* pLogBrush,
int nStyleCount = 0,
const DWORD* lpStyle = NULL
);
参数说明我就不做MSDN的翻译了。直接举例说明使用方法。
这是MSDN得例子:
LOGBRUSH logBrush;
logBrush.lbStyle = BS_SOLID;
logBrush.lbColor = RGB(0,255,0);
myPen2.CreatePen(PS_DOT|PS_GEOMETRIC|PS_ENDCAP_ROUND, 2, &logBrush);
用这样的画笔就可以绘制2个像素宽的粗点虚线,而且线头是圆的。
这里要特别说一下构造函数中的最后两个参数,它们是用来进行自定义虚线绘制方法的。我们知道默认的虚线有点线,点划线等,这都是固定的。通过最后两个参数的设置,可以自定义虚线的样式。nStyleCount是指最后一个参数中DWORD的数量;而最后一个参数中DWORD的数量是2的倍数,其中每两个为一组,第一个表示点的长度,第二个表示点之后的空长度。举例如下:
CPen newPen;
LOGBRUSH logBrush;
logBrush.lbStyle = BS_SOLID;
logBrush.lbColor = m_Sec.lColor;
DWORD dwF[4];
dwF[0] = 1;
dwF[1] = m_Sec.lWidth*2;
dwF[2] = 1;
dwF[3] = m_Sec.lWidth*4;
newPen.CreatePen(PS_USERSTYLE|PS_GEOMETRIC|PS_ENDCAP_ROUND, m_Sec.lWidth, &logBrush,4,dwF);
CPen * oldPen=pDC->SelectObject(&newPen);
CBrush newBrush;
if(0==m_Sec.sTexture)
newBrush.CreateSolidBrush(m_Sec.sColor);
else
newBrush.CreateHatchBrush(m_Sec.sTexture,m_Sec.sColor);
CBrush * oldBrush=pDC->SelectObject(&newBrush);
pDC->Pie(m_Sec.leftx,m_Sec.lefty,m_Sec.rightx,m_Sec.righty,
m_Sec.startx,m_Sec.starty,m_Sec.endx,m_Sec.endy);
pDC->SelectObject(oldPen);
pDC->SelectObject(oldBrush);
如此就可以绘制出一组点线,其中前两个点间隔是2倍线宽,第二第三点间隔是4倍线宽,如此循环。