主要讨论映射模式: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 绘制坐标系的更多相关文章

  1. 【MFC】MFC绘制动态曲线,用双缓冲绘图技术防闪烁

    摘自:http://zhy1987819.blog.163.com/blog/static/841427882011614103454335/ MFC绘制动态曲线,用双缓冲绘图技术防闪烁   2011 ...

  2. MFC绘制直角坐标系

    void CMyPicoTestDlg::DrawWave(CDC *pDC,CRect &rectPicture) { CPen newPen; //用于创建新画笔 CPen *pOldPe ...

  3. MFC绘制图片闪烁详解

    用MFC如何高效地绘图             显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题.     而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案.     MFC的 ...

  4. [js高手之路]html5 canvas教程 - 1px问题以及绘制坐标系网格

    在canvas中,要画出1px的线条,默认情况下是不行的 context.beginPath(); context.moveTo( 100, 100 ); context.lineTo( 400, 1 ...

  5. MFC绘制直方图和饼图

    转载原文: Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNorma ...

  6. [转载] MFC绘制动态曲线,用双缓冲绘图技术防闪烁

    转载的原文地址 先上效果图 随着时间的推移,曲线向右平移,同时X轴的时间坐标跟着更新. 一.如何绘制动态曲线 所谓动画,都是一帧一帧的图像连续呈现在用户面前形成的.所以如果你掌握了如何绘制静态曲线,那 ...

  7. MFC绘制棋盘格

    (1)新建立一个MFC空白的基于视类的工程 (2)在View类中重写OnPaint消息 void CMy005View::OnPaint() { CPaintDC dc(this); // devic ...

  8. MFC改变坐标系

    1.在MainFrm中的PreCreateWindow中设置默认窗口大小 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !C ...

  9. ios 绘图,绘制坐标系,画坐标系

    先来看个效果: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...

随机推荐

  1. centos7下安装、配置Nginx、设置Nginx开机自启动

    测试环境: [root@centos-linux ~]# cat /etc/redhat-releaseCentOS Linux release 7.6.1810 (Core) [root@cento ...

  2. POJ3190 - 优先队列 贪心

    POJ3190 将所有牛从小到大排序然后用优先队列(小根堆)依次记录插入的牛的结束时间,如果插入牛时起始时间大于首元素,ans不增加并弹出首元素. 挺简单的.那么为什么我会写(水)这篇博客呢? #in ...

  3. spring boot+mybatis plus出现Invalid bound statement (not found)

    qlSessionFactory不要使用原生的,请使用MybatisSqlSessionFactory

  4. vue3.0使用ant-design-vue进行按需加载原来这么简单

    下载 ui库 yarn add ant-design-vue 默认是全局引入,打包后体积很大, 非常影响首屏加载速度, 按需加载 下载按需加载的插件;推荐使用cnpm cnpm install bab ...

  5. XIN队算法

    XIN队算法 注:名称由莫队算法改编而来 从luogu搬过来了... \(newly\;upd:2021.7.8\) \(newly\;upd:2021.6.6\) OI至高算法,只要XIN队算法打满 ...

  6. RegOpenKeyEx

    对注册表的操作是通过句柄来完成的,在对某个键下的键值进行操作的时候首先将该键进行打开,然后使用键句柄进行引用该键,操作完后要进行关闭: 注册键的根键不需要打开,他们的句柄是固定的,直接拿来用就是了. ...

  7. 构建后端第2篇之---springb @ComponentScan注解使用

    张艳涛写于2021-2-8日 构建后端项目的时候遇到一个问题,在zyt-auth项目的依赖定义了@Component类,这个类在项目启动的时候提示没有找到bean Field tokenService ...

  8. OOP-Klass模型 简略

    class Model { public static int a = 1; public int b; public Model(int b) { this.b = b; } } public st ...

  9. switch-case例题

    根据订单的状态码打印对应的汉字状态(使用switch-case)1-等待付款 2-等待发货 3-运输中 4-已签收 5-已取消 其它-无法追踪 var n='2' switch(n){ case 1: ...

  10. vsftpd安装配置

    vsftpd安装配置 vsftpd测试服务器: 192.168.1.191 1.安装: yum provides */vsftpd yum install vsftpd -y 2.匿名用户最基本配置( ...