使用GDI绘制带箭头的直线

int DrawArrowLine(HDC hDC, LPPOINT lpPointStart, LPPOINT lpPointEnd, double nArrowBorderLen, double xAngleInRadians, COLORREF cr)
{
 const double PI = 3.1415926;

 double xAngleLine = 0;
 if (lpPointStart->x == lpPointEnd->x)
  xAngleLine = PI / 2;
 else
 {
  xAngleLine = atan((double(lpPointEnd->y) - double(lpPointStart->y)) / (double(lpPointEnd->x) - double(lpPointStart->x)));
 }

 CPoint ptLineLeft;
 if (lpPointStart->x > lpPointEnd->x)
 {
  ptLineLeft.x = long(lpPointEnd->x + cos(xAngleLine + xAngleInRadians) * nArrowBorderLen);
  ptLineLeft.y = long(lpPointEnd->y + sin(xAngleLine + xAngleInRadians) * nArrowBorderLen);
 }
 else if (lpPointStart->x == lpPointEnd->x)
 {
  if (lpPointStart->y > lpPointEnd->y)
  {
   ptLineLeft.x = long(lpPointEnd->x + cos(xAngleLine + xAngleInRadians) * nArrowBorderLen);
   ptLineLeft.y = long(lpPointEnd->y + sin(xAngleLine + xAngleInRadians) * nArrowBorderLen);
  }
  else if (lpPointStart->y == lpPointEnd->y)
  {
   return 0;
  }
  else
  {
   ptLineLeft.x = long(lpPointEnd->x - cos(xAngleLine + xAngleInRadians) * nArrowBorderLen);
   ptLineLeft.y = long(lpPointEnd->y - sin(xAngleLine + xAngleInRadians) * nArrowBorderLen);
  }
 }
 else
 {
  ptLineLeft.x = long(lpPointEnd->x - cos(xAngleLine + xAngleInRadians) * nArrowBorderLen);
  ptLineLeft.y = long(lpPointEnd->y - sin(xAngleLine + xAngleInRadians) * nArrowBorderLen);
 }

 CPoint ptLineRight;
 if (lpPointStart->x > lpPointEnd->x)
 {
  ptLineRight.x = long(lpPointEnd->x + cos(xAngleLine - xAngleInRadians) * nArrowBorderLen);
  ptLineRight.y = long(lpPointEnd->y + sin(xAngleLine - xAngleInRadians) * nArrowBorderLen);
 }
 else if (lpPointStart->x == lpPointEnd->x)
 {
   if (lpPointStart->y > lpPointEnd->y)
  {
   ptLineRight.x = long(lpPointEnd->x + cos(xAngleLine - xAngleInRadians) * nArrowBorderLen);
   ptLineRight.y = long(lpPointEnd->y + sin(xAngleLine - xAngleInRadians) * nArrowBorderLen);
  }
  else if (lpPointStart->y > lpPointEnd->y)
  {
   return 0;
  }
  else
  {
   ptLineRight.x = long(lpPointEnd->x - cos(xAngleLine - xAngleInRadians) * nArrowBorderLen);
   ptLineRight.y = long(lpPointEnd->y - sin(xAngleLine - xAngleInRadians) * nArrowBorderLen);
  }
 }
 else
 {
  ptLineRight.x = long(lpPointEnd->x - cos(xAngleLine - xAngleInRadians) * nArrowBorderLen);
  ptLineRight.y = long(lpPointEnd->y - sin(xAngleLine - xAngleInRadians) * nArrowBorderLen);
 }

 HPEN hPen = ::CreatePen(PS_SOLID, 1, cr);
 LOGBRUSH lb;
 lb.lbStyle = BS_SOLID;
 lb.lbColor = cr;
 HBRUSH hBrush = ::CreateBrushIndirect(&lb);

 HPEN hOldPen = (HPEN)::SelectObject(hDC, hPen);

 // Draw line
 ::MoveToEx(hDC, lpPointStart->x, lpPointStart->y, NULL);
 ::LineTo(hDC, lpPointEnd->x, lpPointEnd->y);

 // Draw arrow
 HBRUSH hOldBrush = (HBRUSH)::SelectObject(hDC, hBrush);
 POINT ptPolygon[3] = {lpPointEnd->x, lpPointEnd->y, ptLineLeft.x, ptLineLeft.y, ptLineRight.x, ptLineRight.y};
 ::Polygon(hDC, ptPolygon, 3);

 ::SelectObject(hDC, hOldBrush);
 ::SelectObject(hDC, hOldPen);
 ::DeleteObject(hBrush);
 ::DeleteObject(hPen);

 return 0;
}

转载于:https://www.cnblogs.com/carekee/articles/2334586.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值