对SetViewportOrg和SetWindowOrg的理解
对SetViewportOrg和SetWindowOrg的理解:
void CMainWindow::OnLButtonDown(UINT nFlags,CPoint point)
{
CRect rect;
GetClientRect(&rect);
CClientDC dc(this);
dc.SetViewportOrg(0,rect.Height());//把原点移至视口的左下角
dc.Rectangle(0,0,200,-200);
dc.SetViewportOrg(rect.Width(),rect.Height());//把原点移至视口的右下角
dc.Rectangle(0,0,-200,-200);
dc.SetViewportOrg(rect.Width(),0);//把原点移至视口的右上角
dc.Rectangle(0,0,-200,200);
dc.SetViewportOrg(0,0);//移回原来的位置
dc.Rectangle(0,0,200,200);
}
由于SetViewportOrg的参数是设备坐标,与逻辑坐标无关,所以当它移动坐标轴时与上一次的坐标轴的位置无
关的,并且GetClientDC获得的是设备坐标,更加可以相信它每一次设置的坐标的正确性,它的主要作用是:将原点
(左上角)移至参数指定的点.
至于SetWindowOrg是采用逻辑坐标进行设置坐标原点的,它可以在对应的逻辑映射模式下进行设置原点,除了
默认的坐标系是原点在左上角,向为正,向右为正外,其它非自定义模式都是原点在左上角,向下为负,向右为正的,
和我们数学的二维坐标系一样,为了更好的体现出SetWindowOrg我将窗口分别变成我们数学上四个像限!它的
作用是这样的:有一点point1,先将它从设备坐标变成该映射模式下的逻辑坐标(注意:一般设备坐标点是+,+ 逻辑
坐标转换后是+,-的,由映射模式决定),然后它移动它的奇对称点使得坐标系跟着移动,当它的奇对称点到达原点
时,原来的原点就到达point1的位置!(SetWindowOrg的参数就是point1的奇对称点)
CRect rect;
GetClientRect(&rect);
没设置前已经是第四象限了!
第一象限:
CClientDC dc(this);
dc.SetMapMode(MM_LOENGLISH);
CPoint point1(0,rect.Height());//把原点移到左下角
dc.DPtoLP(&point1);//先将设备坐标变成逻辑坐标!SetWindowOrg要求的!
dc.SetWindowOrg(-point1.x,-point1.y);//两个负号取奇对称点!移对称点使得整个坐标跟着移使对称点移到原点
CRect rect1(0,0,200,200);
dc.Rectangle(&rect1);
第二象限:
CClientDC dc(this);
dc.SetMapMode(MM_LOENGLISH);
CPoint point1(rect.Width(),rect.Height());//把原点移到右下角
dc.DPtoLP(&point1);//逻辑坐标是相对于MM_LOENGLISH进行转换的,得到的坐标肯定是(+,-)
dc.SetWindowOrg(-point1.x,-point1.y);
dc.Rectangle(0,0,-200,200);
第三象限:
CClientDC dc(this);
dc.SetMapMode(MM_LOENGLISH);
CPoint point1(rect.Width(),0);//把原点移到右上角
dc.DPtoLP(&point1);
dc.SetWindowOrg(-point1.x,-point1.y);
dc.Rectangle(0,0,-200,-200);
上面的SetWindowOrg分开画的,我要的效果是要像上面的SetViewportOrg这样连着画:
其实在移完一个原点后,把原点移回(0,0)再移过就可以做到了:(第四象限忽略)
CRect rect;
GetClientRect(&rect);
int width=rect.Width();
int height=rect.Height();
CClientDC dc(this);
dc.SetMapMode(MM_LOENGLISH);
CPoint point1(0,height);
dc.DPtoLP(&point1);
dc.SetWindowOrg(-point1.x,-point1.y);
CRect rect1(0,0,200,200);
dc.Rectangle(&rect1);
dc.SetWindowOrg(0,0);
point1=CPoint(width,height);
dc.DPtoLP(&point1);
dc.SetWindowOrg(-point1.x,-point1.y);
dc.Rectangle(0,0,-200,200);
dc.SetWindowOrg(0,0);
point1=CPoint(width,0);
dc.DPtoLP(&point1);
dc.SetWindowOrg(-point1.x,-point1.y);
dc.Rectangle(0,0,-200,-200);
如果我中间没有用dc.SetWindowOrg(0,0);就要思考了!
CClientDC dc(this);
dc.SetMapMode(MM_LOENGLISH);
CPoint point1(0,height);
dc.DPtoLP(&point1);
dc.SetWindowOrg(-point1.x,-point1.y);
CRect rect1(0,0,200,200);
dc.Rectangle(&rect1);
//先明确上一步我们的坐标原点在左下角,要把原点移到右下角,此时右下角相对当时的坐标系是(width,0)
point1=CPoint(width,0);//移至(width,0)
dc.DPtoLP(&point1);//变换成为逻辑坐标,但符号变为(+,-),因为在MM_LOENGLISH映射模式下
dc.SetWindowOrg(-point1.x,point1.y);//(width,0)为(+,0)则它的对称点应为(-,0)才对,
//只要将point1前一个变号即可,第二个为0不用变!
dc.Rectangle(0,0,-200,200);
//先明确上一步我们的坐标原点在右下角,要把原点移到右上角,此时右上角相对当时的坐标系是(0,height)
point1=CPoint(0,height);//移至(0,height)
dc.DPtoLP(&point1);//变换成为逻辑坐标,但符号变为(+,-),因为在MM_LOENGLISH映射模式下
dc.SetWindowOrg(point1.x,point1.y);//(0,height)为(0,+)则它的对称点应为(0,-)才对,和逻辑坐标同号,不用变!
dc.Rectangle(0,0,-200,-200);
可以看出SetWindowOrg每一次执行都改变一次坐标系的位置!!
对SetViewportOrg和SetWindowOrg的理解相关推荐
- 图形学Bresenham
1 Bresenham直线 1.1 起始条件 终点坐标 起始点坐标 通过终点坐标和起始点坐标可以得到直线方程: KaTeX parse error: Undefined control sequenc ...
- vc++图形编程基础
1.2.2构造和析构CDC对象 void CMyView::MyFunction() {....... CRect rect; CClientDC dc(this); dc.GetClipBox(re ...
- 孙鑫-MFC笔记六--绘图,重绘
Windows颜色对话框功能的添加: MFC提供了CColorDialog类,方便创建颜色对话框. CColorDialog dlg: dlg.DoModal(); 默认为黑色.即首参为值为0. 保存 ...
- GDI函数 坐标系综述
笔者采用Visual C++6.0开发图形数据支持系统,其中的难点正在于理解坐标系统的含义.各种映射模式的意义以及与逻辑坐标的转换.下面分几个部分逐一进行论述: 一 坐标系统概述 众所 ...
- vc++ 读书笔记(摘抄)
『VC++技术内幕』(第四版)读书笔记 关键字:VC++ 原作者姓名:loose_went 文章原出处:vczx.com 写在前面: 站长所看的『VC++技术内幕』版本为--潘爱民和王国印译清华大学出 ...
- 关于“视口”与“窗口”
http://hi.baidu.com/juery/blog/item/affcd76274545bc9e7113ad1.html 最近遇到"视口"与"窗口"的 ...
- 世界坐标系空间,页面空间,设备空间,物理设备空间
2019独角兽企业重金招聘Python工程师标准>>> 一.坐标空间 1.Win32应用程序设计接口(API)使用四种坐标空间:世界坐标系空间.页面空间.设备空间和物理设备空间.应用 ...
- Windows影射模式
Windows默认的是MM_TEXT图形影射模式.当打印机与屏幕每页容纳相素数目不同时,如果在MM_TEXT模式下处理图形就会出现问题. 映射模式中又可分成以下3类: 1. MM_TEXT映射模式这种 ...
- MFC GDI 图形设备接口函数
图形设备接口 图形设备接口(Graphics Device Interface) MFC的四种DC 常用函数 库存的GDI对象: RGB和YUV颜色空间 CColorDialog 颜色选择通用对话框 ...
最新文章
- 深入全面阐释Struts 2的方方面面
- iOS7以下设备获取mac地址
- Linux下的硬链接和软链接
- ZooKeeper官方文档资源
- SAP 电商云 Spartacus UI 4.1 版本的延迟加载技术介绍
- 两种实现简单cp的方法
- JS判断字符串包含的方法
- 计算机电路基础实验一仪器使用,计算机电路基础(1)实验.pdf
- opera5.6安装完成
- SingBoot集成JPA时单元测试报错:could not initialize proxy - no Session
- HDU2030-汉字机内码
- hammerJs-v2.0.4详解
- wince驱动加载失败
- 如何使用计算机上合并计算方法,excel如何使用合并计算
- PC分享插件js - sosh.min.js
- 织梦php模板在哪个文件夹,织梦模板如何修改默认templets模板文件夹名称的方法...
- python中search、findall、finditer的区别
- oracle增加列 reorg,Reorg rebuild 重建表和表上的索引
- uniapp:版本更新(打包wgt)
- python和Excel培训
热门文章
- 移动互联环境下的流程管理
- 大学生如何让自己的简历闪闪放光?
- Android: RecyclerView.ViewHolder、Adapter
- WARN [com.mchange.v2.async.ThreadPoolAsynchronousRunner] - com.mchange.v2.as
- 成功解决SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 0-1: malformed
- ML之NB:利用朴素贝叶斯NB算法(CountVectorizer+不去除停用词)对fetch_20newsgroups数据集(20类新闻文本)进行分类预测、评估
- Py之reprint:reprint的简介、安装、使用方法之详细攻略
- 在Python中使用lightgbm
- 发表国外期刊注意事项
- ARIMA模型详细讲解