資源描述:
《vc窗視口坐標(biāo)轉(zhuǎn)換》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、VC窗視口坐標(biāo)轉(zhuǎn)換在做繪圖程序的時(shí)候,對(duì)于坐標(biāo)映射方式的理解很困難,經(jīng)過不斷的找資料,了解,最后總結(jié),以供大家了解。首先需要了解窗口和視口的概念。窗口是指一個(gè)虛擬存在的屏幕,而視口是在屏幕上看到的視圖客戶區(qū)域。Windows繪圖時(shí),并不是把圖形直接繪制到屏幕上去,而是以各種方式下的坐標(biāo)系將圖形繪制到序幕的窗口中,然后將這個(gè)窗口的內(nèi)容映射到視口中,如果映射到屏幕,就實(shí)現(xiàn)了圖形的顯示,如果映射到打印機(jī),就實(shí)現(xiàn)了圖形的打印。視口原點(diǎn)與窗口原點(diǎn)不同,他們指同一個(gè)點(diǎn)在窗口邏輯坐標(biāo)系和視口設(shè)備坐標(biāo)系的坐標(biāo)值。它決定圖形由窗
2、口到視口時(shí)的相對(duì)位置。邏輯坐標(biāo)就是內(nèi)存中虛擬的坐標(biāo),可以理解為看不見的。而設(shè)備坐標(biāo)就是跟具體的設(shè)備相聯(lián)系的坐標(biāo)系統(tǒng),如:顯示器和打印機(jī)等。不同的映射模式?jīng)Q定了設(shè)備坐標(biāo)和邏輯坐標(biāo)之間的轉(zhuǎn)換關(guān)系,也就是兩種坐標(biāo)系統(tǒng)在相互轉(zhuǎn)換時(shí),邏輯??單位和設(shè)備單位之間的某種比例關(guān)系。舉個(gè)例子,一個(gè)圖用的是邏輯坐標(biāo),當(dāng)它映射到視口時(shí),在視口中的坐標(biāo)單位已經(jīng)不再是原來的邏輯單位(不同方式,單位不一,MM_LOMETRC方式,單位0.1mmm)。而視口的坐標(biāo)單位是像素。它們之間存在一個(gè)轉(zhuǎn)換關(guān)系。在Windows應(yīng)用程序設(shè)計(jì)中,文檔坐標(biāo)
3、系稱作邏輯坐標(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.001i
4、nch?向右???向上?????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è)像素。在此模式下,邏輯坐標(biāo)是像素坐標(biāo),方向也與視口中的方向相同。如果此時(shí)窗口原點(diǎn)與視口原點(diǎn)相同,在圖形映射時(shí),
5、將原封不動(dòng)的由窗口映射到視口。??????????視口設(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)是最常見的坐標(biāo)系統(tǒng),它以窗口客戶區(qū)左上角為原點(diǎn)(0,0),主要用于窗口客戶區(qū)繪圖輸出以及處理窗口的一些消息。鼠標(biāo)消息WM_LBUTTONDOWN、WM_MOUSEMOVE傳給
6、框架的消息參數(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è)單一的窗口,因
7、此使用屏幕坐標(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)很少使用。??????????對(duì)于所有映射模式,Windows都用下面兩個(gè)公式將窗口坐標(biāo)轉(zhuǎn)換成視口坐標(biāo):??????xViewport=(xWindow-
8、xWinOrg)*(xViewExt/xWinExt)+xViewOrg??????yViewport=(yWindow-yWinOrg)*(yViewExt/yWinExt)+yViewOrg??????其中,(xWindow,yWindows)是待轉(zhuǎn)換的邏輯點(diǎn),(xViewport,yViewport)是轉(zhuǎn)換后的設(shè)備點(diǎn)。如果設(shè)備坐標(biāo)是客戶區(qū)域坐標(biāo)或全窗口坐標(biāo),則Windows在畫一