OffsetWindowOrgEx - 移动窗口坐标原点

引用自:http://www.cnblogs.com/aoniao/archive/2012/06/18/2553762.html

在阅读学习Charles Petzold大牛名作《Programming Windows,5th Edition》过程中,对于第5章中讲解的SetWindowOrgEx与SetViewportOrgEx一直不明不白,文中所说的坐标系的移动之类更是弄得我一头雾水。阅读完该章节后,想想似乎只是明白了一点,再想想似乎只是更加糊涂一点。

在MM_TEXT映射模式下,假设cxClient和cyClient分别为客户区x轴和y轴的长度。

使用以下参数调用SetViewportOrgEx函数SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;则调用函数后,logical point(0,0)将映射到device point(cxClient/2, cyClient/2)。原来坐标系统系统(图一)将变为新的坐标系统(图二)。对于这点想想似乎明白。

                                 

图一                                                                     图二

使用以下参数调用SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ;则调用函数后,所得结果同上述调用SetViewportOrgEx 函数。坐标系的变换同图一坐标系统到图二坐标系统的变化。对于这点想想似乎糊涂。

引用《Programming Windows,5th Edition》书中第5章的一段

If you change the viewport origin to (xViewOrg, yViewOrg), the logical point (0, 0) will be mapped to the device point (xViewOrg, yViewOrg). If you change the window origin to (xWinOrg, yWinOrg), the logical point (xWinOrg, yWinOrg) will be mapped to the device point (0, 0), which is the upper left corner. Regardless of  any changes you make to the window and viewport origins, the device point (0, 0) is always the upper left corner of the client area.

这段话描述的是这两个函数的作用,读起来一知半解,或许个人的理解能力有待进一步提高吧。不理解,于是求助谷歌。原来不理解这两个函数的人不只是我一个人,很多人都已经讨论过,在博客上,在论坛上。浏览开始的一些讨论文章,情况还停留在即解却尚未解的状态。直到最后阅读了以下的一篇文章《SetViewportOrgEx与SetWindowOrgEx》,然后再在骑车回家的路上一想,恍然大悟,原来是可以这样简单的理解。

在《Programming Windows,5th Edition》书中第5章的The Viewport and the Window一节,讲解了何谓Viewport,何谓Window。因为没有自己的理解顿悟,接下来的SetViewportOrgEx和SetWindowOrgEx函数的迷惑也就理所当然。参考了“包子的小窝~~结庐在人境”的文章后,下面说下自己对于Viewport和 Window的理解:Viewport与屏幕设备相关,或者说同程序的客户区大小相关。在一应用程序当中,不管你调整程序的大小如何,你没有拖动滚动条所能完整看到的客户区内容的大小即是Viewport的大小。

Window与客户区内包含界面大小相关。在一应用程序当中,把滚动条从最左边拖动到最右边,从最上面个拖动到最下面,在这期间你所看到的客户区内全部内容的大小即是Window的大小。它们的关系就如同你从一扇可以平行移动的窗户观看外面的美丽风景。Viewport即是在这扇平行移动窗户静止时,你从这个窗口看出去所能看到的大小(类似滚动条静止你所看到整个客户区)。Window即是在这扇平行移动窗户从可以移动的初始位置移动到最终位置期间你所看到的大小(类似滚动条从左到右从上到下你所看到的内同)。

如果对于Viewport和Window这两个术语有了理解,理解SetViewPortOrgEx和SetWindowOrgEx函数也就顺理成章了。

不管是SetViewportOrgEx函数,还是SetWindowOrgEx函数,调用后的结果都是移动上面Viewport和Window所表示区域原点的相对位置。在MM_TEXT映射模式下,没有调用这两个函数前,Windows操作系统应用程序客户区所表示的Viewport和Window的原点(0,0)均位于客户区最左最顶一角。若调用SetViewportOrgEx函数,则移动Viewport所表示区域坐标系相对Window所表示区域坐标系统相应参数个长度距离。若调用SetWindowOrgEx函数,则移动Window所表示区域坐标系相对Viewport所表示区域坐标系统相应参数个长度距离。不知道大家是否回忆起小时候数学学习的坐标系统移动的经历。若使用正值作为参数移动某个坐标系统,则这个坐标系统相对另外的坐标系统将左移上移某个单位距离;若使用负值作为参数移动某个坐标系统,则这个坐标系统相对另外的坐标系统将右移下移某个单位距离。不管坐标系怎样移动,Window所对应的逻辑坐标系的原点都是固定不变,即你用相应的输出函数在相应的逻辑坐标系上输出的内容仍然是在原来的地方,只是相对于Viewport坐标系的移动,你所能看到的内容有所不同。

以下是根据我的理解调用相应函数的截图。

本程序在客户区输出左上角和右下角分别输出两个圆形(Viewport区域和Window区域一样大小),没调用SetViewportOrgEx函数和SetViewportOrgEx函数,截图如图三。

图三

调用SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);即是Viewport区域左移上移相应参数长度,于是看到将是原先左上角的圆形将在右下角出现,截图如图四。

图四

调用SetWindowOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);即是Window区域左移上移相应参数长度,于是看到的将是原右下角的圆形将在左上角出现,截图如图五

图五

(全文完)

下面引用自:http://hi.baidu.com/05104106/item/8df5b417f5b2d24be75e069c

GDI绘图中调整窗口与视口的坐标原点,相当于定位笛卡尔逻辑坐标系。

先说一下自己对窗口与视口的理解:

