MFC 绘制坐标系
主要讨论映射模式:MM_ANISOTROPIC,MM_ISOTROPIC.及相关方法的应用。
1,先建立一个MFC单文档,过程不再赘述。
2,在View类中找到CMainFrame::PreCreateWindow函数,在其中设置默认窗口大小为400 pixel*300 pixel:
1 BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs)
2 {
3 // TODO: 在此处通过修改
4 // CREATESTRUCT cs 来修改窗口类或样式
5 cs.cx=400;
6 cs.cy=300;
7 return CView::PreCreateWindow(cs);
8 }
3,给CTestView在类向导里面,给WM_PAINT添加OnPaint()处理程序:
void CCausalityInterfaceView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CView::OnPaint()
OnPrepareDC(&dc);
OnDraw(&dc);
CRect cr;//矩形结构
GetClientRect(&cr);//获得客户区窗口
int cx=cr.right;//右
int cy=cr.bottom;//底
dc.SetMapMode(MM_ISOTROPIC);//X=Y
dc.SetWindowExt(1000,1000);//设置逻辑窗口,默认窗口原点为(0,0)
dc.SetViewportExt(cx,-cy);//定义输出视口,X右Y上为正
dc.SetViewportOrg(cx/2,cy/2);//定义视口原点为客户区中心
dc.Ellipse(-500,500,500,-500);//绘制椭圆与客户区外切的椭圆
//绘制水平垂直的四条半径
dc.MoveTo(0,0); dc.LineTo(500,0);
dc.MoveTo(0,0); dc.LineTo(-500,0);
dc.MoveTo(0,0); dc.LineTo(0,500);
dc.MoveTo(0,0); dc.LineTo(0,-500);
//执行F5进行Debug,在底端Output窗口中可以观察ClientRect
TRACE( "ClientRect.x = %d, ClientRect.y = %d\n", cx, cy );
}
MM_ISOTROPIC:逻辑单位被映射为具有等刻度轴的任意单位:x轴上的一个单位等于y轴上的一个单位。
SetWindowExt(int cx, int cy): cx表示水平方向逻辑坐标的范围,cy表示垂直方向逻辑坐标的范围,
当改变窗口的大小时,以窗口的宽度或高度较小的方向为标准,比较下面两个图
图(1)和图(2)为运行结果,改变窗口大小时的结果。无论怎么改变大小,客户区内始终显示的是一个圆,不会变成椭圆。
当宽度>高度时,高度(y方向)达到1000的逻辑范围,所以宽度(x方向)的逻辑范围超过1000,
当宽度<高度时,宽度(x方向)达到1000的逻辑范围,所以高度(y方向)的逻辑范围超过1000.
将dc.SetWindowExt(1000,1000);改为:dc.SetWindowExt(1000,500);会出现如下情况:
将模式改为MM_ANISOTROPIC:逻辑单位被转换为任意单位,其中轴可以被随意缩放。客户区的圆会根据窗口的大小变为椭圆:
4,当进行如下设置时:
dc.SetMapMode(MM_ISOTROPIC);//X=Y
dc.SetWindowExt(1000,1000);//设置逻辑窗口,默认窗口原点为(0,0)
dc.SetViewportExt(500,-600);
dc.SetViewportOrg(cx/2,cy/2);//定义视口原点为客户区中心
客户区的圆的大小不会随客户区改变,原因是逻辑单位 与 像素的映射已经固定,根据圆的半径的逻辑单位得出圆占多少像素,而像素是固定的,所以圆的大小不在改变。
设置为:
dc.SetMapMode(MM_ANISOTROPIC);//X!=Y
dc.SetWindowExt(1000,1000);//设置逻辑窗口,默认窗口原点为(0,0)
dc.SetViewportExt(500,-600);
dc.SetViewportOrg(cx/2,cy/2);//定义视口原点为客户区中心
MFC 绘制坐标系的更多相关文章
- 【MFC】MFC绘制动态曲线,用双缓冲绘图技术防闪烁
摘自:http://zhy1987819.blog.163.com/blog/static/841427882011614103454335/ MFC绘制动态曲线,用双缓冲绘图技术防闪烁 2011 ...
- MFC绘制直角坐标系
void CMyPicoTestDlg::DrawWave(CDC *pDC,CRect &rectPicture) { CPen newPen; //用于创建新画笔 CPen *pOldPe ...
- MFC绘制图片闪烁详解
用MFC如何高效地绘图 显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题. 而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案. MFC的 ...
- [js高手之路]html5 canvas教程 - 1px问题以及绘制坐标系网格
在canvas中,要画出1px的线条,默认情况下是不行的 context.beginPath(); context.moveTo( 100, 100 ); context.lineTo( 400, 1 ...
- MFC绘制直方图和饼图
转载原文: Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNorma ...
- [转载] MFC绘制动态曲线,用双缓冲绘图技术防闪烁
转载的原文地址 先上效果图 随着时间的推移,曲线向右平移,同时X轴的时间坐标跟着更新. 一.如何绘制动态曲线 所谓动画,都是一帧一帧的图像连续呈现在用户面前形成的.所以如果你掌握了如何绘制静态曲线,那 ...
- MFC绘制棋盘格
(1)新建立一个MFC空白的基于视类的工程 (2)在View类中重写OnPaint消息 void CMy005View::OnPaint() { CPaintDC dc(this); // devic ...
- MFC改变坐标系
1.在MainFrm中的PreCreateWindow中设置默认窗口大小 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !C ...
- ios 绘图,绘制坐标系,画坐标系
先来看个效果: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...
随机推荐
- 如何监控 Log4j2 异步日志遇到写入瓶颈
如何监控 Log4j2 异步日志遇到写入瓶颈 在之前的一篇文章中(一次鞭辟入里的 Log4j2 异步日志输出阻塞问题的定位),我们详细分析了一个经典的 Log4j2 异步日志阻塞问题的定位,主要原因还 ...
- Linux虚拟机与主机网络连接配置与文件传输
网络配置 对于VMware虚拟机 1. 设置linux系统的网络配置,如下(NAT为默认配置,这里采用这一配置) 2. 主机中配置本地连接-属性-共享-勾选红框配置项,如下: 3.重启虚拟机. ...
- 搭建NodeJS开发环境
Windows10下搭建NodeJS开发环境 ======================================== 下载 NodeJS 安装包,最好使用LTS长期支持正式版 下载见 如下链 ...
- Python实用案例,Python脚本,Python实现帮你选择双色球号码
往期回顾 Python实现自动监测Github项目并打开网页 Python实现文件自动归类 前言: 今天我们就利用python脚本实现帮你选择双色球号码.直接开整~ 开发工具: python版本: 3 ...
- [CTF] CTF入门指南
CTF入门指南 何为CTF ? CTF(Capture The Flag)夺旗比赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式.CTF起源于1996年DEFCON全球黑客大会 ...
- OpenFaaS实战之六:of-watchdog(为性能而生)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Spring Boot核心技术之Rest映射以及源码的分析
Spring Boot核心技术之Rest映射以及源码的分析 该博客主要是Rest映射以及源码的分析,主要是思路的学习.SpringBoot版本:2.4.9 环境的搭建 主要分两部分: Index.ht ...
- RAID磁盘阵列和RAID配置
目录 一.RAID磁盘阵列介绍 二.RAID磁盘阵列分类 2.1.RAID 0(条带化存储) 2.2.RAID 1(镜像存储) 2.3.RAID 5 2.4.RAID 6 2.5.RAID 1+0和0 ...
- linux笔记1(不全,无图版)随笔
1.ls 查看当前目录下的所有内容 黑色的是文件,蓝色的是文件夹,也就是目录 2.rm -f anaconda-ks. cfg 彻底删除文件(如不确定,则需要先保存备份,也就是快照) 3.ifconf ...
- SVG和Canvas的区别?
什么是SVG? SVG(可缩放矢量图形)编辑可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式.它由万维网联盟制定,是一个开放标准. 什么是 Canvas ...