以前很少画虚线,因此不太关心绘制粗虚线该怎么办。最近需要用到这个功能,因此学习了一下,与大家共享。
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 = #00ff00; 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倍线宽,如此循环。
|