惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Latest news
Latest news
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
L
Lohrmann on Cybersecurity
aimingoo的专栏
aimingoo的专栏
B
Blog
T
Threat Research - Cisco Blogs
罗磊的独立博客
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Proofpoint News Feed
P
Palo Alto Networks Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
T
Tor Project blog
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
Martin Fowler
Martin Fowler
酷 壳 – CoolShell
酷 壳 – CoolShell
Recorded Future
Recorded Future
D
DataBreaches.Net
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
B
Blog RSS Feed
Scott Helme
Scott Helme
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
A
Arctic Wolf
Help Net Security
Help Net Security
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Vercel News
Vercel News
AWS News Blog
AWS News Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Schneier on Security
Hacker News: Ask HN
Hacker News: Ask HN
N
Netflix TechBlog - Medium
L
LangChain Blog
博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
M
MIT News - Artificial intelligence
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
W
WeLiveSecurity

博客园 - finema

如何使用 RESTClient 调试微信支付接口 关于HTML使用ComDlg ActiveX 无法弹出相应对话框的问题1 JAX-WS 访问SSL 的WebService 老是HTTP transport error: Connection refused错误的解决办法。 [转]为什么开发人员工作10多年了还会迷茫?没有安全感? VC项目配置详解(转) 不使用动态sql语句,正确书写case when中的null处理 [转] 请不要做浮躁的嵌入式系统工程师 [转]一些Eclipse开发用到的快捷键 Tomcat 6.0.24 不兼容的APR版本问题 【转】看清自己究竟要什么 [转]7大原因,决定去留 [转]Android系统源代码情景分析:基础知识 关于iReport 导出文件的问题 谁是企业最需要的人(链接) IE 和 FireFox 对 DOM 支持的差异 【转】什么是AlphaBlend技术 软件开发精品教程或文章 【转】WinCE读写XML文件 WinCE 不支持 ON_WM_SHOWWINDOW 事件的变通处理
理解windows的移动原点
finema · 2011-05-30 · via 博客园 - finema

     估计很多人看了Jeff Prosise《MFC Windows程序设计》或 Charles Petzold《Programming Windows》,对于移动原点的描述会有点不好理解。以下是个人的整理,希望大家看了,能明白是怎么回事。

  造成不好理解的原因,我想是源自SetWindowOrg和SetViewportOrg的函数描述,

    SetWindowOrg: 移动窗口的原点

    SetViewportOrg: 移动视口的原点

  其实,用“窗口”和“视口”这两个名词,在这里用来理解移动原点的概念,会造成初学者理解上的混淆(Programming Windows》里也有提及)。对于大多数初学者来说对于窗口的理解就是我们在屏幕上所看到窗口,而SetWindowOrg 所说的窗口,其实跟我们平常所说窗口是两回事。还有不是有了窗口了吗,怎么还有一个视口呢?

  要解开这些疑惑,那么我们首先要摒弃窗口在我们原来脑海中的概念,然后理解坐标系统。一定要切记Windows操作系统有两套坐标系,一个是逻辑坐标,另一个是设备坐标。怎么理解这两个坐标系统?

       逻辑坐标,就理解成在某几何作业本上画的直角坐标系,坐标值可以是无限的,Windows的绘图基本上是以逻辑坐标作为参数的,也就是说Windows绘图是在逻辑平面上进行的。

       设备坐标,是物理的,就理解成你手上拿着一个方形的框框(如显示器),通过该方框可以看到逻辑坐标画的东西,设备坐标左上角的坐标永远是(0,0)。设备总是有尺寸的,只能显示某个范围的内容。

  默认情况,两个坐标系都是Y轴向下递增,X轴向右递增的,由于两者的原点是重合的,因此给了初学者的感觉Window只有1个坐标系,如图1。

      红色方框内,就是我们在设备能看到的内容,默认情况下,逻辑坐标系里-x,-y 的内容在设备上是看不到,图2显示了以下代码的效果

    CRect rect(-100,-100,100,100);
    dc.Rectangle(rect) ;
    dc.Ellipse(rect) ;

  那么我们怎么才能显示出(-x,-y)的内容呢,使用移动原点是其中一种方法。以下2个函数重新进行了说明,更容易大家理解。

  SetWindowOrg: 移动逻辑坐标的原点,即通知操作系统,把逻辑点(x,y)映射成设备点(0,0),

  SetViewportOrg: 移动设备坐标的原点,即通知操作系统把 设备点(x,y)映射成逻辑点(0,0),更通俗的讲 显示设备(x,y)点显示的是 逻辑坐标点(0,0)的内容。

  两个的函数所要实现的功能是一样的(注意x,y参数的正负),个人觉得SetViewportOrg 相对好理解一下。

     用其中一个函数设定原点后,操作系统在绘图时会自动进行坐标转换,显示出需要的内容。

以下代码演示了居中显示,(-x,-y)的内容可以看到了,其2个坐标系也画了出来,如图3

  CPaintDC dc(this);

  CRect rect;
  GetClientRect(&rect);  //返回以设备单位表示的窗口尺寸(即像素)
  CPoint point(rect.Width()/2,rect.Height()/2);

  dc.SetViewportOrg(point);

  CRect rect2(-100,-100,100,100);
  dc.Rectangle(rect2) ;
  dc.Ellipse(rect2) ;

记住:设备坐标的左上角永远是(0,0)见上图红色标识的O‘,我们在屏幕上看到的实际是设备坐标与逻辑坐标映射后的结果。

参考:

《MFC Windows程序设计》

《Programming Windows》

http://blog.csdn.net/benny5609/archive/2007/10/26/1845645.aspx