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 ...
随机推荐
- java网络编程基础——TCP网络编程一
基于TCP协议的网络编程 TCP/IP协议是一种可靠的网络协议,它的通信的两端各自建立一个Socket,从而在通信的两端之间形成网络虚拟链路. Java使用Socket对象来代表两端的通信端口,并通过 ...
- 使用vue-preview报错Cannot read property 'open' of undefined
最近在做一个vue项目中时,需要使用vue-preview插件制作缩略图,首先在终端使用npm i vue-preview -S指令安装了vue-preview插件,然后在main.js中,导入并引用 ...
- 小程序框架WePY 从入门到放弃踩坑合集
小程序框架WePY 从入门到放弃踩坑合集 一点点介绍WePY 因为小程序的语法设计略迷, 所以x1 模块化起来并不方便, 所以x2 各厂就出了不少的框架用以方便小程序的开发, 腾讯看到别人家都出了框架 ...
- SAML 2.0简介(1)
1.什么是SAML: SAML是Web浏览器用来通过安全令牌启用单点登录(SSO)的标准协议 2.优点: 跨多个应用程序管理用户身份和授权. 3.单点登录(SSO)是什么: 它使用户仅使用一组凭据(用 ...
- [HNOI]2011卡农
这是一道很好的组合数学题. 对于和我一样五音里面有六音不全的人来说,我们就应该转换一下题目的意思: 一句话题意: 题目的意思就是说要从一个有 n 个元素的集合当中选出一个长度为m的集合,然后满足: 1 ...
- 构建后端第5篇之---Idea 查看继承 实现关系图
first question: how to show a class children class : move mousrmark to class name , Ctrl + H how t ...
- 论文笔记:(ICML2020)On Learning Sets of Symmetric Elements
目录 摘要 一.引言 二.先前的工作 三.基础 3.1 符号和基本定义 3.2 G-不变网络 3.3 描述等变层 3.4 Deep sets 四.DSS层 4.1 对称元素集合 4.2 等变层的表征 ...
- 自学linux——5.网络设置
网络设置 1.网卡配置文件位置:ls /etc/sysconfig/network-scripts/ 2.网卡配置文件命名:ifcfg-网卡名称 3.查看网卡配置文件:cat /etc/sysconf ...
- JUC学习笔记(六)
JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html JUC学习笔记(二)https://www.cnblogs.com/lm66/p/1511 ...
- Ubuntu开启SSH端口并且搭建Vulhub环境
1.下载好ubuntu.开启SSH: * sudo apt update * sudo apt install openssh-server * sudo systemctl status ssh 用 ...