螢幕座標系和視窗客戶區座標系最明顯的區別在於座標原點,螢幕座標系的座標原點在整個螢幕的左上角,而視窗客戶區座標系的座標原點在視窗客戶區的左上角,通常這兩個點是不重合的。
一 裝置座標和邏輯座標
裝置座標(device coordinate)又稱為物理座標(physical coordinate),是指輸出裝置上的座標。通常將螢幕上的裝置座標稱為螢幕座標。裝置座標用物件距離視窗左上角的水平距離和垂直距離來指定物件的位置,是以畫素為單位來表示的,裝置座標的x軸向右為正,y軸向下為正,座標原點位於視窗的左上角。
邏輯座標(logical coordinate)是系統用作記錄的座標。在預設的模式(mm_text)下,邏輯座標的方向和單位與裝置座標的方向和單位相同,也是以畫素為單位來表示的,x軸向右為正,y軸向下為正,座標原點位於視窗的左上角。邏輯座標和裝置座標即使在預設模式下其數值也未必一致,除了在以下兩種情況下:
1. 視窗為非滾動視窗
2. 視窗為滾動視窗,但垂直滾動條位於滾動邊框的最上端,水平滾動條位於最左端,但如果移動了滾動條這兩種座標就不一致了。
在vc中滑鼠座標的座標位置用裝置座標表示,但所有gdi繪圖都用邏
座標表示,所以用滑鼠繪圖時,那麼必須將裝置座標轉換為邏輯座標,可以使用cdc 函式dptolp()將裝置座標轉化為邏輯座標,同樣可以用lptodp()將邏輯座標轉化為裝置座標。
二 座標模式
為了在不同的領域使用邏輯座標,windows提供了以下8種座標模式:
分別為mm_text、mm_hienglish、mm_loenglish、mm_himetric、mm_lometric、mm_twips、mm_anisotropic和mm_isotropic。
三 例項解析
(一) 建立以左上角為原點,x軸和y軸為1000的座標,如下圖
我們可以用以下**:
void cttview::ondraw(cdc* pdc)
**分析:
1. getclientrect(&rect); 取得客戶區矩形區域,將其存放在rect中
2. 用pdc->setmapmode(mm_anisotropic); 設定對映模式
3. 通過pdc->setviewportorg(0,0);設定邏輯座標的原點
4. 通過pdc->setviewportext(rect.right,rect.bottom);和
pdc->setwindowext(1000,1000);來確定邏輯座標下和裝置座標下的尺寸對應關係
5. 在mm_anisotropic模式下,x軸單位和y軸單位可以不相同
6. 座標方向的確定方法是如果邏輯窗範圍和視口範圍符號相同,則邏輯座標的方向和視口的方向相同,即x軸向右為正,y軸向下為正。
7. 如果將顯示模式改為mm_isotropic,那麼x軸單位和y軸單位一定相同,感興趣的讀者可以自己使一下。
(二) 建立以視窗中心為原點的座標,如下圖
用如下**:
void cttview::ondraw(cdc* pdc)
**分析:
1. 用 pdc->setviewportorg(rect.right/2,rect.bottom/2); 設定視口的原點。
2. 用pdc->setviewportext(rect.right,rect.bottom);和pdc->setwindowext(1000,-1000);來確定裝置座標和邏輯座標的單位對應關係。
3. 因為邏輯窗範圍和視口範圍的符號不一致,縱座標取反,所以y軸向上為正。
螢幕座標 客戶區域(可視視窗)座標 頁面座標的區分
螢幕座標 可視視窗座標 頁面座標有時不能迅速的對應起來,為了更好的區分三者,特意畫了一張圖如下 顧名思義,即整個電腦螢幕上任意一點的位置座標,對應的屬性分別為screenx,screeny,範圍如上圖最外層紅色邊框範圍,座標為藍色虛線對應的座標。可以使用類似下面的 取得滑鼠事件的螢幕座標 var d...
螢幕座標 客戶區域(可視視窗)座標 頁面座標的區分
螢幕座標 可視視窗座標 頁面座標有時不能迅速的對應起來,為了更好的區分三者,特意畫了一張圖如下 顧名思義,即整個電腦螢幕上任意一點的位置座標,對應的屬性分別為screenx,screeny,範圍如上圖最外層紅色邊框範圍,座標為藍色虛線對應的座標。可以使用類似下面的 取得滑鼠事件的螢幕座標 var d...
螢幕座標 客戶區域(可視視窗)座標 頁面座標的區分
螢幕座標 可視視窗座標 頁面座標有時不能迅速的對應起來,為了更好的區分三者,特意畫了一張圖如下 顧名思義,即整個電腦螢幕上任意一點的位置座標,對應的屬性分別為screenx,screeny,範圍如上圖最外層紅色邊框範圍,座標為藍色虛線對應的座標。可以使用類似下面的 取得滑鼠事件的螢幕座標 var d...