座標系統 對映模式

2021-06-20 09:35:44 字數 2841 閱讀 8164

三種座標系統:

螢幕座標

全視窗座標

客戶區座標

clienttoscreen 把客戶區座標轉換到螢幕座標

screentoclient 把螢幕座標轉換到客戶區座標

getwindowrect 以螢幕座標形式獲取整個視窗的位置和大小

getclientrect (hwnd, &rect);

dptolp (hdc hdc, point * ppoints, int inumber);  多個裝置點轉換為邏輯點 

lptodp (hdc hdc, point * ppoints, int inumber);  多個邏輯點轉換為裝置點 

對映模式

mm_text   預設

mm_lometric

0.1mm

0.00394 in.

mm_himetric

0.01mm

0.000394 in.

mm_hienglish

0.001 in.

0.0254 mm

mm_loenglish

0.01 in.

0.254 mm

mm_twips

1/1440 in.

0.0174 mm

mm_isotropic

任意(x=y)

mm_anisotropic

任意(x!=y)

視窗原點(0,0)

可以改變

檢視原點(0,0)

可以改變

視窗範圍(?,?)

不可改變

檢視範圍(?,?)

不可改變

mm_text 對映模式下範圍全為 1

xviewport = (xwindow - xwinorg)* xviewext/xwinext + xvieworg

yviewport = (ywindow - ywinorg)* yviewext/ywinext + yvieworg

例如,在mm_loenglish 對映模式下,windows使用如下公式計算範圍

xviewext/xwinext = 0.01英吋中的水平畫素數

yviewext/ywinext = 0.01英吋中的垂直畫素數

5 種度量對映模式

當首次改變為 5 種對映模式之一時,座標系統 從左到右x正向,從上到下y負向,原點(0,0)

setmapmode (hdc, imapmode);

//設定對映模式

imapmode = getmapmode (hdc);

//獲得對映模式

設定完後可用 setviewportorgex() 改變邏輯點

但使用 setwindoworgex() 改變邏輯點時由於引數必須為邏輯座標,需要用 dptolp函式把(cxclient,cyclient)轉換為邏輯座標

但windows對所有的非gdi函式,都繼續使用裝置座標,如wm_move、wm_size、wm_mousemove

可以把對映模式理解為裝置環境的一種屬性,因此,只有使用以裝置環境控制代碼作為引數的gdi函式時,對映模式才會有效

但儘管getdevicecaps是需要環境控制代碼的gdi函式,但windows繼續為horzers和vertres索引返回裝置單位(畫素)

gettextmetrics是邏輯單位

setviewportorgex (x,y)

改變視口原點  邏輯點(0,0)對映到設定點(裝置)

setwindoworgex (x,y)

改變視窗原點  設定的邏輯點被對映到裝置點(0,0)

getviewportorgex (hdc, &pt);

以裝置座標形式給出

getwindoworgex (hdc, &pt);

以邏輯座標形式給出

自定義的對映模式

mm_isotropic

各向同性,同比例縮放兩個座標軸,半受限,會調整以便同比例

mm_anisotropic

各向異性,不受限制,windows不會調整它們的值

第一次設定對映模式為mm_isotropic 時,windows 使用與mm_lometric 對映模式相同的視窗和視口範圍。可以用

setwindowextex()

setviewportextex()  

引數設定為客戶區的實際高度和寬度

來改變範圍,之後windows會調整範圍以使兩個軸邏輯單位表示相同的物理距離,調整時,它必須讓邏輯視窗可以容納再對應的物理視口之內,這就可能導致一部分的客戶區落在邏輯視窗之外

setmapmode (hdc, mm_isotropic);  

setwindowextex (hdc, 100, 100, null);    每英吋邏輯單位的個數

setviewportextex (hdc, cxclient, -cyclient, null);  每英吋物理單位(畫素)的個數

setviewportorgex (hdc, 0, cyclient, null);

getwindowextex (hdc, &lp);    lp是size結構

getviewportextex (hdc, &lp);

setmapmode (hdc, mm_anisotropic);  不鎖定範圍

第一次設定為此模式時,會繼承前面所設定的對映方式的範圍,方便改變模式,改變y軸方向的例子:

size size;

setmapmode (hdc, mm_text);

setmapmode (hdc, mm_anisotropic);

getviewportextex (hdc, &size);

setviewportextex (hdc, size.cx, -size.cy, null);

切換座標系對映模式

對映模式 int setmapmode hdc hdc,dc控制代碼 int fnmapmode 對映模式 fnmapmode 對映模式如下 mm text 預設,1個邏輯單位 1個畫素 x軸右軸為正,y軸下為正 mm hienglish 1個邏輯單位 0.001英吋 mm loenglish 1個...

座標空間和對映模式

座標空間 如下圖所示 開始空間 說明 頁面空間到裝置空間的轉換 四種裝置環境屬性 裝置空間,採用裝置座標 以下四個來說明視口與視窗的關係 圖1 圖2 圖3 圖4 視口 視窗 獲得視口和視窗原點 cdc中提供了兩個成員函式函式用來改變視口和視窗的原點 注意 不管對視窗和視口原點作什麼改變,裝置點 0,...

MFC 列印預覽 對映模式 座標變換

mfc提供了乙個框架性的列印和列印預覽功能 它的基本思想是將實際顯示和列印文件的 合二為一,即都由此文件關聯的cview中的ondraw cdc pdc 來處理,由mfc框架根據使用者的操作來決定傳進來的pdc是指向螢幕還是印表機,當pdc指向螢幕裝置,就在螢幕上顯示文件,當指向印表機裝置時就列印文...