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 笔记&&方便查阅. ~~~~~~~~~~~~~~~~~~~~~~~~ ...
随机推荐
- Visual Studio 2010的MSDN帮助文档离线使用
如果没有在安装vs过程中安装帮助,也可通过Visual Studio帮助菜单中的Manage Help Settings来对帮助进行设置或安装. 可以选择从磁盘安装内容,如果选择从磁盘安装可能会要求提 ...
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
- android自定义控件一站式入门
自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...
- Sublime Text3配置在可交互环境下运行python快捷键
安装插件 在Sublime Text3下面写代码感觉很不错,但是写Python的时候遇到了一些问题. 用Sublime Text3打开python文件,或者在Sublime Text3下写好pytho ...
- InnoDB关键特性学习笔记
插入缓存 Insert Buffer Insert Buffer是InnoDB存储引擎关键特性中最令人激动与兴奋的一个功能.不过这个名字可能会让人认为插入缓冲是缓冲池中的一个组成部分.其实不然,Inn ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- [C#] C# 知识回顾 - 委托 delegate
C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...
- [原] KVM 虚拟化原理探究 —— 目录
KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CP ...
- IdentityServer4 使用OpenID Connect添加用户身份验证
使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.I ...