国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
理解SetMapMode,SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt

CDC::SetMapMode 

virtual int SetMapMode( int nMapMode );

函數(shù)功能描述:該函數(shù)設(shè)置指定設(shè)備環(huán)境的映射方式,映射方式定義了將邏輯單位轉(zhuǎn)換為設(shè)備單位的度量單位,并定義了設(shè)備的XY軸的方向。

nMapMode:指定新的映射方式,此參數(shù)可以是下面列出的任何一個值。

  MM_ANISOTROPIC:邏輯單位轉(zhuǎn)換成具有任意比例軸的任意單位,用SetWindowExtExSetViewportExtEx函數(shù)可指定單位、方向和比例。

  MM_HIENGLISH:每個邏輯單位轉(zhuǎn)換為0.001英寸,X的正方面向右,Y的正方向向上。

  MM_HIMETRIC:每個邏輯單位轉(zhuǎn)換為0.01毫米,X正方向向右,Y的正方向向上。

  MM_ISOTROPIC:邏輯單位轉(zhuǎn)換成具有均等比例軸的任意單位,即沿X軸的一個單位等于沿Y軸的一個單位,用和函數(shù)可以指定該軸的單位和方向。圖形設(shè)備界面(GDI)需要進(jìn)行調(diào)整,以保證XY的單位保持相同大?。ó?dāng)設(shè)置窗口范圍時,視口將被調(diào)整以達(dá)到單位大小相同)。

  MM_LOENGLISH:每個邏輯單位轉(zhuǎn)換為0.1英寸,X正方向向右,Y正方向向上。

  MM_LOMETRIC:每個邏輯單位轉(zhuǎn)換為0.1毫米,X正方向向右,Y正方向向上。

  MM_TEXT:每個邏輯單位轉(zhuǎn)換為一個圖素,X正方向向右,Y正方向向下。

MM_TWIPS;每個邏輯單位轉(zhuǎn)換為打印點(diǎn)的120(即11400英寸),X正方向向右,Y方向向上。

 

備注:

MM_TEXT方式允許應(yīng)用程序以設(shè)備像素為單位來工作,像素的大小根據(jù)設(shè)備不同而不同。MM_HIENLISH, MM_HIMETRIC, MM_LOENGLISH, MM_LOMETRICMM_TWIPS方式對必須用物理意義單位(如英寸或毫米)制圖的應(yīng)用程序是非常有用的。MM_ISOTROPIC方式保證了11的縱橫比。MM_HIENLISH方式允許對XY坐標(biāo)分別進(jìn)行調(diào)整。

 

按習(xí)慣,(0,0)就原點(diǎn),原點(diǎn)就是(0,0),但是如果用此來理解windows的map mode,就會走彎路。其實(shí),稍微改變一下觀念,windows的map mode就比較好理解了。舉例說明:

page space---->device space
pDC->SetMapMode(MM_LOMETRIC);
pDC->SetWindowOrg(40,0);  //這句“設(shè)定”page space的原點(diǎn)為(40,0),注意,
//這時(40,0)就是原點(diǎn),原點(diǎn)就是(40,0)這個點(diǎn),其實(shí),(0,0)與原點(diǎn)沒有必然聯(lián)系。這
//一句對下面的畫圖函數(shù)在page space中所作的圖不會有任何影響。一句話:SetWindowOrg
//就是指定一下,page space中哪個點(diǎn)為原點(diǎn)。
pDC->Rectangle(0,0,100,-100);
pDC->Rectangle(0,-100,50,-200);

同理,SetViewportOrg也是指定一下,device space中哪個點(diǎn)為原點(diǎn),兩個坐標(biāo)系映射時,兩個原點(diǎn)重合

SetWindowExt設(shè)定page space的大小,SetViewportOrg設(shè)定device space的大小,其實(shí),真正有意義的只是兩者的比例關(guān)系,例如,在一個1024*768的顯示屏上:

pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(10240,7680);
pDC->SetViewportExt(1024,768);
pDC->Rectangle(0,0,100,100);//給出的是邏輯單位,但是具體繪制出來要轉(zhuǎn)化為設(shè)備單位,轉(zhuǎn)化比例由模式確定

  就會畫一個10 pixels*10 pixels的矩形。其本質(zhì)就是,X方向,每個邏輯單位有1024/10240個象素,Y方向每個邏輯單位有768/7680個象素。因此,下面的代碼有相同的作用:

pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(102400,76800);
pDC->SetViewportExt(10240,7680);
pDC->Rectangle(0,0,100,100);

兩者本質(zhì)一樣,前者更易于理解。
================================
 

SetWindowOrg和SetViewportOrg這兩個函數(shù)比較難搞懂,經(jīng)過本人的google和實(shí)踐終于弄明白了這兩個函數(shù)的本質(zhì)區(qū)別。

1.SetWindowOrg(x, y) 是把設(shè)備坐標(biāo)的原點(diǎn)(視口)映射到邏輯坐標(biāo)的(X, Y)處

2.SetViewportOrg(x, y) 是把邏輯坐標(biāo)的原點(diǎn)(窗口)映射到設(shè)備坐標(biāo)的(X, Y)處

3. 設(shè)備原點(diǎn)永遠(yuǎn)是客戶區(qū)的左上角頂點(diǎn)(upper left corner of the client area)。

(后面的一幅圖顯示了這兩個函數(shù)的意義)
注意設(shè)備坐標(biāo)和邏輯坐標(biāo)的區(qū)別:

1.設(shè)備坐標(biāo)的X, Y軸方向固定的,單位也是固定的,X軸向右遞增,Y向下遞增,單位都是像素。

2.邏輯坐標(biāo)的X, Y軸方向不固定,單位不固定,根據(jù)選擇的映射模式而變化

有了以上的解釋,相信大家應(yīng)該能明白為什么下面的代碼的現(xiàn)實(shí)結(jié)果會是這樣的了吧。

void CEx05aView::OnDraw(CDC* pDC)
{
pDC->SetMapMode(MM_LOMETRIC);
pDC->SetWindowOrg(100, 100);
pDC->Rectangle(0, 0, 200, 200);

pDC->SetViewportOrg(100, 100);
pDC->SelectStockObject(GRAY_BRUSH);
pDC->Rectangle(0, 0, 200, 200);
}

====================================================

建立一個合適的坐標(biāo)系可以為我們的繪圖帶來很大的方便 。下面介紹一下如何在VC中建立我們想要的坐標(biāo)系。
一 設(shè)備坐標(biāo)和邏輯坐標(biāo)
  設(shè)備坐標(biāo)(Device Coordinate)又稱為物理坐標(biāo)(Physical Coordinate),是指輸出設(shè)備上的坐標(biāo)。通常將屏幕上的設(shè)備坐標(biāo)稱為屏幕坐標(biāo)。設(shè)備坐標(biāo)用對象距離窗口左上角的水平距離和垂直距離來指定對象的位 置,是以像素為單位來表示的,設(shè)備坐標(biāo)的X軸向右為正,Y軸向下為正,坐標(biāo)原點(diǎn)位于窗口的左上角。
  邏輯坐標(biāo)(Logical Coordinate)是系統(tǒng)用作記錄的坐標(biāo)。在缺省的模式(MM_TEXT)下,邏輯坐標(biāo)的方向和單位與設(shè)備坐標(biāo)的方向和單位相同,也是以像素為單位來 表示的,X軸向右為正,Y軸向下為正,坐標(biāo)原點(diǎn)位于窗口的左上角。邏輯坐標(biāo)和設(shè)備坐標(biāo)即使在缺省模式下其數(shù)值也未必一致,除了在以下兩種情況下:
  1. 窗口為非滾動窗口
  2. 窗口為滾動窗口,但垂直滾動條位于滾動邊框的最上端,水平滾動條位于最左端,但如果移動了滾動條這兩種坐標(biāo)就不一致了。
  在VC中鼠標(biāo)坐標(biāo)的坐標(biāo)位置用設(shè)備坐標(biāo)表示,但所有GDI繪圖都用邏輯坐標(biāo)表示,所以用鼠標(biāo)繪圖時,那么必須將設(shè)備坐標(biāo)轉(zhuǎn)換為邏輯坐標(biāo),可以使用 CDC 函數(shù)DptoLP()將設(shè)備坐標(biāo)轉(zhuǎn)化為邏輯坐標(biāo),同樣可以用LptoDP()將邏輯坐標(biāo)轉(zhuǎn)化為設(shè)備坐標(biāo)。

二 坐標(biāo)模式
  為了在不同的領(lǐng)域使用邏輯坐標(biāo),Windows提供了以下8種坐標(biāo)模式:
  分別為MM_TEXT、MM_HIENGLISH、MM_LOENGLISH、MM_HIMETRIC、MM_LOMETRIC、MM_TWIPS、MM_ANISOTROPIC和MM_ISOTROPIC。

