工作中遇到话流程图的项目,需要画带箭头的直线,经过摸索,解决;思路如下:

(1) 两个点(p1,p2)确定一个直线,以直线的一个端点(假设p2)为原点,设定一个角度

(2)以P2为原点得到向量P2P1(P),向量P旋转theta角得到向量P1,向量P旋转-theta角得到向量P2

(3)伸缩向量至制定长度,平移变量到直线的末端

(4)现在已经有3个点了,画线就可

具体代码如下:

void CworkflowDlg::DrawLine(CPoint p1, CPoint p2)
{CClientDC dc(this);//获取客户窗口DCCPen pen,pen1,*oldpen;int PenLineWidth=2;//为了根据线条宽度设置箭头的大小pen.CreatePen(PS_SOLID, PenLineWidth, RGB(0, 0, 0));pen1.CreatePen(PS_SOLID, PenLineWidth, RGB(0, 0, 0));oldpen=dc.SelectObject(&pen);double theta=3.1415926/15*PenLineWidth;//转换为弧度double Px,Py,P1x,P1y,P2x,P2y;//以P2为原点得到向量P2P1(P)Px=p1.x-p2.x;Py=p1.y-p2.y;//向量P旋转theta角得到向量P1P1x=Px*cos(theta)-Py*sin(theta);P1y=Px*sin(theta)+Py*cos(theta);//向量P旋转-theta角得到向量P2P2x=Px*cos(-theta)-Py*sin(-theta);P2y=Px*sin(-theta)+Py*cos(-theta);//伸缩向量至制定长度double x1,x2;int length=10;x1=sqrt(P1x*P1x+P1y*P1y);P1x=P1x*length/x1;P1y=P1y*length/x1;x2=sqrt(P2x*P2x+P2y*P2y);P2x=P2x*length/x2;P2y=P2y*length/x2;//平移变量到直线的末端P1x=P1x+p2.x;P1y=P1y+p2.y;P2x=P2x+p2.x;P2y=P2y+p2.y;dc.MoveTo(p1.x,p1.y);dc.LineTo(p2.x,p2.y);dc.SelectObject(&pen1);dc.MoveTo(p2.x,p2.y);dc.LineTo(P1x,P1y);dc.MoveTo(p2.x,p2.y);dc.LineTo(P2x,P2y);dc.MoveTo(P1x,P1y);dc.LineTo(P2x,P2y);CPoint ptVertex[3];ptVertex[0].x = p2.x;ptVertex[0].y = p2.y;ptVertex[1].x = P1x;ptVertex[1].y = P1y;ptVertex[2].x = P2x;ptVertex[2].y = P2y;//填充三角形区域CBrush br(RGB(40,130,170));  CRgn rgn; rgn.CreatePolygonRgn(ptVertex,3,ALTERNATE);dc.FillRgn(&rgn, &br);  dc.SelectObject(oldpen);br.DeleteObject();  rgn.DeleteObject();
}  

这里面用到CreatePolyonRgn这个函数,具体用法如下:

BOOL CRgn::CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode);
[说明]
创建一个由一系列点围成的区域。windows在需要时自动将最后点与第一点相连以封闭多边形
[参数表]
lpPoint -------- POINTAPI,nCount个POINTAPI结构中的第一个POINTAPI结构
nCount --------- Long,多边形的点数
nPolyFillMode -- Long,描述多边形填充模式。可为ALTERNATE 或 WINDING常数。nPolyFillMode在默认情 况下为ALTERNATE;
模式ALTERNATE:其从封闭区域中的一个点向无穷远处水平画一条射线,只有当该射线穿越奇数条边框线时,封闭区域才被填充,如为偶数,则不填充该区域;
模式WINDING:方法一样,如为奇数,填充该区域;如为偶数则要根据边框线的方向来判断:如果穿过的边框线在不同方向的边框线数目相等,则不填充,如不等,则填充。
[返回值]
Long,执行成功为创建的区域句柄,失败则为0

转载于:https://www.cnblogs.com/ChinacloudTech/p/6207109.html

