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);

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

相关文章
|
算法 Unix 调度
【Qt 线程】深入探究QThread线程优先级:原理、应用与最佳实践
【Qt 线程】深入探究QThread线程优先级:原理、应用与最佳实践
1526 0
|
数据安全/隐私保护 iOS开发
使用HBuilder平台打包并上传iOS应用到App Store的完整教程
使用HBuilder平台打包并上传iOS应用到App Store的完整教程
|
安全
VS2019 error C4703: 使用了可能未初始化的本地指针变量 错误
VS2019 error C4703: 使用了可能未初始化的本地指针变量 错误
1368 0
VS2019 error C4703: 使用了可能未初始化的本地指针变量 错误
|
SQL 人工智能 关系型数据库
GitHub 热门!MindsDB 破解 AI + 数据库瓶颈,究竟有什么惊艳亮点?只需 SQL 即可实现智能预测
MindsDB 是一款将 AI 能力直接注入数据库的开源工具,支持 MySQL、PostgreSQL 等多种数据库连接,通过 SQL 即可完成模型训练与预测。它提供 AutoML 引擎、LLM 集成、联邦查询等功能,简化 MLOps 流程,实现数据到智能的无缝衔接。项目在 GitHub 上已获 32.4k 星,社区活跃,适用于客户流失预警、推荐系统、情感分析等场景。开发者无需深入模型细节,即可快速构建智能解决方案。项目地址:https://github.com/mindsdb/mindsdb。
1859 0
|
C++ UED 开发者
逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
591 0
|
存储 监控 Linux
在 CentOS 7 上如何对未使用的硬盘进行分区、格式化和挂载的最佳实践,包括准备工作、创建分区、格式化分区、创建挂载点、挂载分区及最佳实践建议
【10月更文挑战第8天】本文详细介绍了在 CentOS 7 上如何对未使用的硬盘进行分区、格式化和挂载的最佳实践,包括准备工作、创建分区、格式化分区、创建挂载点、挂载分区及最佳实践建议,旨在有效管理和利用服务器磁盘资源,提升系统稳定性和可维护性。
938 1
|
Windows
MFC学习之路(9)之如何使控件大小随着对话框大小自动调整
MFC学习之路(9)之如何使控件大小随着对话框大小自动调整
807 0
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
511 0
|
小程序 物联网 机器人
基于STM32+ESP8266设计物联网产品(重点:支持微信小程序一键配网连接腾讯云平台)
基于STM32+ESP8266设计物联网产品(重点:支持微信小程序一键配网连接腾讯云平台)
2570 20
基于STM32+ESP8266设计物联网产品(重点:支持微信小程序一键配网连接腾讯云平台)
|
安全 C++ 数据格式
C++ 字符串格式化转为 数据变量 - sscanf,sscanf_s及其相关用法
C++ 字符串格式化转为 数据变量 - sscanf,sscanf_s及其相关用法
725 1