<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:宋体; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->
SetWindowOrg SetViewportOrg DC 的坐标
SetWindowOrg SetViewportOrg , 在 显示器中的形象解释、验证,(打印机上未验证,也许不同,没有打印机所以暂时没有验证)
这里只是说一下原点坐标。在一个程序中遇到 DC 的坐标问题,也是一直没有搞明白。
这次在网上搜索,确实有几个帖子说的比较详细,但是还是不容易理解,不形象。所以细细的想了一下,并通过程序验证正确。形象具体的总结了一下:
有三个坐标系
1 、 世界坐标系,这个我们可以认为是固定不变的一个坐标系,一个网状的坐标格子,在最底层。 (该坐标在函数使用中没有涉及,但是一定有,帮助理解)。
2 、 设备坐标,也就是 viewport 坐标。这个就是图形设备,打印机什么的,可以想象为一张纸,用于绘图的纸张。 dc 的绘图动作, 使用的坐标就是相对该坐标的 ,这个很重要。
比如 dc.Rectangle(0, 0, 200, 200); 无论 viewport 原点在哪里, 该矩形都是 以 viewport 的原点 的 一个 200*200 的 dc.Rectangle;
比如 pDC->SetViewportOrg(100, 100);
pDC->Rectangle(0, 0, 200, 200);
该矩形还是在 viewport 中的 0, 0, 200, 200 。 但是 在世界坐标中,该矩形为 100 , 100 , 300 , 300 , 因为该矩形是相对 ViewportOrg 定位的坐标
无论 viewport 在哪里, window org 在哪里,最后绘制的图形可以在世界坐标中找到,而且位置都是确定的:通过 viewportorg 偏移找到。
3 、 窗口坐标, windoworg ,也是我们创建的窗口, 这个就是透过该坐标 我们看见的世界中的图形,你的照相机。也就是所有图形已经通过 2 中的坐标关系被绘制在世界坐标中,通过本规则移动一个窗口,移动到你想看的地方,然后世界坐标的景物就在你的窗口中了。就像一个照相机一样,随便怎么移动,只是景物在照相机中的位置变化,但是景物的在自然世界的位置是没有变化的。而移动相机和景物的位置就是相反的。比如你把相机左移动,景物就在你的相机中向右移动,反之亦然。
在 2 中 只是移动了 view port ,此时,窗口仍然在 0,0 所以看见的图形如下:矩形被绘制在了世界坐标的 100 , 100 处, 窗口(照相机)在世界坐标的 0 , 0 点。
现在移动窗口(你的照相机),到与 viewportorg 重合,则效果如下,透过窗口看,世界的景物到了窗口的左上角了。而移动窗口时,绘制在世界坐标中的景物位置没有变的。可以任意移动“照相机”,景物会在“照相机”中的位置发生相应变化
总结一下:图形绘制,坐标是相对 viewport 的坐标,但是图形绘制完毕,是固定在世界坐标不会改变的; window 窗口是你的照相机,移动窗口,景物会在照相机中发生变化。
这个是形象的解释了,没有量化的坐标换算,这个换算公式有很多介绍的,所以能形象了,公式就很好办了:)