三 實(shí)例解析
 ?。ㄒ唬?建立以左上角為原點(diǎn),X軸和Y軸為1000的坐標(biāo),如下圖
  我們可以用以下代碼:
  void CTtView::OnDraw(CDC* pDC)
   {
    CTtDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    CRect rect;
    GetClientRect(&rect);

    pDC->SetMapMode(MM_ANISOTROPIC);
    pDC->SetViewportOrg(0,0);
    pDC->SetViewportExt(rect.right,rect.bottom);

    pDC->SetWindowOrg(0,0);
    pDC->SetWindowExt(1000,1000);

    pDC->MoveTo(50,50);
    pDC->LineTo(50,950);
    pDC->LineTo(950,950);
    pDC->LineTo(50,50);
   }
  代碼分析:
  1. GetClientRect(&rect); 取得客戶區(qū)矩形區(qū)域,將其存放在rect中
  2. 用pDC->SetMapMode(MM_ANISOTROPIC); 設(shè)置映射模式
  3. 通過pDC->SetViewportOrg(0,0);設(shè)置邏輯坐標(biāo)的原點(diǎn)。
  4. 通過pDC->SetViewportExt(rect.right,rect.bottom);和
pDC->SetWindowExt(1000,1000);來確定邏輯坐標(biāo)下和設(shè)備坐標(biāo)下的尺寸對應(yīng)關(guān)系
  5. 在MM_ANISOTROPIC模式下,X軸單位和Y軸單位可以不相同
  6. 坐標(biāo)方向的確定方法是如果邏輯窗范圍和視口范圍符號相同,則邏輯坐標(biāo)的方向和視口的方向相同,即X軸向右為正,Y軸向下為正。
  7. 如果將顯示模式改為MM_ISOTROPIC,那么X軸單位和Y軸單位一定相同,感興趣的讀者可以自己使一下。
 ?。ǘ?建立以視窗中心為原點(diǎn)的坐標(biāo),如下:
  用如下代碼:
  void CTtView::OnDraw(CDC* pDC)
   {
    CTtDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    CRect rect;
    GetClientRect(&rect);

    pDC->SetMapMode(MM_ANISOTROPIC);
    pDC->SetViewportOrg(rect.right/2,rect.bottom/2);
    pDC->SetViewportExt(rect.right,rect.bottom);

    pDC->SetWindowOrg(0,0);
    pDC->SetWindowExt(1000,-1000);

    pDC->MoveTo(150,150);
    pDC->LineTo(-150,-200);
    pDC->LineTo(150,-150);
    pDC->LineTo(150,150);
   }
 代碼分析:
  1. 用 pDC->SetViewportOrg(rect.right/2,rect.bottom/2); 設(shè)置視口的原點(diǎn)。
2. 用pDC->SetViewportExt(rect.right,rect.bottom);和pDC->SetWindowExt(1000,-1000);來確定設(shè)備坐標(biāo)和邏輯坐標(biāo)的單位對應(yīng)關(guān)系。
  3. 因?yàn)檫壿嫶胺秶鸵暱诜秶姆柌灰恢?,縱坐標(biāo)取反,所以Y軸向上為正。

MM_LOENGLISH、MM_HIENGLISH、MM_LOMETRIC、MM_HIMETRIC、MM_TWIPS這一組是Windows提供的重要的固定比例映射模式。

它們都是x值向右方向遞增,y值向下遞減,并且無法改變。它們之間的區(qū)別在于比例因子見下:(我想書上P53頁肯定是印錯了,因?yàn)橥ㄟ^程序?qū)嶒?yàn)x值向右方向也是遞增的)

MM_LOENGLISH 0.01英寸
MM_HIENGLISH 0.001英寸
MM_LOMETRIC 0.1mm
MM_HIMETRIC 0.01mm
MM_TWIPS 1/1440英寸 //應(yīng)用于打印機(jī),一個twip相當(dāng)于1/20磅,一磅又相當(dāng)于1/72英寸。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
VC中坐標(biāo)系的建立 zz
映射模式/視口(viewport)和窗口(window)
坐標(biāo)系統(tǒng)與坐標(biāo)變換
VC++技術(shù)內(nèi)幕(第四版)筆記
CDC::SetMapMode
Windows映射模式及相關(guān)問題的解決
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服