窗口(Window),是指整个程序界面,比如一个带滚动条IE浏览器中,页面内容很长,所有内容构成窗口;视口(Viewport),指的是当前屏幕看到的那一块,即滚动条所处的可见位置。

视口,与屏幕设备相关,用设备坐标;窗口,与设备无关,用逻辑坐标。TextOut等大部分GDI函数都用逻辑坐标。要讲的两个函数,作用即是两坐标的映射调整。

引用Charlez的《Windows程序设计》一下,有点晕:

如果将视口原点改变为(xViewOrg,yViewOrg),则逻辑点(0.0)就会映像为设备点(xViewOrg,yViewOrg)。如果将窗口原点改变为(xWinOrg,yWinOrg),则逻辑点(xWinOrg,yWinOrg)将会映像为设备点(0,0),即左上角。不管对窗口和视端口原点作什么改变,设备点(0,0)始终是显示区域的左上角。

这里,Set不是“设置”,而是“调整”。初始时,视口与窗口原点重合,都在左上角。都是“被调整主体”上移。

SetViewPortOrgEx(x,y) ——调整视口,令视口原点调整为现在的(x,y)

SetWindowOrgEx(x,y)   ——调整窗口,令窗口原点调整为现在的(x,y)

具体过程如文末图所示。

我们知道,原始坐标如左图所示,向下向右为正,如果想要变为右图所示,应如何调整?视口上调了,SetViewPortOrgEx(x,y);或者说窗口下调了,SetWindowOrgEx(-x,-y)。它们执行的是相反操作。

Win API函数SetWindowOrgEx与SetViewportOrgEx相关推荐

  1. c语言win api函数,Win2K下的Api函数的拦截

    这么多高手在这里,哎,小弟愿意向各位高手学习. Api拦截并不是一个新的技术,很多商业软件都采用这种技术.对windows的Api函数的拦截,不外乎两种方法,第一种是Mr. Jeffrey Richt ...

  2. Windows API函数大全

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

  3. win32 API函数大全

    [1]. API之网络函数  WNetAddConnection :创建同一个网络资源的永久性连接  WNetAddConnection2 :创建同一个网络资源的连接  WNetAddConnecti ...

  4. Delphi之API函数

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

  5. Windows API函数大全---附:windows运行命令详解

    1. API之网络函数             WNetAddConnection 创建同一个网络资源的永久性连接             WNetAddConnection2 创建同一个网络资源的连 ...

  6. MFC函数书本速查 API函数大全

    基础类 CObject AssertValid p3 Dump p3 IsSerializable p4 Serializable p4 GetRuntimeClass p4 IsKindOf p5 ...

  7. Windows API 函数大全

    Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数  WNetAddConnection 创建同一个网络资源的永久性连接  WNetAddConnection2 创建 ...

  8. Windows API函数大全(方便查找)

    Windows API函数大全 目录 Windows API函数大全 1. API之网络函数 2. API之消息函数 3. API之文件处理函数 4. API之打印函数 5. API之文本和字体函数 ...

  9. windows编程常用系统API函数

    windows编程常用API的函数 1. API之网络函数 2. API之消息函数 3. API之文件处理函数 4. API之打印函数 5. API之文本和字体函数 6. API之菜单函数 7. AP ...

最新文章

  1. 完成登录功能,用session记住用户名
  2. flex 引入css,Flex常用布局
  3. 用ASP创建MDaemon用户
  4. 前端学习(2153):Vue的终极解决方案
  5. ES6新特性_ES6迭代器应用-自定义遍历数据---JavaScript_ECMAScript_ES6-ES11新特性工作笔记019
  6. 重返opencv——视频编码和格式
  7. java ffmpeg amr mp3_使用ffmpeg实现 amr转mp3
  8. MATLAB 图像识别
  9. c语言编程悬臂梁受力分析,悬臂梁受力分析.doc
  10. 计算机新建文件的方法,电脑新建文件夹怎么弄,新建文件夹的方法有几种-
  11. 路过图床插件,支持一键上传返回各类链接
  12. CocosCreator开场CG动画制作
  13. dlopen failed: empty/missing DT_HASH in quot;libx.soquot; (built with --hash-style=gnu?)
  14. excel宏根据表格自动计算机,Excel使用宏录制自动将输入内容排到另一张表的操作方法...
  15. <笔记本电脑设备管理器检测不到触控板,电脑触控板失灵>
  16. 微信获取用户地理位置
  17. sqlite3 stmt 使用
  18. 阿里云FinalShell连接
  19. 百度网盘的探险:云存储如何逃离“德鲁克”困境
  20. 蓝牙/zigbee/nrr24xx

热门文章

  1. 138 条 Vim 命令神操作,非常齐全,建议收藏!
  2. 电商系统设计之商品(下)
  3. 操作系统:连续分配、分页和分段三种存储分配机制的优缺点
  4. Mon Nov 18 01:40:52 CST 2019 WARN: Establishing SSL connection without server's identity verificatio
  5. linux串口上网的简单实现,Linux串口上网的简单实现(3)
  6. BODY background=自适应大小_自适应(电脑/平板/手机)网页,自适应网页设计练习总结...
  7. java 修饰符 访问控制符_Java访问修饰符(访问控制符)
  8. 沉入海底2年的微软数据中心浮出水面:故障率只有陆地上的1/8,除了长点贝类和藻类完全没问题...
  9. 干粉灭火器的维护保养
  10. AI:2020年6月22日北京智源大会演讲分享之机器感知专题论坛—14:10-14:50王亮教授《面向复杂视觉任务的视觉认知计算》