GDI 映射模式、映射比例和繪製原點問題
[編輯] [转简体] (简体译文)概要
解釋 SetWindowExtEx、SetViewportExtEx、SetWindowOrgEx、SetViewportOrgEx 一系列函數的用法。
正文
總而言之:
SetWindowExtEx 和 SetWindowOrgEx 的參數都採用邏輯單位,即 GDI 繪圖函數的座標參數所使用的單位。當映射模式設置爲 MM_TEXT 時,邏輯單位就是像素點。
SetViewportExtEx 和 SetViewportOrgEx 的參數都以像素爲單位(設備座標系)。SetViewportOrgEx 只是用於指定在繪製對象上的何處輸出繪製內容。
通過 SetWindowExtEx 和 SetViewportExtEx 兩個函數共同作用來設置邏輯座標系到設備座標系的映射比例關係(只是代表比例關係,不用於限制可繪製區域的範圍大小),例如:
dc.SetWindowExtEx(100, 100); dc.SetViewportExtEx(640, 480);
即是代表下圖:
如果將某個軸的映射比例設爲負數,則該軸正方向翻轉。
以下兩種寫法效果等同。
dc.SetWindowExtEx(100, -100); // 負號在此 dc.SetViewportExtEx(640, 480); | dc.SetWindowExtEx(100, 100); dc.SetViewportExtEx(640, -480); // 負號在此 |
對於這兩種寫法,我們可以都把它算作是將邏輯座標系的 y 軸進行了翻轉,而設備座標系永遠不變。
備註:
如果要實現座標軸翻轉,也可以通過設置映射模式實現(SetMapMode)。
列舉一些 SetMapMode 的參數:
MM_ANISOTROPIC [ˌænaɪsə'trɒpɪk] 各向異性模式,允許 X 軸和 Y 軸的縮放比例不同。
MM_ISOTROPIC 各向同性模式。
MM_LOENGLISH 使 y 軸正方向向上,且邏輯單位爲 0.01 英寸
MM_HIENGLISH 使 y 軸正方向向上,且邏輯單位爲 0.001 英寸
詳見 MSDN,模式不多,都很好懂。
SetViewportOrgEx 指定視口原點,即在設備座標系下的哪一點開始繪製。
SetWindowOrgEx 指定邏輯座標系下的哪一點映射到視口原點(若邏輯座標系經過翻轉,這裏用的就是翻轉後的邏輯座標系)。
備註:
這裏的 SetWindowOrgEx 和設置繪圖原點並不一樣,如果是設置繪圖原點,則傳入 SetWindowOrgEx 的座標均須乘以 -1。
上述所有函數的調用先後順序對最終結果都沒有影響。
補充:
SelectClipRgn 採用設備座標系。