• MFC图形函数学习03——画直线段函数


           MFC中画直线段需要两个函数的配合,一个函数负责设定画线起点,另一个函数负责将线段从起点画到终点。
    一、介绍这两个画线函数
     (1)设定画线起点函数MoveTo()
           原型:CPoint MoveTo(int x,int y);
           参数:窗口上的坐标点(x,y),画线起始位置
           返回值:返回移动前的、以CPoint类对象表示的位置,从这个对象中能够取出(x,y)坐标。
      (2)画线段函数LineTo()
           原型:BOOL LineTo(int x.int y);
           参数:窗口上的坐标点(x,y),画线终止位置
           返回值:画线成功返回非0数,不成功返回0。
      (3)说明
           a.这两个函数是CDC类的成员函数,使用时需要CDC类对象或指针调用。MFC中的函数,全局函数少,大多数是属于某个类的成员函数,这一点需要记住。
           b.关于MoveTo函数的返回值类型CPoint,它是一个类,这个类与POINT结构体类似,其属性可以表示某点的坐标,用它的对象做参数,可以代替(x,y)这种写法。CPoint类还有其它属性和成员函数。
           c.如果我们不设置画线起点,直接使用LineTo画线,则画线的起点是上次画线的终点。如是第一次画线,则从(0,0)开始。
           d.如不进行其它设置,直接使用上面的函数画线,画出线的颜色、线型、线宽等都是按照缺省值进行的。如不使用缺省值画线,需要进行下面这些设置。
    二、设置画线线型、线宽、颜色的步骤
      (1)调用创建画笔函数
            原型:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF color);
            参数:nPenStyle画笔样式、nWidth画笔宽度都是int类型;color是颜色COLORREF类型
           关于画笔样式取值:这里介绍三个,PS_SOLID(值=0)代表实线;PS_DASH(值=1)代表虚线;PS_NULL(值=5)代表无形线。
           关于画笔宽度取值:需要几个像素宽就写几个像素;关于颜色,有一个专门的类型是COLORREF,为其对象赋值可以使用RGB()函数,这个函数有三个参数,分别代表红(r)、绿(g)、蓝(b)三个原色分量,每个值的范围均是0~255,通过三个值的不同组合,可以形成各种颜色。
           说明:
             a.函数CreatePen是CPen类的成员函数,使用这个函数需要CPen类对象或指针调用。CPen类的基类是CGdiObject,它也是众多绘图工具的基类,以后慢慢接触。
             b.虚线的宽度只有1,再往大了选就变成实线了。
       (2)将创建的画笔选入CDC的函数
           原型:CPen* SelectObject(CPen* pPen);
           参数:pPen是将要被选入的画笔对象指针。
           返回值:返回值是CPen类型的指针,选入成功返回被替换画笔的指针;失败返回NULL。
           说明:
             a.函数SelectObject()是CDC类的成员函数,需要CDC类对象或指针调用,如此,也才能将创建的画笔选入CDC之中。
             b.这个函数的返回值是必须接收的,自己创建的画笔使用完毕,应将原来缺省的画笔予以恢复;而这个返回值正是原来的缺省画笔,接收后保存起来,恢复时重新选入即可。
             c.注意,函数选入画笔时是使用指针类型,如果我们声明的画笔不是指针,要对其取址后传入。
    三、举一个画直线的例子。这个例子使用设备坐标系,即绘图原点(0,0)在窗口左上角,从原点向窗口底边不同位置使用不同线型、线宽、颜色均匀画30条线。
       代码及注释如下(如要运行程序将其考入OnDraw函数中即可):

    1. //如程序中已有“设置自定义坐标系”代码,请注释掉
    2. srand(time(0)); //随机数种子,为使用time函数在头文件部分要将包含
    3. for (int i = 0; i < 30; i++) //用循环控制画线条数
    4. {
    5. //随机颜色的设置()
    6. int r = rand() % (255 + 1);//生成0-255之间的随机数
    7. int g = rand() % (255 + 1);
    8. int b = rand() % (255 + 1);
    9. COLORREF color = RGB(r,g,b);//生成颜色
    10. //获得窗口数据
    11. CRect rect;
    12. GetClientRect(rect);
    13. int dis = rect.Width() / 30; //画线终点在窗口底部x方向的间隔
    14. int height = rect.Height(); //画线终点在y方向的位置(设备坐标系y朝下)
    15. //定义线型、线宽
    16. int style, width;
    17. if (i == int(i / 2) * 2)
    18. {
    19. style = PS_SOLID; //画线条数为双数时用实线
    20. width = 3;//画线条数为双数时线宽3个像素
    21. }
    22. else
    23. {
    24. style = PS_DASH; //画线条数为单数时用虚线
    25. width = 1;//画线条数为双数时线宽1个像素
    26. }
    27. //创建画笔
    28. CPen myPen; //声明画笔对象
    29. myPen.CreatePen(style, width, color);//调用画笔成员函数创建画笔
    30. //选入画笔并保存缺省画笔
    31. CPen* oldPen = pDC->SelectObject(&myPen); //返回值为缺省指针
    32. //画线
    33. pDC->MoveTo(0, 0),
    34. pDC->LineTo(20 + i * dis, height);
    35. //恢复缺省画笔
    36. pDC->SelectObject(oldPen);
    37. }

    运行效果:

  • 相关阅读:
    php语言
    如何在vscode里面快速运行html代码(包含如何在vscode里面编写html代码)
    新手投资如何分配股票仓位?诺奖得主的秘诀是什么?| 附代码【邢不行】
    大模型在数据分析场景下的能力评测
    辅助知识-第6 章 信息系统安全管理
    梯度消失/梯度爆炸
    python学习10--工程结构(包、模块)&命名空间&导入模块与变量&_init_.py&_all_&_name_
    UG NX二次开发(C#)-获取UI中选择对象的handle值
    用VS Code运行C语言(安装VS Code,mingw的下载和安装)
    【Python】PySpark 数据计算 ① ( RDD#map 方法 | RDD#map 语法 | 传入普通函数 | 传入 lambda 匿名函数 | 链式调用 )
  • 原文地址:https://blog.csdn.net/m0_72128260/article/details/143311375