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

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

一、创建Test工程

1、新建单文档项目

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

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

二、自定义坐标系

三、映射模式(MapMode)

image.png

四、映射模式函数

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上下偏移量;

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

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

    CRect rect;
    GetClientRect(&rect);
    int nClientWidth = rect.Width();
    int nClientHeight = rect.Height();
    int nHWidth = nClientWidth/2;
    int nHHeigh = nClientHeight/2;
  CPoint P0(-200, -100), P1(200, -100), P2(0,200);
  pDC->MoveTo(nHWidth + P0.x,nHHeight - P0.y);
  pDC->LineTo(nHWidth + P1.x,nHHeight - P1.y);
  pDC->LineTo(nHWidth + P2.x,nHHeight - P2.y);
  pDC->LineTo(nHWidth + P0.x,nHHeight - P0.y);

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

相关文章
|
安全 Linux Shell
Read-only file system 问题分析与解决
Read-only file system 问题分析与解决
Read-only file system 问题分析与解决
|
域名解析 缓存 网络协议
如何解决域名解析不生效问题?
文中对域名解析不生效的原因进行了分析,并针对最常见的本地递归域名服务器缓存不生效的问题提出了解决方案,尤其移动域名解析HTTPDNS对无线场景下的应用特别有效。
32243 0
|
9月前
|
存储 Docker 容器
docker中挂载数据卷到容器
【10月更文挑战第13天】
286 2
【qt】纯代码界面设计
【qt】纯代码界面设计
403 2
|
9月前
|
缓存 监控 API
抖音抖店 API 请求获取宝贝详情数据的调用频率限制如何调整?
抖音抖店API请求获取宝贝详情数据的调用频率受限,需遵循平台规则。开发者可通过提升账号等级、申请更高配额、优化业务逻辑(如缓存数据、异步处理、批量请求)及监控调整等方式来应对。
|
11月前
MFC基本控件4-列表框控件List Box
MFC基本控件4-列表框控件List Box
|
存储 算法 机器人
卡尔曼滤波 KF | 扩展卡尔曼滤波 EKF (思路流程和计算公式)
本文分析卡尔曼滤波和扩展卡尔曼滤波,包括:思路流程、计算公式、简单案例等。滤波算法,在很多场景都有应用,感觉理解其思路和计算过程比较重要。
2498 0
|
JSON Java API
在 Spring Boot 中使用 OpenAI ChatGPT API
在 Spring Boot 中使用 OpenAI ChatGPT API
366 1
|
开发工具 git
git clone如何拉取代码,抓取和拉取
git clone如何拉取代码,抓取和拉取
|
开发者 UED
图形用户界面(GUI)设计:使用Visual Basic创建直观的界面
【4月更文挑战第27天】本文探讨了使用Visual Basic设计直观GUI的方法,强调GUI设计对用户体验的重要性。通过Visual Basic的窗体设计器、属性窗口和工具箱,开发者可轻松构建界面。标准控件、布局工具和交互性设计是关键要素,遵循简洁性、一致性和可访问性的原则。进行可用性测试并根据反馈优化是提升GUI质量的有效途径。案例研究、最佳实践和技巧分享有助于开发者创造美观、易用的界面。随着技术发展,未来GUI设计将更加注重用户体验和交互性。
466 1