基於VC 的GDI常用座標系統及應用 1

2021-06-03 05:07:57 字數 1777 閱讀 8282

(在windows應用程式中,只要進行繪圖,就要使用gdi座標系統。windows提供了幾種對映方式,每一種對映都對應著一種座標系。例如,繪製圖形時,必須給出圖形各個點在客戶區的位置,其位置用x 和y兩個座標表示,x 表示橫座標,y表示縱座標。在所有的gdi繪製函式中,這些座標使用的是一種「邏輯單位」。當gdi函式將結果輸出送到某個物理裝置上時,windows將邏輯座標轉換成裝置座標(如螢幕或印表機的畫素點)。本文討論了圖形環境中的各個對映模式,包括它們是什麼,怎麼工作的,以及它們真正的含義。

一、基礎知識

(一)邏輯座標。邏輯座標與裝置無關,預設地,乙個邏輯單位等於裝置中的乙個象素。它是實現「所見即所得」的基礎。例如,當程式設計師呼叫lineto函式繪製25.4mm(1 英 寸) 長的直線時,他只要使用合適的對映模式,那麼就並不需要考慮輸出的是何種裝置。若裝置是vga顯示器,windows自動將其轉化為96個畫素點;若裝置是乙個300dpi的雷射印表機,windows自動將其轉化為300 個畫素點。 

(二)裝置座標。圖形輸出時,windows將gdi函式中指定的邏輯座標對映為裝置座標,在所有的裝置座標系統中,單位以畫素點為準,水平值從左到右增大(正方向向右),垂直值從上到下增大(正方向向下)。windows中包括以下3 種裝置座標,以滿足各種不同需要: 

1、客戶區域座標,包括應用程式的客戶區域,客戶區域的左上角為(0, 0)。 

2、螢幕座標,包括整個螢幕,螢幕的左上角為(0, 0)。螢幕座標用在wm_move訊息中(對於非子視窗)以及下面的windows 函式中:createwindow 和movewindow(都對於非子視窗)、getmessage、getcursorpos、getwindowrect、windowfrompoint 和setbrushorg 中。 用函式clienttoscreen 和screentoclient可以將客戶區域座標轉換成螢幕區域座標,或反之。 

3、全視窗座標,包括乙個程式的整個視窗,包括標題條、選單、滾動條和視窗框,視窗的左上角為(0,0)。使用getwindowdc得到的視窗裝置環境,可以將邏輯單位轉換成視窗」座標。  

(三)對映。對映方式定義了windows如何將gdi函式中指定的邏輯座標對映為裝置座標。在下文中我們將介紹常用的對映方式。

此外,習慣上,我們將邏輯座標所在的座標系稱為「視窗」;將裝置座標所在的座標系稱為「視口」。「視窗」依賴於邏輯座標,可以是畫素點、公釐或其他尺度。這一點請牢記,這對於下面的有關內容的理解至關重要。

二、預設的座標系統

當在微軟的視窗中進行繪圖時,繪圖的座標原點在螢幕的左上角,任何物體在螢幕上定位都要參考這個座標原點。在笛卡爾座標系統中這個點被定義為座標原點(0,0),水平座標軸的正方向是從該點出發向右延伸,垂直座標軸的正方向是從該點出發向下延伸。

圖一、笛卡爾座標系

這個座標原點只是作業系統預設的座標原點,所以如果你呼叫ellipse(-100, -100, 100, 100)函式來繪製圖形的話,你將得到乙個圓,它的圓心位於螢幕的左上角,僅僅只有圓的四分之一部分(270度到360度的部分)顯示在螢幕上。**及效果圖如下 

void cexodraw1view::onpaint() 

二、**效果圖

按照同樣的原理,你可以使用cpaintdc的方法或按照你的要求建立函式來繪製任何幾何或非幾何圖形。例如,下面的**繪製了兩條相互垂直的直線,垂點位與視窗的中心:

void cexodraw1view::onpaint()  

三、**效果圖

基於VC 的GDI常用座標系統及應用

為了靈活使用邏輯座標系,下面給出了幾個例子 例1 繪製帶箭頭的座標軸 void cexodraw1view onpaint 圖二十二 效果圖 例2 繪製網格 void cexodraw1view onpaint for int y 0 y 圖二十 三 效果圖 例3 點狀網格 void cexodra...

基於VC 的OpenGL程式設計講座之座標變換 3

四 視口變換。視口變換就是將視景體內投影的物體顯示在二維的視口平面上。運用相機模擬方式,我們很容易理解視口變換就是類似於 的放大與縮小。在計算機圖形學中,它的定義是將經過幾何變換 投影變換和裁剪變換後的物體顯示於螢幕視窗內指定的區域內,這個區域通常為矩形,稱為視口。opengl中相關函式是 glvi...

vc6 0下的GDI 設定及精彩例項

2.在你將要使用gdi 的工程中,完成初始化工作 在stdafx.h中加入 define ulong ptr unsigned long include using namespace gdiplus include gdiplus.h ulong ptr m gdiplustoken 須以成員變數...