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

(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

MFC中如何画带实心箭头的直线的更多相关文章

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

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

  2. AE常用代码(标注要素、AE中画带箭头的线、如何获得投影坐标、参考坐标、投影方式、FeatureCount注意事项)

    手上的电脑已经用了将近三年了,想入手一台Surface Pro,所以计划着把电脑上的资料整理下,部分资料打算发到博客上来,资料有同事.也有自己的.也有来自网络的,来源途径太多,也没法详细注明,请见谅! ...

  3. GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

    带插件的排序算法演示器 请尊重本人的工作成果,转载请留言.并说明转载地址,谢谢. 地址例如以下: http://blog.csdn.net/fukainankai/article/details/27 ...

  4. MFC中afx_msg是什么,afx_msg void function()是什么意思

    应用程序框架产生的消息映射函数例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg为消息标志,它向系统声明:有消息映射到函数实现体:而在map宏定义中,就有 ...

  5. MFC中SliderCtrl控件的使用

    在MFC中滑动条(CSliderCtrl)是个经常使用的控件,使用方法例如以下: 主要要方法有: 1.设置.取得滑动范围: void SetRange( int nMin, int nMax, BOO ...

  6. MFC中的各种DC区别

    转载自:xntop的<区别MFC中的CClientDC.CWindowDC.CPaintDC.CMetaFileDC> CClientDC及其子类 1. CClientDC类只能在客户区绘 ...

  7. MFC中消息响应机制

    由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击.鼠标移动等操作都只能由视类窗口捕获.一个MFC消息响应函数在程序中有三处相关信息:函数原型.函数实现和以及用来关联消息和消息响应函数的 ...

  8. VC、MFC中设置控件的背景色、标题、字体颜色、字体要注意的地方[转]

    在MFC中设置控件的背景色.字体.字体颜色.标题等属性主要是利用OnCtlColor函数来实现. 如: HBRUSH CAlarm::OnCtlColor(CDC* pDC, CWnd* pWnd, ...

  9. 【转】MFC中调试过程中查看输出信息 -- 不错

    原文网址:http://blog.sina.com.cn/s/blog_4e24d9c501014o39.html 笔记&&方便查阅. ~~~~~~~~~~~~~~~~~~~~~~~~ ...

随机推荐

  1. RecyclerView使用大全

    RecylerView介绍 RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字recyler ...

  2. 有朋友问了数据库ID不连续,怎么获取上一篇和下一篇的文章?(不是所有情况都适用)

    呃 (⊙o⊙)…,逆天好久没写SQL了,EF用的时间长了,SQL都不怎么熟悉了......[SQL水平比较菜,大牛勿喷] 方法很多种,说个最常见的处理 因为id是自增长的,所以一般情况下下一篇文章的I ...

  3. CSS 特殊属性介绍之 pointer-events

    首先看一下 MDN 上关于 pointer-events 的介绍: CSS属性 pointer-events 允许作者控制特定的图形元素在何时成为鼠标事件的 target.当未指定该属性时,SVG 内 ...

  4. hadoop2.7之Mapper/reducer源码分析

    一切从示例程序开始: 示例程序 Hadoop2.7 提供的示例程序WordCount.java package org.apache.hadoop.examples; import java.io.I ...

  5. iOS之解决崩溃Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.

    崩溃提示:Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <CAL ...

  6. IOS之Objective-C学习 ARC下的单例模式

    单例模式是我常用的一种设计模式,最常见的用途就是用来保存数据并且传递数据.这都归功于单例模式的特性,首先就让我为大家简单介绍一下单例模式的特性. 单例模式的三大特性: 1.某个类只能有一个实例: 2. ...

  7. 在禅道中实现WORD等OFFICE文档转换为PDF进行在线浏览

    条件: 安装好禅道的服务器 能直接浏览PDF的浏览器(或通过 安装插件实现 ) 文档转换服务程序(建议部署在另一台服务器上)     实现 原理: 修改禅道的文件预览功能(OFFICE文档其使用的是下 ...

  8. 一条Sql语句分组排序并且限制显示的数据条数

    如果我想得到这样一个结果集:分组排序,并且每组限定记录集的数量,用一条SQL语句能办到吗? 比如说,我想找出学生期末考试中,每科的前3名,并按成绩排序,只用一条SQL语句,该怎么写? 表[TScore ...

  9. sqlserver批量修改首字母为大写

    'hello world'  ---->   'Hello world' update tableName set columnName=CHAR(ASCII(SUBSTRING(columnN ...

  10. Performance Tuning

    本文译自Wikipedia的Performance tuning词条,原词条中的不少链接和扩展内容非常值得一读,翻译过程中暴露了个人工程学思想和英语水平的不足,翻译后的内容也失去很多准确性和丰富性,需 ...