只要區(qū)分 設(shè)備坐標(biāo),、邏輯坐標(biāo) 就可以了,窗口中的每個(gè)點(diǎn)都對(duì)應(yīng)一個(gè)設(shè)備
坐標(biāo)和一個(gè)邏輯坐標(biāo),。 可相互轉(zhuǎn)化,, 拿窗口來(lái)說(shuō),設(shè)備坐標(biāo)就是窗口可見(jiàn)部分的坐標(biāo)系,。
譬如說(shuō)你用鼠標(biāo)在屏幕上的某個(gè)位置點(diǎn)一下,,他會(huì)有一個(gè)設(shè)備坐標(biāo),你拉
動(dòng)VScroll或HScroll,,再在相同的位置點(diǎn)一下,,它還是產(chǎn)生那個(gè)設(shè)備坐標(biāo),
而這時(shí)它的邏輯坐標(biāo)已經(jīng)變了,。
因?yàn)橄鄬?duì)于可見(jiàn)部分的窗口來(lái)說(shuō),,他們是同一個(gè)點(diǎn)。而相對(duì)于Document來(lái)說(shuō),,他們不是同一個(gè)點(diǎn),。Understand?
希望我的描述對(duì)你理解有點(diǎn)幫助。
在Windows中,,文檔坐標(biāo)系稱作邏輯坐標(biāo)系,,視圖坐標(biāo)系稱為設(shè)備坐標(biāo)系。
邏輯坐標(biāo)按照坐標(biāo)設(shè)置方式(又成為映射模式)可分為8種,,它們?cè)谧鴺?biāo)上的特性如下表所示:
表7-1 各種映射模式下的坐標(biāo)轉(zhuǎn)換方式
映射模式 邏輯單位 x遞增方向
y遞增方向
MM_TEXT 像素 向右
向下
MM_LOMETRIC 0.1mm 向右
向上
MM_HIMETRIC 0.01mm 向右
向上
MM_LOENGLISH 0.01inch 向右
向上
MM_HIENGLISH 0.001inch 向右
向上
MM_TWIPS 1/1440inch 向右
向上
MM_ISOTROPIC 可調(diào)整 (x=y) 可選擇
可選擇
MM_ANISOTROPIC 可調(diào)整(x!=y) 可選擇
可選擇
我們一般使用的映射模式是MM_TEXT,,它也是缺省設(shè)置。在該模式下,,坐標(biāo)原點(diǎn)在工作區(qū)左上角,,而x坐標(biāo)值是向右遞增,,y坐標(biāo)值是向下遞增,單位值1代表一個(gè)像素,。
設(shè)備坐標(biāo)以像素點(diǎn)為單位,,且x軸坐標(biāo)值向右遞增,y軸坐標(biāo)值向下遞增,,但原點(diǎn)(0,0)位置卻不限定在工作區(qū)的左上角,。依據(jù)設(shè)備坐標(biāo)的原點(diǎn)和用途,可以將Windows下使用的設(shè)備坐標(biāo)系統(tǒng)分為三種:工作區(qū)坐標(biāo)系統(tǒng),,窗口坐標(biāo)系統(tǒng)和屏幕坐標(biāo)系統(tǒng),。
(1)工作區(qū)坐標(biāo)系統(tǒng):
工作區(qū)坐標(biāo)系統(tǒng)是最常見(jiàn)的坐標(biāo)系統(tǒng),它以窗口客戶區(qū)左上角為原點(diǎn)(0,0),,主要用于窗口客戶區(qū)繪圖輸出以及處理窗口的一些消息,。鼠標(biāo)消息WM_LBUTTONDOWN、WM_MOUSEMOVE傳給框架的消息參數(shù)以及CDC一些用于繪圖的成員都是使用工作區(qū)坐標(biāo),。
(2)屏幕坐標(biāo)系統(tǒng):
屏幕坐標(biāo)系統(tǒng)是另一類常用的坐標(biāo)系統(tǒng),以屏幕左上角為原點(diǎn)(0,0),。以CreateDC(“DISPLAY” , ...)或GetDC(NULL)取得設(shè)備上下文時(shí),,該上下文使用的坐標(biāo)系就是屏幕坐標(biāo)系。
一些與窗口的工作區(qū)不相關(guān)的函數(shù)都是以屏幕坐標(biāo)為單位,,例如設(shè)置和取得光標(biāo)位置的函數(shù)SetCursorPos()和GetCursorPos(),;由于光標(biāo)可以在任何一個(gè)窗口之間移動(dòng),它不屬于任何一個(gè)單一的窗口,,因此使用屏幕坐標(biāo),。彈出式菜單使用的也是屏幕坐標(biāo)。另外,,CreateWindow,、MoveWindow、SetWindowPlacement()等函數(shù)用于設(shè)置窗口相對(duì)于屏幕的位置,,使用的也是屏幕坐標(biāo)系統(tǒng),。
(3)窗口坐標(biāo)系統(tǒng):
窗口坐標(biāo)系統(tǒng)以窗口左上角為坐標(biāo)原點(diǎn),它包含了窗口控制菜單、標(biāo)題欄等內(nèi)容,。一般情況下很少在窗口標(biāo)題欄上繪圖,,因此這種坐標(biāo)系統(tǒng)很少使用。
另外:
視圖中利用的是影射方式 MM_ANISOTROPIC,,現(xiàn)在想把鼠標(biāo)所在的點(diǎn)的坐標(biāo)利用邏輯坐標(biāo)給標(biāo)出來(lái),,利用ScreenToClient()
setwindowExt()
setviewportExt()
setwindowOrg()
setviewportorg() 的區(qū)別:
SetViewportExt和SetWindowExt用來(lái)確定邏輯坐標(biāo)下和設(shè)備坐標(biāo)下的尺寸對(duì)應(yīng)關(guān)系
SetWindowExt(int Lwidth, int Lheight)
//window的寬(高)度,參數(shù)的單位為邏輯單位(Logical),如果參數(shù)為負(fù)值表示window相應(yīng)的坐標(biāo)軸與page空間相反,。
SetViewportExt(int Pwidth, int Pheight)
//viewport的寬(高)度,參數(shù)的單位為像素(Pixel),,如果參數(shù)為負(fù)值表示viewport相應(yīng)的坐標(biāo)軸與device空間相反。
SetWindowOrg(int Lx, int Ly)
//設(shè)置邏輯坐標(biāo)的坐標(biāo)原點(diǎn) 此處原文由錯(cuò)誤
SetViewportOrg(int Px, int Py)
//設(shè)置設(shè)備坐標(biāo)的坐標(biāo)原點(diǎn) 此處原文由錯(cuò)誤
所謂設(shè)備坐標(biāo)與邏輯坐標(biāo)只是相對(duì)的概念。
比如點(diǎn)pt(1000,1000),如果你認(rèn)為他是
設(shè)備坐標(biāo),,那么經(jīng)過(guò)下變換,,他就變成邏輯
坐標(biāo):
dc.DPtoLP(&pt);
如果你認(rèn)為他是
邏輯坐標(biāo),那么經(jīng)過(guò)下變換,,他就變成設(shè)備坐標(biāo):
dc.DPtoLP(&pt);
是設(shè)備坐標(biāo)還是邏輯坐標(biāo),,與DC的影射模式(MapMode)
無(wú)關(guān),任何影射模式都有設(shè)備坐標(biāo)與邏輯坐標(biāo),。其中,,設(shè)備坐標(biāo)
是統(tǒng)一的的,即都是指設(shè)備象素坐標(biāo),。
CRect并無(wú)設(shè)備坐標(biāo)或邏輯坐標(biāo)之分,,關(guān)鍵在于你怎么認(rèn)為它和怎么用它。
一般dc所接受的參數(shù)是邏輯坐標(biāo),,窗口函數(shù)都是接受設(shè)備坐標(biāo),。
所以不管是否用了DPtoLP或LPtoDP,Rectangle()所用參數(shù)它都認(rèn)為是邏輯坐標(biāo),。