• MFC绘制二维图形【1】—— 使用映射模式函数自定义坐标系


    目录

    一、创建Test工程

    二、自定义坐标系

    三、映射模式(MapMode) 

    四、映射模式函数

    1)设置映射模式函数

    2)设置窗口范围函数

    3)设置视区范围函数

    4)设置视区原点函数

    5)偏移矩形函数

    五、 不改变映射模式修改坐标系


    一、创建Test工程

    1、新建单文档项目

    2、绘制二维图像实在CTestView类中的OnDraw函数,OnDraw函数中被注释的指针PDc要放开(纯虚函数

    3、在MFC框架中,窗口显示的是像素,屏幕以像素为基准。


    二、自定义坐标系


    三、映射模式(MapMode) 

    模式代码宏定义值坐标系特征
    MM_TEXT1每个逻辑单位被转换为1个设备像素,正x向右,正y向下
    MM_LOMETRIC2每个逻辑单位被转换为0.1毫米,正x向右,正y向上
    MM_HIMETRIC3每个逻辑单位被转换为0.01毫米,正x向右,正y向上
    MM_LOENGLISH4每个逻辑单位被转换为0.01英寸,正x向右,正y向上
    MM_HIENGLISH5每个逻辑单位被转换为0.001英寸,正x向右,正y向上
    MM_TWIPS6每个逻辑单位被转换为1/20点(一点是1/72英寸,一个twip是1/1440英寸),正x向右,正y向上
    MM_ISOTROPIC7在保证x轴和y轴比例相等的情况下,逻辑单位被转换为任意的单位,且方向可以独立设置
    MM_ANISOTROPIC8逻辑单位被转换为任意的单位,x轴和y轴的方向和比例独立设置

    四、映射模式函数

    1)设置映射模式函数

            原型:virtual int SetMapMode(int nMapMode);

            参数:nMapMode用于指定新的映射模式,可常取MM_ANISOTROPIC。

            MM_ANISOTROPIC是窗口范围和设备范围可以任意改变,要求使用SetWindowExt函数设置窗口的范围,使用SetViewPortExt函数设置视区的范围。

    2)设置窗口范围函数

            原型:virtual CSize SetWindowExt(int cx,int cy);

            参数:cx窗口x范围的逻辑单位,cy窗口y范围的逻辑单位;

    3)设置视区范围函数

            原型:virtual CSize SetViewportExt(int cx,int cy);

            参数:cx视区x范围的设备单位,cy视区y范围的设备单位;

    4)设置视区原点函数

            原型“:virtual CPoint SetViewportOrg(int x,int y);

            参数:x,y是视区新原点的设备坐标;

    5)偏移矩形函数

            原型:void OffsetRect(int x,int y);

            参数:x左右偏移量,y上下偏移量;


    1. // TODO: 在此处为本机数据添加绘制代码
    2. CRect rect; //定义一个矩形对象
    3. GetClientRect(rect);//初始化(rect不是一个数值,很多属性)
    4. //使用映射模式函数
    5. pDC->SetMapMode(8);
    6. //设置窗口的大小
    7. pDC->SetWindowExt(rect.Width(),rect.Height());//矩形的宽高作为窗口大小
    8. //设置视区大小
    9. pDC->SetViewportExt(rect.Width(),-rect.Height());
    10. //圆点
    11. pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);
    12. //此时矩形位置随坐标系变化,应该是在右上角,需要进行平移
    13. rect.OffsetRect(-rect.Width() / 2,-rect.Height() / 2);
    14. //绘制一个三角形
    15. CPoint P0(-200, -100), P1(200, -100), P2(0,200);
    16. pDC->MoveTo(P0);
    17. pDC->LineTo(P1);
    18. pDC->LineTo(P2);
    19. pDC->LineTo(P0);


    五、 不改变映射模式修改坐标系

    1. CRect rect;
    2. GetClientRect(&rect);
    3. int nClientWidth = rect.Width();
    4. int nClientHeight = rect.Height();
    5. int nHWidth = nClientWidth/2;
    6. int nHHeigh = nClientHeight/2;
    7. CPoint P0(-200, -100), P1(200, -100), P2(0,200);
    8. pDC->MoveTo(nHWidth + P0.x,nHHeight - P0.y);
    9. pDC->LineTo(nHWidth + P1.x,nHHeight - P1.y);
    10. pDC->LineTo(nHWidth + P2.x,nHHeight - P2.y);
    11. pDC->LineTo(nHWidth + P0.x,nHHeight - P0.y);

    通过比较可知,第一种更方便。

  • 相关阅读:
    什么无线蓝牙耳机延迟低?延迟低的无线蓝牙耳机推荐
    位级运算之计算整数位级表示奇偶性
    什么是哈希表?如何使用哈希表进行数据存储和查找?
    3. Caller 服务调用 - dapr
    linux入门---信号量
    Proteus仿真--一种智能频率计的设计与制作(AVR单片机+proteus仿真)
    Ubuntu系统下挂载共享文件夹的操作
    【数据科学项目02】:NLP应用之垃圾短信/邮件检测(端到端的项目)
    Kafka核心原理
    探花交友_第6章_完善小视频功能以及即时通讯
  • 原文地址:https://blog.csdn.net/m0_62853489/article/details/128167737