MFC中如何画带实心箭头的直线
2024-10-18 17:18:22
工作中遇到话流程图的项目,需要画带箭头的直线,经过摸索,解决;思路如下:
(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);//获取客户窗口DC CPen pen,pen1,*oldpen; ;//为了根据线条宽度设置箭头的大小 pen.CreatePen(PS_SOLID, PenLineWidth, RGB(, , )); pen1.CreatePen(PS_SOLID, PenLineWidth, RGB(, , )); oldpen=dc.SelectObject(&pen); *PenLineWidth;//转换为弧度 double Px,Py,P1x,P1y,P2x,P2y; //以P2为原点得到向量P2P1(P) Px=p1.x-p2.x; Py=p1.y-p2.y; //向量P旋转theta角得到向量P1 P1x=Px*cos(theta)-Py*sin(theta); P1y=Px*sin(theta)+Py*cos(theta); //向量P旋转-theta角得到向量P2 P2x=Px*cos(-theta)-Py*sin(-theta); P2y=Px*sin(-theta)+Py*cos(-theta); //伸缩向量至制定长度 double x1,x2; ; 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[]; ptVertex[].x = p2.x; ptVertex[].y = p2.y; ptVertex[].x = P1x; ptVertex[].y = P1y; ptVertex[].x = P2x; ptVertex[].y = P2y; //填充三角形区域 CBrush br(RGB(,,)); CRgn rgn; rgn.CreatePolygonRgn(ptVertex,,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
最新文章
- 火狐浏览器中event不起作用解决办法--记录(一)
- tomcat 应用部署的几点注意
- Html5上传后有所见图片效果前端代码实现
- spark
- 运行page页面时的事件执行顺序
- Openstack Neutron L2 Population
- POJ_1287_mst
- ARM学习笔记13——LED驱动程序设计
- Http的Post和Get
- Ubuntu下Geary安装
- 小米2S TWRP 3.0.2-0 最新中文版本Recovery
- (转)java二维数组的深度学习(静态与动态)
- JavaScript判断对象类型及节点类型、节点名称和节点值
- 【转】软件开发工具介绍之 6.Web开发工具
- 【转】sed单行命令大全
- HDU 2141 Can you find it? [二分]
- jquery初始化的三种方式
- Hexo+Github博客最简教程-Dockerfile自动搭建
- eclipse常用快捷键整理
- CSS学习(二)
热门文章
- 【.net 深呼吸】序列化中的“引用保留”
- [ 高并发]Java高并发编程系列第二篇--线程同步
- JavaScript 字符串实用常操纪要
- angular2系列教程(九)Jsonp、URLSearchParams、中断选择数据流
- angular 源码分析 1 - angularInit()
- C++随笔:.NET CoreCLR之GC探索(3)
- WebApi基于Token和签名的验证
- LINQ to SQL Where条件
- 【C#公共帮助类】 ToolsHelper帮助类
- 文档对象模型DOM通俗讲解