GDI繪圖中的映射模式CDC::SetMapMode()


原文鏈接:http://blog.csdn.net/charlessimonyi/article/details/8264572

在GDI繪圖前,一般要設置映射模式。映射模式是什么呢?它是邏輯長度單位與實際長度單位的一中轉換關系,比如我要畫一個長為800單位,寬為600單位的矩形,那么在不同的映射模式下,一個單位可能相當於一個像素,也可能相當於一毫米,也可能相當於一微米。也就是說在有的映射模式下,我們指定的800單位的長度相當於800像素,在有的映射模式下,我們指定的800單位的長度相當於800毫米,等等…..

我們來看一下關於設置映射模式的CDC類的成員函數SetMapMode()在MSDN中的說明:

函數原型virtual int SetMapMode(int nMapMode);
返回值:上一個映射模式。
參數nMapMode 指定新的映射模式,可為下列值之一:

MM_ANISOTROPIC

把邏輯單位轉換為任意縮放軸上的任意單位。把映射模式設置為MM_ANISOTROPIC並不改變當前窗口或視圖端口的設置。要改變單位、方向和縮放,可調用SetViewportExt和SetWindowtExt成員函數。
MM_HIENGLISH 每一邏輯單位對換0.001英寸,X向右為正,Y向上為正。
MM_HIMETRIC 每一邏輯單位對換0.001毫米,X向右為正,Y向上為正。
MM_ISOTROPIC 邏輯單位轉換為帶有對等縮放軸的任意單位。即X軸1單位與Y軸1單位是相等的。可使用SetViewportExt和SetWindowtExt成員函數,指定需要的單位和軸的方向。GDI修正可以保證X、Y軸的尺寸是一致的。
MM_LOENGLISH 每一邏輯單位對換0.01英寸,X向右為正,Y向上為正。
MM_LOMETRIC 每一邏輯單位對換0.01毫米,X向右為正,Y向上為正。
MM_TEXT 每一邏輯單位對換1設備像素,X向右為正,Y向下為正。
MM_TWIPS 每一邏輯單位對換1/20個點(1點為1/72英寸,1twip為1/1440英寸)。X向右為正,Y向上為正。

如果我們不對映射模式進行設置,保持默認值的話,它默認的模式為MM_TEXT,即一個邏輯單位代表一個像素點,實際上這種模式並不常用。為什么呢?比如你的顯示器分辨率是1920*1080,你在你寫的程序中畫一個長為1024像素,寬為768像素的矩形,在你的屏幕上,這個矩形不大。但是當程序放在別人的電腦上運行時,可能別人的屏幕分辨率只有1024*768甚至800*600,那么你的這個矩形就無法很好的顯示。當然,你也可以在你的程序中加入一些算法,比如先獲取當前電腦顯示器的分辨率,再根據一系列算法來確定你要畫多少像素長、多少像素寬的矩形,這雖然可行,但是比較麻煩。所以我們在繪圖前,一般要設置映射模式。

在這么多的模式中,其實我們最常用的是兩個自定義的模式,MM_ISOTROPIC(各向同性)和MM_ANISOTROPIC(各向異性)模式。MM_ISOTROPIC模式中,橫縱縮放比例是相同的,在這個模式下,我們畫一個長300寬300的矩形,由於橫縱縮放比例是相同的,300單位的長一定等於300單位的寬,這意味着它肯定是一個正方形。但是在MM_ANISOTROPIC模式下,由於可以將橫縱縮放比例設置為不同,當我們再畫一個長300寬300的矩形時,由於橫縱比例不同,比如300單位的長對應着300像素,而300單位的寬對應着300毫米,所以這個矩形不一定是正方形。這一點大家可以動手測試。

現在我們來看一段繪圖代碼:

CClientDC dc(this);
CRect rect;
GetClientRect(&rect);
dc.SetMapMode(MM_ANISOTROPIC);
dc.SetWindowExt(500,500);
dc.SetViewportExt(rect.Width(),rect.Height());
dc.Rectangle(100,100,400,400);

第一行,創建一個CClientDC對象,該類用於在程序客戶區繪圖。

第二、三行,創建一個矩形對象,並獲取程序的矩形客戶區的尺寸信息保存到矩形對象中。

第四行,設置映射模式為MM_ANISOTROPIC模式,該模式下繪圖,橫縱縮放比不同。

當我們使用了這個模式后,我們要自己來定義這個縮放的比例,所以在第五行和第六行用SetWindowExt和SetViewportExt函數來設置,SetWindowExt的參數這里我們設置為500和500,意味着我們把客戶區的長規定為500單位,寬規定為500單位。SetViewportExt的參數我們設置為rect的寬度和rect的高度,由於rect保存着的是我們的程序的客戶區這個矩形的信息,這里給它的寬度和高度,即為我們程序客戶區的實際寬度和高度。

最后一行畫一個矩形,100,100代表着矩形左上角點的坐標,400,400代表着矩形右下角的坐標。注意,我們的程序的客戶區的左上角坐標為(0,0),那么可以想象我們的這個矩形在我們500*500的客戶區是什么樣的了。我們畫的這個矩形長為300單位,寬為300單位。300*300你感覺是個正方形,但我們用的是橫縱縮放比不同的映射模式,我們知道我們的程序窗口都是長方形的,長和寬不相等,而我們把它的長和寬都規定為500,那么他們的縮放比例肯定不同。所以我們畫出來的300*300的矩形也不是正方形,而是和我們的窗口一樣的長方形。如果我們在程序的OnPaint()函數中繪制此矩形的話,拉伸程序窗口,我們會發現我們畫的矩形的形狀隨着窗口的形狀改變而改變。如果使用橫縱縮放比相同的MM_ISOTROPIC映射模式,無論我們怎樣拉伸程序窗口,我們畫的圖形始終是一個正方形。它的長寬比例總保持一致。

如果你不太理解可以動手試一試,學編程就應該多動手,多試試。

在我們以后的GDI繪圖程序中該如何選用這兩種模式呢?這樣說吧,如果你希望你畫的圖形無論如何都能保持它的形狀,特別是在畫正方形和圓形的時候,就用MM_ISOTROPIC映射模式。如果你希望你的圖形能夠根據窗口的比例情況或者說窗口的拉伸情況而改變它的形狀的話,就用MM_ANISOTROPIC映射模式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM