对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的理解相关推荐

  1. 图形学Bresenham

    1 Bresenham直线 1.1 起始条件 终点坐标 起始点坐标 通过终点坐标和起始点坐标可以得到直线方程: KaTeX parse error: Undefined control sequenc ...

  2. vc++图形编程基础

    1.2.2构造和析构CDC对象 void CMyView::MyFunction() {....... CRect rect; CClientDC dc(this); dc.GetClipBox(re ...

  3. 孙鑫-MFC笔记六--绘图,重绘

    Windows颜色对话框功能的添加: MFC提供了CColorDialog类,方便创建颜色对话框. CColorDialog dlg: dlg.DoModal(); 默认为黑色.即首参为值为0. 保存 ...

  4. GDI函数 坐标系综述

    笔者采用Visual C++6.0开发图形数据支持系统,其中的难点正在于理解坐标系统的含义.各种映射模式的意义以及与逻辑坐标的转换.下面分几个部分逐一进行论述:     一 坐标系统概述     众所 ...

  5. vc++ 读书笔记(摘抄)

    『VC++技术内幕』(第四版)读书笔记 关键字:VC++ 原作者姓名:loose_went 文章原出处:vczx.com 写在前面: 站长所看的『VC++技术内幕』版本为--潘爱民和王国印译清华大学出 ...

  6. 关于“视口”与“窗口”

    http://hi.baidu.com/juery/blog/item/affcd76274545bc9e7113ad1.html 最近遇到"视口"与"窗口"的 ...

  7. 世界坐标系空间,页面空间,设备空间,物理设备空间

    2019独角兽企业重金招聘Python工程师标准>>> 一.坐标空间 1.Win32应用程序设计接口(API)使用四种坐标空间:世界坐标系空间.页面空间.设备空间和物理设备空间.应用 ...

  8. Windows影射模式

    Windows默认的是MM_TEXT图形影射模式.当打印机与屏幕每页容纳相素数目不同时,如果在MM_TEXT模式下处理图形就会出现问题. 映射模式中又可分成以下3类: 1. MM_TEXT映射模式这种 ...

  9. MFC GDI 图形设备接口函数

    图形设备接口 图形设备接口(Graphics Device Interface) MFC的四种DC 常用函数 库存的GDI对象: RGB和YUV颜色空间 CColorDialog 颜色选择通用对话框 ...

最新文章

  1. 深入全面阐释Struts 2的方方面面
  2. iOS7以下设备获取mac地址
  3. Linux下的硬链接和软链接
  4. ZooKeeper官方文档资源
  5. SAP 电商云 Spartacus UI 4.1 版本的延迟加载技术介绍
  6. 两种实现简单cp的方法
  7. JS判断字符串包含的方法
  8. 计算机电路基础实验一仪器使用,计算机电路基础(1)实验.pdf
  9. opera5.6安装完成
  10. SingBoot集成JPA时单元测试报错:could not initialize proxy - no Session
  11. HDU2030-汉字机内码
  12. hammerJs-v2.0.4详解
  13. wince驱动加载失败
  14. 如何使用计算机上合并计算方法,excel如何使用合并计算
  15. PC分享插件js - sosh.min.js
  16. 织梦php模板在哪个文件夹,织梦模板如何修改默认templets模板文件夹名称的方法...
  17. python中search、findall、finditer的区别
  18. oracle增加列 reorg,Reorg rebuild 重建表和表上的索引
  19. uniapp:版本更新(打包wgt)
  20. python和Excel培训

热门文章

  1. 移动互联环境下的流程管理
  2. 大学生如何让自己的简历闪闪放光?
  3. Android: RecyclerView.ViewHolder、Adapter
  4. WARN [com.mchange.v2.async.ThreadPoolAsynchronousRunner] - com.mchange.v2.as
  5. 成功解决SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 0-1: malformed
  6. ML之NB:利用朴素贝叶斯NB算法(CountVectorizer+不去除停用词)对fetch_20newsgroups数据集(20类新闻文本)进行分类预测、评估
  7. Py之reprint:reprint的简介、安装、使用方法之详细攻略
  8. 在Python中使用lightgbm
  9. 发表国外期刊注意事项
  10. ARIMA模型详细讲解