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;
    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角得到向量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;
    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

时间: 2025-02-01 12:04:11

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

visio中如何画线条或箭头

1.在"绘图"工具栏上,单击"铅笔"工具  或"线条"工具  . (注释   如果看不到"绘图"工具栏,请单击"常用"工具栏上的"绘图工具" 以显示它.) 2.指向希望线条开始的位置. 3.拖动以绘制该线条. (基本思路就是先用画笔工具画出一条直线来,然后用线条工具对这条直线进行修饰,改成自己想要的形状就行了) 更加推荐使用双击线条-->输入显示的字符-->然后再双击字符 调

visio中怎样画线条或箭头

1.在"画图"工具栏上,单击"铅笔"工具  或"线条"工具  . (凝视   假设看不到"画图"工具栏,请单击"经常使用"工具栏上的"画图工具" 以显示它.) 2.指向希望线条開始的位置. 3.拖动以绘制该线条. (基本思路就是先用画笔工具画出一条直线来,然后用线条工具对这条直线进行修饰,改成自己想要的形状即可了) 更加推荐使用双击线条-->输入显示的字符-->然后再双击字符

VML画连线箭头,line线加粗

一.什么是VML VML相当于浏览器的画笔,它可以在浏览器中画出任何你想要的图形:小到直线.圆形.圆弧.曲线.矩形.圆角矩形.多边形:大到一张图画.一个动画.甚至于一个游戏.题中既以标明为简明教程,下边我们只限于讨论使用VML在浏览器中画一些直线.圆形.圆弧等小图. VML是微软1999年前(具体时间不详)制作推出的,并集成到了IE5+浏览器,同样也是Microsoft Office Art(艺术图型,如word的艺术文字)的核心结构.VML由微软Visio.Autodesk.Macromedi

MFC画带箭头的直线

构造一个函数,是在startPoint,endPoint间画一条带箭头的线段: void CTry1View::DrawLine(POINT startPoint, POINT endPoint) { CClientDC dc(this); dc.MoveTo(startPoint); dc.LineTo(endPoint); double PI = 3.1415926; double t=PI/4; //箭头与直线夹角 double l=0.2; //箭头边长度占直线长度的百分比 POINT

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

带插件的排序算法演示器 本节将通过一个实例来说明GDI+在MFC中的应用.这个算法演示器其实是本人算法系列的一个开端,由于csdn没有树状的目录结构,咱也只好使用链表了不是?好了,废话不多说,开始今天的文章. (一)功能说明 我们初步制定功能如下: (1). 能够通过柱状图,自动展示排序算法的交换比较过程 (2). 能够使用插件的形式进行开发.即,当新完成一个算法后,只需要完成一个插件文件(我们这里使用动态库dll),由主程序加载插件,即可进行执行,而不再需要重新编译主程序. (3). 保证主程

CAD里面怎么画带箭头的直线

转自:http://jingyan.baidu.com/article/9113f81b0192e72b3214c709.html?st=2&os=0&bd_page_type=1&net_type=1 当我们需要在CAD里面完成物理方面力的分解的时候就需要画坐标轴等带箭头的直线,但是CAD里面是自己不带箭头直线的,下面将详细的介绍怎么在CAD里面巧妙的完成直线箭头的绘制. 工具/原料 CAD 方法/步骤 打开CAD界面,点击左边的构造线工具.   选中你需要绘制箭头直线的端点,并

MFC的运行机制 以及 MFC中的DC、CDC、HDC、句柄、设备上下文 [转]

在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API.你说你喜欢C++而MFC换一种说法就是一个用C++写的一个函数库 然后你来调用 只不过这个类不是你写的 MFC提供数百个类,最重要的.也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石. 1>封装特性:构成MFC框架的是MFC类库而MFC类库又是C++的一个类库.这些类封装W

MFC中SliderCtrl控件的使用

在MFC中滑动条(CSliderCtrl)是个常用的控件,用法如下: 主要要方法有: 1.设置.取得滑动范围: void SetRange( int nMin, int nMax, BOOL bRedraw = FALSE ); void GetRange( int& nMin, int& nMax ) const; 2.设置.取得按下左右箭头滑动间隔: int SetLineSize( int nSize ); int GetLineSize( ) const; 3.设置.取得按下PgU

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

应用程序框架产生的消息映射函数例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg为消息标志,它向系统声明:有消息映射到函数实现体:而在map宏定义中,就有具体消息和此函数的映射定义(可以是自定义,也可以是系统自动完成的)afx是 application framework如定义一个Edit的Change处理函数:一.在类的头文件(*.h)中增加 : //{{AFX_MSG(CDialogDemo) afx_msg void OnChangeEdit1