MFC中如何画带实心箭头的直线
工作中遇到话流程图的项目,需要画带箭头的直线,经过摸索,解决;思路如下:
(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这个函数,具体用法如下:
MFC中如何画带实心箭头的直线的更多相关文章
- visio中怎样画线条或箭头
1.在"画图"工具栏上,单击"铅笔"工具 或"线条"工具 . (凝视 假设看不到"画图"工具栏,请单击" ...
- AE常用代码(标注要素、AE中画带箭头的线、如何获得投影坐标、参考坐标、投影方式、FeatureCount注意事项)
手上的电脑已经用了将近三年了,想入手一台Surface Pro,所以计划着把电脑上的资料整理下,部分资料打算发到博客上来,资料有同事.也有自己的.也有来自网络的,来源途径太多,也没法详细注明,请见谅! ...
- GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)
带插件的排序算法演示器 请尊重本人的工作成果,转载请留言.并说明转载地址,谢谢. 地址例如以下: http://blog.csdn.net/fukainankai/article/details/27 ...
- MFC中afx_msg是什么,afx_msg void function()是什么意思
应用程序框架产生的消息映射函数例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg为消息标志,它向系统声明:有消息映射到函数实现体:而在map宏定义中,就有 ...
- MFC中SliderCtrl控件的使用
在MFC中滑动条(CSliderCtrl)是个经常使用的控件,使用方法例如以下: 主要要方法有: 1.设置.取得滑动范围: void SetRange( int nMin, int nMax, BOO ...
- MFC中的各种DC区别
转载自:xntop的<区别MFC中的CClientDC.CWindowDC.CPaintDC.CMetaFileDC> CClientDC及其子类 1. CClientDC类只能在客户区绘 ...
- MFC中消息响应机制
由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击.鼠标移动等操作都只能由视类窗口捕获.一个MFC消息响应函数在程序中有三处相关信息:函数原型.函数实现和以及用来关联消息和消息响应函数的 ...
- VC、MFC中设置控件的背景色、标题、字体颜色、字体要注意的地方[转]
在MFC中设置控件的背景色.字体.字体颜色.标题等属性主要是利用OnCtlColor函数来实现. 如: HBRUSH CAlarm::OnCtlColor(CDC* pDC, CWnd* pWnd, ...
- 【转】MFC中调试过程中查看输出信息 -- 不错
原文网址:http://blog.sina.com.cn/s/blog_4e24d9c501014o39.html 笔记&&方便查阅. ~~~~~~~~~~~~~~~~~~~~~~~~ ...
随机推荐
- NodeJs之pm2
pm2 pm2是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能. 开发过程中建议时不时的参看官方详细命令行使用:命令行 pm2 ...
- 有朋友问了数据库ID不连续,怎么获取上一篇和下一篇的文章?(不是所有情况都适用)
呃 (⊙o⊙)…,逆天好久没写SQL了,EF用的时间长了,SQL都不怎么熟悉了......[SQL水平比较菜,大牛勿喷] 方法很多种,说个最常见的处理 因为id是自增长的,所以一般情况下下一篇文章的I ...
- $.type 怎么精确判断对象类型的 --(源码学习2)
目标: var a = [1,2,3]; console.log(typeof a); //->object console.log($.type(a)); //->ar ...
- MyEclipse生成注册码
今天正在使用的MyEclipse出现了使用过期,在网上发现一个可以生成注册码的程序,现在分享给各位. /** * myEclipse生成注册码 * 点击顶部:MyEclipse --> subs ...
- CSS知识总结(七)
CSS常用样式 5.背景样式 1)背景颜色 background-color : transparent | color 常用值:①英文单词,②十六进制,③RGB或RGBA 另外,还有一种是 渐变色彩 ...
- Angular (SPA) WebPack模块化打包、按需加载解决方案完整实现
文艺小说-?2F,言情小说-?3F,武侠小说-?9F long long ago time-1-1:A 使用工具,long long A ago time-1-2:A 使用分类工具,long long ...
- 浏览器的兼容模式下的button中文字垂直方向不居中显示
<button style="cursor:pointer;vertical-align: middle;" >删除</button> 这时候垂直不居中. ...
- Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)
之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...
- HTML 学习笔记 JQuery(DOM 操作2)
接着上一节的将,这一节从复制节点讲起 复制节点 继续使用之前的例子 如果单击<li>元素后 需要在复制一个<li>元素,可以使用clone()方法完成.全部代码如下 <h ...
- intellij idea 13&14 插件推荐及快速上手建议
IntelliJIDEA插件安装 首页 > blog Tags : intellij IDEA插件安装 更新日期: 2015-04-29 IntelliJ IDEA插件下载地址: http:// ...