MFC中如何画带实心箭头的直线相关推荐

  1. visio2016中如何画出有箭头的直线以及如何掉转箭头方向

    Visio 2016 1. 如何画出有箭头的直线 今天使用Visio2016在画示意图的时候,发现不知道如何画出有箭头的直线,然后是在:指针工具右侧选上线条--然后下图中的2--线条-–箭头,选择合适 ...

  2. 【MFC】如何画带箭头的直线

    [MFC]如何画带箭头的直线 前言 代码 获得箭头坐标 前言 如何绘制带箭头的直线,说来也简单,只需要算出箭头左右两边的坐标,再使用LineTo()函数即可.话不多说上代码. 代码 获得箭头坐标 已知 ...

  3. matlab中画带箭头向量,几何画板中如何画带箭头的向量

    在学习了向量的相关知识后,我们都知道几何向量(也称为欧几里得向量,通常简称向量.矢量),指具有大小和方向的量.那么几何画板做为最专业的几何绘图工具,也可以用来绘制向量.如果你还不知道怎么在几何画板中画 ...

  4. visio中怎样画线条或箭头

    1.在"画图"工具栏上,单击"铅笔"工具   或"线条"工具   . (凝视   假设看不到"画图"工具栏,请单击&qu ...

  5. visio中如何画线条或箭头

    1.在"绘图"工具栏上,单击"铅笔"工具   或"线条"工具

  6. 在MFC中,利用GDI绘制橡皮筋效果-直线,圆,椭圆,矩形

    这段时间学习了GDI和GDI+:如果想实现橡皮筋效果,还是离不开GDI.虽然GDI+也能实现,但比较麻烦,有局限性,必须用到双缓冲. 下面贴出GDI绘制橡皮筋效果的示例代码 ZKCADView.h: ...

  7. c语言中怎么画直线,ps如何画直线 【操作流程】

    大家都知道电脑使用起来非常方便,但遇见ps如何画直线 的时候就非常头疼了,如果你是第一次遇到ps如何画直线 ,怎么样才能快速解决ps如何画直线 带来的烦恼呢?小编为大家收集了很多关于ps如何画直线 问 ...

  8. MFC画带箭头的直线

    构造一个函数,是在startPoint,endPoint间画一条带箭头的线段: void CTry1View::DrawLine(POINT startPoint, POINT endPoint) { ...

  9. MFC中实现的画箭头算法 (Arrow in MFC)

    在codeproject中寻找到一个这样的算法,在这里介绍一下 可以改变三角形大小,顶点角度,是否填充和填充颜色等 但是画出的箭头还是不够美观....呵呵,还好吧 其中填充是代表箭头内是否填充颜色 先 ...

  10. html5画直线箭头,HTML5 canvas画带箭头的虚线

    今天给大家讲解的是在HTML5 canvas画带箭头的虚线.关于Canvas 对象表示一个 HTML 画布元素 -.它没有自己的行为,但是定义了一个 API 支持脚本化客户端绘图操作. 本案例注意事项 ...

最新文章

  1. C语言实现生产者-消费者问题
  2. 什么文件使用.md扩展名,我该如何编辑它们?
  3. 1过程流程图 3 apqp_为什么过程开发的平面布置图要遵循精益原则?
  4. Python机器学习:逻辑回归001什么是逻辑回归
  5. DSP的CMD文件 RUN_START
  6. c语言单元测验答案,c语言试题及答案
  7. 基于STM32MINI板步进电机程序(有代码)
  8. 芯片制造工艺中的衡量指标
  9. ES查询-空字段和非空字段结果
  10. 计算机复制无法到qq上,为什么不能复制粘贴,解决电脑无法粘贴复制的方法
  11. 两个苹果手机共享步数_实测:iPhone上“微信运动”步数可以作弊
  12. 一些融会贯通的知识点----持续更新
  13. Huawei RH2288 V3 风扇噪音大的解决方案
  14. PMP考试中常见的翻译问题
  15. 电脑重装系统失败无法开机怎么办如何解决
  16. python离线安装tensorflow_TensorFlow的离线安装
  17. 推荐8个好用的Linux音乐播放器~
  18. 视频编解码中的temporal id和layer id(x265,HM,VTM)
  19. 使用开源 phpqrcode 生成二维码
  20. JS中常见的内存泄漏及识别方式

热门文章

  1. 编译OpenJDK:make[1]: *** 没有规则可制作目标“openjdk8/jdk/src/share/classes/java/applet/AppletContext.java”,
  2. JAVA:文本文件读写使用Reader/Writer,二进制文件使用InputStream/OutputStream
  3. 对比目录差异,涉及到LINUX要小心,无法发现大小写问题
  4. LINUX如何获取jre路径,及程序代码如何读取
  5. 通过朋友间推广APP,根本不可行
  6. 给硬盘分个整数大小的区
  7. Virtual Member Functions(虚拟成员函数)
  8. C# Excel 读写数据
  9. c++ 11 新特性之 左值右值
  10. com 的 IUnknown 接口的了解