绘制粗虚线

来源:互联网 发布:青浦名女艳照热传网络 编辑:程序博客网 时间:2024/04/28 02:10

以前很少画虚线,因此不太关心绘制粗虚线该怎么办。最近需要用到这个功能,因此学习了一下,与大家共享。

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倍线宽,如此循环。

原创粉丝点击