VC中座標系的建立

2021-04-27 16:09:56 字數 3497 閱讀 4105

建立乙個合適的 座標系可以為我們的繪圖帶來很大的方便 。下面介紹一下如何在vc中建立我們想要的座標系。

一 裝置座標和邏輯座標

裝置座標(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軸向上為正。

mm_loenglish、mm_hienglish、mm_lometric、mm_himetric、mm_twips這一組是windows提供的重要的固定比例對映模式。 

它們都是x值向右方向遞增,y值向下遞減,並且無法改變。它們之間的區別在於比例因子見下:(我想書上p53頁肯定是印錯了,因為通過程式實驗x值向右方向也是遞增的) 

mm_loenglish 0.01英吋 

mm_hienglish 0.001英吋 

mm_lometric 0.1mm 

mm_himetric 0.01mm 

mm_twips 1/1440英吋 //應用於印表機,乙個twip相當於1/20磅,一磅又相當於1/72英吋。

在vc裡, 準確的說是在windows程式設計中,對映模式有:mm_text,(裝置座標)

mm_himetric,(邏輯座標)

mm_isotropic,mm_anisotropic,.....在的開發環境下,(windows 預設的模式是mm_text),我們可以通過setmapmode()來改變當是的對映模式~

mm_text :x向右方向遞增加,y向下方向遞增加,我們可以通過setviewportorg()和setwindoworg()來改變座標原點的位置.

void cinside_vcview::ondraw(cdc* pdc)

固定比例模式:x向右方向遞減(我認為是增加),y向下方向遞減,mm_loenglish(0.01英吋) mm_hienglish(0.001英吋) mm_lometric(0.1mm) mm_himetric(0.01mm) mm_twips(1/1400英吋,一般用於印表機)

可變比例模式:m_isotropic(1:1),mm_anisotropic(可為任意比例),用setwindow***t() 和setviewportext()來設定比例,

void cinside_vcview::ondraw(cdc* pdc)

物理座標,即我們現實中的尺寸,螢幕中一英吋是現實中的12英吋,如果我們使用mm_loenglish(0.01英吋)的對映模式,那麼26.75英吋將是電腦的26.75/12=2.23(英吋),在電腦裡1個邏輯單位是0.01英吋,所以,26.75英吋轉換為邏輯單位是223單位,但是這過程中有省略,為了防止這樣的情況,我們可以使用物理座標儲存。

轉換函式;dptolp() 裝置座標到邏輯座標; lptodp()邏輯座標到裝置座標;物理座標到邏輯座標的轉換全是由我們自己計算;

mfc 中一般情況下有下面的情況:

cdc類中的所有成員函式用的是邏輯座標做引數

cwnd類中的所有成員函式用的是裝置座標做引數

所有的選中-測試(hit-test)操作都是用的裝置座標,有些函式只能使用裝置座標如:crect::ptinrect()

所有要長期儲存的值一般用邏輯座標,用裝置座標則使用者對視窗滾動就會改變,該座標就會失效了;

下一例子,測試滑鼠左鍵點的區域是不是在指定的地方

void cmyview::onlbuttondown(uint uflags,cpoint point)

一般設定對映模式在onpreparedc() 中比較合適~,onpreparedc在ondraw前呼叫!

mfc 對140 種windows 訊息提供了直接的訊息控制函式,特別注意下面5個:wm_create,wm_close,wm_destroy,wm_ncdestroy,wm_queryendsession.

wm_creates 是windows 傳送給檢視的第乙個訊息,所以在oncreate()中不能呼叫那寫依賴視窗完全處於啟用的windows函式!,一般來說可以在 oninitialupdate()中呼叫,如:設定對映模式~,但是必須注意,oninitialupdate()在檢視生存之間可能被呼叫多次~

詳析VC中座標系的建立

詳析vc中座標系的建立 建立乙個合適的 座標系可以為我們的繪圖帶來很大的方便 下面介紹一下如何在vc中建立我們想要的座標系。一 裝置座標和邏輯座標 裝置座標 device coordinate 又稱為物理座標 physical coordinate 是指輸出裝置上的座標。通常將螢幕上的裝置座標稱為螢...

VC中座標系的建立 邏輯座標,物理座標,裝置座標

建立乙個合適的座標系可以為我們的繪圖帶來很大的方便。下面介紹一下如何在vc中建立我們想要的座標系。一 裝置座標和邏輯座標 裝置座標 device coordinate 又稱為物理座標 physical coordinate 是指輸出裝置上的座標。通常將螢幕上的裝置座標稱為螢幕座標。裝置座標用物件距離...

建立座標系

3d圖形中的兩種投影 正投影和透視投影 正投影 glfrustum setorthographic glfloat xmin,glfoloat xmax,glfloat ymin,glfloat ymax,glfloat zmin,glfloat zmax 透視投影 glfrustum setpre...