现在的位置: 首页 > 综合 > 正文

使用算法实现线宽不为1的 Dash Line

2013年10月12日 ⁄ 综合 ⁄ 共 972字 ⁄ 字号 评论关闭

//

#include <math.h>

void DrawDashLine(CDC* pDC, LPPOINT ptStart, LPPOINT ptEnd,
                  int nWidht, COLORREF crLine)
{
  CPen pen(PS_DASH, nWidht, crLine);
  CPen *pOldPen = pDC->SelectObject(&pen);
  
  double k = (double)(ptEnd->y - ptStart->y)/(double)(ptEnd->x - ptStart->x);
  double b = ptEnd->y - k * ptEnd->x; 
  double fAngle = atan(k);
  int dashLinLen = 10; //
  double ptDash_x = dashLinLen * cos(fAngle),  ptDash_y = dashLinLen * sin(fAngle);
  double ptSpace_x = ptDash_x, ptSpace_y = ptDash_y;

  double pt1_x = ptStart->x, pt1_y = ptStart->y;
  while(pt1_x < ptEnd->x)
  {
    pDC->MoveTo((int)pt1_x, (int)pt1_y);
    double pt2_x = pt1_x + ptDash_x, pt2_y = pt1_y + ptDash_y;
    if(pt2_x > ptEnd->x)
    {
      pt2_x = ptEnd->x, pt2_y = ptEnd->y;
    }
    pDC->LineTo((int)pt2_x, (int)pt2_y);

    pt1_x += ptDash_x + ptSpace_x;
    pt1_y += ptDash_y + ptSpace_y;
  }

  pDC->SelectObject(pOldPen);
}

 

//测试代码
void CSDI_44View::OnDraw(CDC* pDC)
{
  CSDI_44Doc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  // TODO: add draw code for native data here

  CRect rcClient;
  GetClientRect(&rcClient);

  DrawDashLine(pDC, &rcClient.TopLeft(), 
    &rcClient.BottomRight(), 
    5, RGB(255, 0, 0));
}

//效果图

抱歉!评论已关闭.