青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

道。道。道

安全特性不等于安全的特性

   :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理

常用鏈接

搜索

  •  

最新評(píng)論

  在Windows應(yīng)用程序中,只要進(jìn)行繪圖,就要使用GDI坐標(biāo)系統(tǒng)。Windows提供了幾種映射方式,每一種映射都對(duì)應(yīng)著一種坐標(biāo)系。例如,繪制圖形時(shí),必須給出圖形各個(gè)點(diǎn)在客戶區(qū)的位置,其位置用x 和y兩個(gè)坐標(biāo)表示,x 表示橫坐標(biāo),y表示縱坐標(biāo)。在所有的GDI繪制函數(shù)中,這些坐標(biāo)使用的是一種“邏輯單位”。當(dāng)GDI函數(shù)將結(jié)果輸出送到某個(gè)物理設(shè)備上時(shí),Windows將邏輯坐標(biāo)轉(zhuǎn)換成設(shè)備坐標(biāo)(如屏幕或打印機(jī)的像素點(diǎn))。本文討論了圖形環(huán)境中的各個(gè)映射模式,包括它們是什么,怎么工作的,以及它們真正的含義。

  一、基礎(chǔ)知識(shí)
 
 
  (一)邏輯坐標(biāo)。邏輯坐標(biāo)與設(shè)備無(wú)關(guān),缺省地,一個(gè)邏輯單位等于設(shè)備中的一個(gè)象素。它是實(shí)現(xiàn)“所見(jiàn)即所得”的基礎(chǔ)。例如,當(dāng)程序員調(diào)用LineTo函數(shù)繪制25.4mm(1 英 寸) 長(zhǎng)的直線時(shí),他只要使用合適的映射模式,那么就并不需要考慮輸出的是何種設(shè)備。若設(shè)備是VGA顯示器,Windows自動(dòng)將其轉(zhuǎn)化為96個(gè)像素點(diǎn);若設(shè)備是一個(gè)300dpi激光打印機(jī),Windows自動(dòng)將其轉(zhuǎn)化為300 個(gè)像素點(diǎn)。 
 
  (二)設(shè)備坐標(biāo)。圖形輸出時(shí),Windows將GDI函數(shù)中指定的邏輯坐標(biāo)映射為設(shè)備坐標(biāo),在所有的設(shè)備坐標(biāo)系統(tǒng)中,單位以像素點(diǎn)為準(zhǔn),水平值從左到右增大(正方向向右),垂直值從上到下增大(正方向向下)。Windows中包括以下3 種設(shè)備坐標(biāo),以滿足各種不同需要: 
 
  1、客戶區(qū)域坐標(biāo),包括應(yīng)用程序的客戶區(qū)域,客戶區(qū)域的左上角為(0, 0)。 
 
  2、屏幕坐標(biāo),包括整個(gè)屏幕,屏幕的左上角為(0, 0)。屏幕坐標(biāo)用在WM_MOVE消息中(對(duì)于非子窗口)以及下面的Windows 函數(shù)中:CreateWindow 和MoveWindow(都對(duì)于非子窗口)、GetMessage、GetCursorPos、GetWindowRect、WindowFromPoint 和SetBrushOrg 中。 用函數(shù)ClientToScreen 和ScreenToClient可以將客戶區(qū)域坐標(biāo)轉(zhuǎn)換成屏幕區(qū)域坐標(biāo),或反之。 
 
  3、全窗口坐標(biāo),包括一個(gè)程序的整個(gè)窗口,包括標(biāo)題條、菜單、滾動(dòng)條和窗口框,窗口的左上角為(0,0)。使用GetWindowDC得到的窗口設(shè)備環(huán)境,可以將邏輯單位轉(zhuǎn)換成窗口”坐標(biāo)。  

  (三)映射。映射方式定義了Windows如何將GDI函數(shù)中指定的邏輯坐標(biāo)映射為設(shè)備坐標(biāo)。在下文中我們將介紹常用的映射方式。
 
  此外,習(xí)慣上,我們將邏輯坐標(biāo)所在的坐標(biāo)系稱為“窗口”;將設(shè)備坐標(biāo)所在的坐標(biāo)系稱為“視口”。“窗口”依賴于邏輯坐標(biāo),可以是像素點(diǎn)、毫米或其他尺度。這一點(diǎn)請(qǐng)牢記,這對(duì)于下面的有關(guān)內(nèi)容的理解至關(guān)重要。
 
  二、默認(rèn)的坐標(biāo)系統(tǒng)
 
  當(dāng)在微軟的窗口中進(jìn)行繪圖時(shí),繪圖的坐標(biāo)原點(diǎn)在屏幕的左上角,任何物體在屏幕上定位都要參考這個(gè)坐標(biāo)原點(diǎn)。在笛卡爾坐標(biāo)系統(tǒng)中這個(gè)點(diǎn)被定義為坐標(biāo)原點(diǎn)(0,0),水平坐標(biāo)軸的正方向是從該點(diǎn)出發(fā)向右延伸,垂直坐標(biāo)軸的正方向是從該點(diǎn)出發(fā)向下延伸。


圖一、笛卡爾坐標(biāo)系

  這個(gè)坐標(biāo)原點(diǎn)只是操作系統(tǒng)默認(rèn)的坐標(biāo)原點(diǎn),所以如果你調(diào)用Ellipse(-100, -100, 100, 100)函數(shù)來(lái)繪制圖形的話,你將得到一個(gè)圓,它的圓心位于屏幕的左上角,僅僅只有圓的四分之一部分(270度到360度的部分)顯示在屏幕上。代碼及效果圖如下 

void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // 繪圖的設(shè)備廠上下文
 CPen PenBlue;
 // 蘭色畫(huà)筆
 PenBlue.CreatePen(PS_SOLID, 1, RGB(0, 12, 255));
 dc.SelectObject(&pPen);
 dc.Ellipse(-100, -100, 100, 100);
}


  圖二、代碼效果圖 

  按照同樣的原理,你可以使用CpaintDC的方法或按照你的要求創(chuàng)建函數(shù)來(lái)繪制任何幾何或非幾何圖形。例如,下面的代碼繪制了兩條相互垂直的直線,垂點(diǎn)位與窗口的中心:
 
void CExoDraw1View::OnPaint()  
{
 CPaintDC dc(this); // 繪圖的設(shè)備上下文
 CRect Recto;
 CPen PenBlue;
 PenBlue.CreatePen(PS_SOLID, 1, RGB(0, 12, 255));
 dc.SelectObject(&PenBlue);
 dc.Ellipse(-100, -100, 100, 100);
 CPen PenBlack;
 PenBlack.CreatePen(PS_SOLID, 1, BLACK_PEN);
 dc.SelectObject(&PenBlack);
 // 得到客戶區(qū)域的尺寸;
 GetClientRect(&Recto);
 dc.MoveTo(Recto.Width() / 2, 0);
 dc.LineTo(Recto.Width() / 2, Recto.Height());
 dc.MoveTo(0, Recto.Height() / 2);
 dc.LineTo(Recto.Width(), Recto.Height() / 2);
}

 
 圖三、代碼效果圖
  三、更改坐標(biāo)系統(tǒng)
 
  
正如上面所看到的,默認(rèn)的坐標(biāo)系統(tǒng)坐標(biāo)原點(diǎn)位于窗口的左上角,水平軸的正方向向右,垂直軸的正方向向下。為了進(jìn)一步說(shuō)明這一點(diǎn),讓我們來(lái)繪制一個(gè)半徑為50個(gè)單位,圓心位于(0,0)點(diǎn),同時(shí)繪制一個(gè)連接(0,0)(100,100)兩點(diǎn)的直線。
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 // A circle whose center is at the origin (0, 0)
 dc.Ellipse(-50, -50, 50, 50);
 // A line that starts at (0, 0) and ends at (100, 100)
 dc.MoveTo(0, 0);
 dc.LineTo(100, 100);
}


圖四、代碼效果圖
 
  這種默認(rèn)的坐標(biāo)原點(diǎn)在大多數(shù)圖形操作情況下是適用的,但并不是總適用,有時(shí)你需要控制坐標(biāo)系統(tǒng)的原點(diǎn),例如,很多CAD(圖形輔助設(shè)計(jì))應(yīng)用程序就需要用戶來(lái)定義坐標(biāo)系統(tǒng)的原點(diǎn)。
 
  MFC提供了各種函數(shù)來(lái)處理坐標(biāo)定位及擴(kuò)展繪制區(qū)域的問(wèn)題,包括在屏幕上任意位置設(shè)置坐標(biāo)原點(diǎn)的函數(shù)。因?yàn)槟闶窃谝粋€(gè)設(shè)備上下文上進(jìn)行繪圖操作,因此,你所需要做的就是調(diào)用CDC::SetViewportOrg()函數(shù)。這個(gè)函數(shù)重載了兩個(gè)版本,這允許你使用X、Y坐標(biāo)或是一個(gè)定義的Point點(diǎn)。這個(gè)函數(shù)的語(yǔ)法如下:
 
SetViewportOrg(int X, int Y);
SetViewportOrg(CPoint Pt);
 
  調(diào)用這個(gè)函數(shù)時(shí)只需要簡(jiǎn)單地說(shuō)明哪兒是你想定義的坐標(biāo)原點(diǎn),如果使用函數(shù)的第二個(gè)版本,參數(shù)可以是一個(gè)POINT結(jié)構(gòu)或是一個(gè)MFC提供的Tpoint類。為了演示這個(gè)函數(shù)的效果,讓我們將上例的坐標(biāo)原點(diǎn)沿X軸正方向移動(dòng)200個(gè)單位,Y軸正方向移動(dòng)150個(gè)單位,這時(shí)繪制函數(shù)如下:
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); //繪圖的設(shè)備上下文;
 dc.SetViewportOrg(200, 150);
 // 圓心位于坐標(biāo)原點(diǎn)(0, 0)
 dc.Ellipse(-50, -50, 50, 50);
 // 連接(0, 0) 和 (100, 100)點(diǎn)的直線;
 dc.MoveTo(0, 0);
 dc.LineTo(100, 100);
}
 
 
 圖五、代碼效果圖
 

  需要注意的是,你也可以相對(duì)于客戶區(qū)域來(lái)指定坐標(biāo)原點(diǎn)
 
void CExoDraw1View::OnPaint()  
{
 CPaintDC dc(this); //繪圖的設(shè)備上下文;
 CRect Recto;
 //獲取客戶區(qū)尺寸;
 GetClientRect(&Recto);
 dc.SetViewportOrg(Recto.Width() / 2, Recto.Height() / 2);
 // A circle whose center is at the origin (0, 0)
 dc.Ellipse(-50, -50, 50, 50);
 // A line that starts at (0, 0) and ends at (100, 100)
 dc.MoveTo(0, 0);
 dc.LineTo(100, 100);
}


  圖六、代碼效果圖 

  現(xiàn)在你已了解了如何設(shè)置坐標(biāo)原點(diǎn),讓我們來(lái)將(380,220)點(diǎn)作為坐標(biāo)原點(diǎn),并繪制出笛卡爾的坐標(biāo)軸:
 
void CExoDraw1View::OnPaint()  
{
 CPaintDC dc(this); // device context for painting
 CRect Recto;
 dc.SetViewportOrg(380, 220);
 // Use a red pen
 CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0));
 dc.SelectObject(PenRed);
 // A circle whose center is at the origin (0, 0)
 dc.Ellipse(-100, -100, 100, 100);
 // Use a blue pen
 CPen PenBlue(PS_SOLID, 1, RGB(0, 0, 255));
 dc.SelectObject(PenBlue);
 // Horizontal axis
 dc.MoveTo(-380, 0);
 dc.LineTo(380, 0);
 // Vertical axis
 dc.MoveTo(0, -220);
 dc.LineTo(0, 220);
}


 圖七、代碼效果圖 

  正如已經(jīng)看到的,SetViewportOrg()函數(shù)可以更改設(shè)備上下文的坐標(biāo)原點(diǎn),同時(shí),它也用來(lái)規(guī)定坐標(biāo)軸的正方向,即水平軸向右,垂直軸向下:


 圖八、坐標(biāo)軸示意圖 

  為了說(shuō)明這一點(diǎn),下面來(lái)繪制一條黃色的45度角的直線:
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 dc.SetViewportOrg(380, 220);
 // Use a red pen
 CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0));
 dc.SelectObject(PenRed);
 // A circle whose center is at the origin (0, 0)
 dc.Ellipse(-100, -100, 100, 100);
 // Use a blue pen
 CPen PenBlue(PS_SOLID, 1, RGB(0, 0, 255));
 dc.SelectObject(PenBlue);
 // Horizontal axis
 dc.MoveTo(-380, 0);
 dc.LineTo(380, 0);
 // Vertical axis
 dc.MoveTo(0, -220);
 dc.LineTo(0, 220);
 // An orange pen
 CPen PenOrange(PS_SOLID, 1, RGB(255, 128, 0));
 dc.SelectObject(PenOrange);
 // A diagonal line at 45 degrees
 dc.MoveTo(0, 0);
 dc.LineTo(120, 120);
}


 圖九、代碼效果圖 

  正如你所看到的,我們的直線沒(méi)有在45度位置,而是位于坐標(biāo)系統(tǒng)的第四象限,造成這種情況的原因是默認(rèn)的坐標(biāo)系統(tǒng)。
  三、固定映射模式
 
  為了控制設(shè)備上下文中的坐標(biāo)軸的方向,可以使用CDC類的SetMapMode()函數(shù),它的語(yǔ)法如下:
 
int SetMapMode(int nMapMode);
 
  這個(gè)函數(shù)將根據(jù)參數(shù)的設(shè)置的不同做兩件事,一是控制坐標(biāo)軸的方向;二是坐標(biāo)系統(tǒng)的單位長(zhǎng)度。
 
  這個(gè)函數(shù)的參數(shù)是用來(lái)定義映射模式的整型常量。它可能的值是:MM_TEXT, MM_LOENGLISH、MM_HIENGLISH、MM_ANISOTROPIC、MM_HIMETRIC, MM_ISOTROPIC、 MM_LOMETRIC, MM_TWIPS。
 
  默認(rèn)情況下使用MM_TEXT映射模式。換句話說(shuō),如果你沒(méi)有具體的規(guī)定某一映射模式,你的應(yīng)用程序就將使用MM_TEXT映射模式。在這種映射模式下,設(shè)備上下文中的度量尺寸將使用默認(rèn)的像素單位,水平坐標(biāo)軸正方向向右,垂直坐標(biāo)軸正方向向下。例如,上面的OnPaint事件可以用下面的代碼重寫(xiě),它將產(chǎn)生同樣的效果,仿佛沒(méi)有使用映射模式。
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 dc.SetMapMode(MM_TEXT);
 dc.SetViewportOrg(380, 220);
 // Use a red pen
 CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0));
 dc.SelectObject(PenRed);
 // A circle whose center is at the origin (0, 0)
 dc.Ellipse(-100, -100, 100, 100);
 // Use a blue pen
 CPen PenBlue(PS_SOLID, 1, RGB(0, 0, 255));
 dc.SelectObject(PenBlue);
 // Horizontal axis
 dc.MoveTo(-380, 0);
 dc.LineTo(380, 0);
 // Vertical axis
 dc.MoveTo(0, -220);
 dc.LineTo(0, 220);
 // An orange pen
 CPen PenOrange(PS_SOLID, 1, RGB(255, 128, 0));
 dc.SelectObject(PenOrange);
 // A diagonal line at 45 degrees
 dc.MoveTo(0, 0);
 dc.LineTo(120, 120);
}


圖十、代碼效果圖

  MM_LOENGLISH模式,與其他一些映射模式(不包括MM_TEXT模式)一樣,執(zhí)行兩個(gè)動(dòng)作,它改變坐標(biāo)軸的方向,垂直坐標(biāo)軸的正方向向上;


圖十一、MM_LOENGLISH
映射模式下的坐標(biāo)系
  
  此外,度量單位改為0.01英寸,這意味著你提供的坐標(biāo)將除以100,觀察上述代碼的MM_LOENGLISH映射效果
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 dc.SetMapMode(MM_LOENGLISH);
 dc.SetViewportOrg(380, 220);
 . . .
}


圖十二、代碼效果圖
  
  正如你所看到的,直線現(xiàn)在位于坐標(biāo)系的第一象限,同時(shí),直線比以前縮短,圓也比以前的要小。
 
  與MM_LOENGLISH映射模式相似,MM_HIENGLISH映射模式也是垂直坐標(biāo)軸正向向上,只是它以0.001英寸為坐標(biāo)單位,下面是它的效果:
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 dc.SetMapMode(MM_HIENGLISH);
 dc.SetViewportOrg(380, 220);
 . . . Same as previous
}


圖十三、代碼效果圖
  
  MM_LOMETRIC映射模式使用與上兩種映射模式相同的坐標(biāo)軸,不同的是MM_LOMETRIC使用0.1毫米為單位,下面是一個(gè)例子:
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting 
 dc.SetMapMode(MM_LOMETRIC);
 dc.SetViewportOrg(380, 220);
 . . .
}


圖十四、代碼效果圖
 

  MM_HIMETRIC使用與上述三種映射模式相同的坐標(biāo)系,但它的坐標(biāo)單位是0.01毫米,下面例子代碼如下:
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 dc.SetMapMode(MM_HIMETRIC);
 dc.SetViewportOrg(380, 220);
 . . . Same as previous
}


圖十五、代碼效果圖
 
 
  MM_TWIPS映射模式將每個(gè)邏輯單位(像素)除以20,實(shí)際上一twip等于1/1440 英寸,坐標(biāo)系統(tǒng)仍然與上面幾種映射方式相同。
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 CRect Recto;
 dc.SetMapMode(MM_TWIPS);
 dc.SetViewportOrg(380, 220);
 . . .
}


圖十六、代碼效果圖
 
  四、自定義坐標(biāo)系統(tǒng)
 
  目前為止,我們使用的映射模式可以允許我們選擇坐標(biāo)軸的方向,但僅僅是Y軸的方向。而且,我們不能更改坐標(biāo)系統(tǒng)的單位,這是因?yàn)楦鞣N映射模式(MM_TEXT, MM_HIENGLISH, MM_LOENGLISH, MM_HIMETRIC, MM_LOMETRIC, and MM_TWIPS)有固定的屬性集,例如坐標(biāo)軸的方向和坐標(biāo)單位等。在CAD應(yīng)用程序中,如果你需要靈活設(shè)置坐標(biāo)軸方向及坐標(biāo)單位的話,應(yīng)該怎么做呢?
 
  仔細(xì)研究下面的OnPaint()事件代碼,它繪制了一個(gè)200X200像素大小的紅邊、淺綠色背景的正方形,這個(gè)正方形的頂點(diǎn)在(-100,-100)處,右底端位于(100,100)處。同時(shí),從坐標(biāo)原點(diǎn)處繪制一個(gè)45度的直線。
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0));
 CBrush BrushAqua(RGB(0, 255, 255));
 dc.SelectObject(PenRed);
 dc.SelectObject(BrushAqua);
 // Draw a square with a red border and an aqua background
 dc.Rectangle(-100, -100, 100, 100);
 CPen BluePen(PS_SOLID, 1, RGB(0, 0, 255));
 dc.SelectObject(BluePen);
 // Diagonal line at 45 degrees starting at the origin (0, 0)
 dc.MoveTo(0, 0);
 dc.LineTo(200, 200);
}


圖十七、代碼效果圖
  
  正如你所看到的,我們只得到了正方形的右下部分,同時(shí)直線指向時(shí)鐘的三點(diǎn)到六點(diǎn)之間的方向。假定你想將坐標(biāo)原點(diǎn)設(shè)置與窗口中央位置,或者是更精確一點(diǎn),設(shè)置于點(diǎn)(340, 220)處,我們已經(jīng)知道可以使用CDC::SetViewportOrg()(記住,這個(gè)函數(shù)只用來(lái)更改坐標(biāo)原點(diǎn),它并不影響坐標(biāo)軸的方向及坐標(biāo)單位。同時(shí),需要注意的是,它使用的坐標(biāo)單位是像素)函數(shù),下面是一個(gè)例子(我們沒(méi)有規(guī)定映射模式,所以程序使用的是默認(rèn)的MM_TEXT映射模式)。
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 dc.SetViewportOrg(340, 220);
 CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0));
 CBrush BrushAqua(RGB(0, 255, 255));
 dc.SelectObject(PenRed);
 dc.SelectObject(BrushAqua);
 // Draw a square with a red border and an aqua background
 dc.Rectangle(-100, -100, 100, 100);
 CPen BluePen(PS_SOLID, 1, RGB(0, 0, 255));
 dc.SelectObject(BluePen);
 // Diagonal line at 45 degrees starting at the origin (0, 0)
 dc.MoveTo(0, 0);
 dc.LineTo(200, 200);
}


圖十八、代碼效果圖
 
 
  為了控制你自己應(yīng)用程序中的坐標(biāo)系統(tǒng)單位,坐標(biāo)軸的方向,可以使用MM_ISOTROPIC 或MM_ANISOTROPIC映射模式。第一件事是調(diào)用CDC::SetMapMode()函數(shù),并在兩個(gè)常量中選擇一個(gè)(MM_ISOTROPIC或 MM_ANISOTROPIC)。下面是例子代碼:

void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 dc.SetMapMode(MM_ISOTROPIC);
 dc.SetViewportOrg(340, 220);
 CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0));
 CBrush BrushAqua(RGB(0, 255, 255));
 dc.SelectObject(PenRed);
 dc.SelectObject(BrushAqua);
 // Draw a square with a red border and an aqua background
 dc.Rectangle(-100, -100, 100, 100);
 CPen BluePen(PS_SOLID, 1, RGB(0, 0, 255));
 dc.SelectObject(BluePen);
 // Diagonal line at 45 degrees starting at the origin (0, 0)
 dc.MoveTo(0, 0);
 dc.LineTo(200, 200);
}


圖十九、代碼效果圖
 
 
  先拋開(kāi)上面的圖片。當(dāng)調(diào)用CDC::SetMapMode(),并使用MM_ISOTROPIC或 MM_ANISOTROPIC作為參數(shù)后,并沒(méi)有結(jié)束,這兩種映射方式允許我們改變坐標(biāo)軸的正方向及坐標(biāo)單位。這兩種映射方式的區(qū)別在于:MM_ISOTROPIC映射方式中水平、垂直坐標(biāo)軸的單位相等,MM_ANISOTROPIC映射方式可以隨意控制水平及垂直方向的坐標(biāo)單位長(zhǎng)度。
 
  所以,在調(diào)用SetMapMode()函數(shù)并規(guī)定了MM_ISOTROPIC或MM_ANISOTROPIC映射模式后,你必須調(diào)用CDC:SetWindowExt()函數(shù),這個(gè)函數(shù)用來(lái)計(jì)算老的或默認(rèn)的坐標(biāo)系中一個(gè)單位的長(zhǎng)度。這個(gè)函數(shù)有兩個(gè)版本:
 
CSize SetWindowExt(int cx, int cy);
CSize SetWindowExt(SIZE size);
 
  如果使用第一版本,第一個(gè)參數(shù)CX說(shuō)明了水平坐標(biāo)軸上按照新的邏輯單位代表的長(zhǎng)度,CY代表了垂直坐標(biāo)軸上按照新的邏輯單位代表的長(zhǎng)度。
 
  如果你知道按照新的坐標(biāo)單位計(jì)算需要的邏輯尺寸的話,可以使用第二個(gè)版本的函數(shù),例子代碼如下:
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 dc.SetMapMode(MM_ISOTROPIC);
 dc.SetViewportOrg(340, 220);
 dc.SetWindowExt(480, 480);
 CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0));
 CBrush BrushAqua(RGB(0, 255, 255));
 dc.SelectObject(PenRed);
 dc.SelectObject(BrushAqua);
 // Draw a square with a red border and an aqua background
 dc.Rectangle(-100, -100, 100, 100);
 CPen BluePen(PS_SOLID, 1, RGB(0, 0, 255));
 dc.SelectObject(BluePen);
 // Diagonal line at 45 degrees starting at the origin (0, 0)
 dc.MoveTo(0, 0);
 dc.LineTo(200, 200);
}


圖二十、代碼效果圖
  
  調(diào)用SetWindowExt()函數(shù)后,緊接著應(yīng)調(diào)用SetViewportExt()函數(shù),它的任務(wù)是規(guī)定水平及垂直坐標(biāo)軸的單位。我們可以這樣認(rèn)為,SetWindowExt()函數(shù)對(duì)應(yīng)著“窗口”,SetViewportExt()函數(shù)對(duì)應(yīng)著“視口”。SetViewportExt()函數(shù)有兩個(gè)版本:
 
CSize SetViewportExt(int cx, int cy);
CSize SetViewportExt(SIZE size);
 
  上述兩個(gè)函數(shù)中的參數(shù)與“窗口”中的尺寸是相互對(duì)應(yīng)的,它的單位是像素。為了進(jìn)一步說(shuō)明這兩個(gè)函數(shù)的使用,我對(duì)這兩個(gè)函數(shù)進(jìn)行了重新說(shuō)明:
 
SetWindowExt(int Lwidth, int Lheight) //參數(shù)的單位為邏輯單位(Logical);
SetViewportExt(int Pwidth, int Pheight) //參數(shù)的單位為像素(Pixel);
 
  以x軸為例(y軸類似),邏輯坐標(biāo)系中的x軸的單位刻度=| Pwidth | / | Lwidth |。這表示x軸上一個(gè)邏輯單位等于多少個(gè)像素。比如我們先通過(guò)GetDeviceCap(LOGPIXELSX)獲得在我們的顯示器上每英寸等于多少個(gè)像素,設(shè)為p,然后我們將它賦給Pwidth,將Lwidth賦成2,即Pwidth / Lwidth=p / 2。那么,此時(shí)邏輯坐標(biāo)系x軸上的單位刻度就是p / 2個(gè)像素;又由于p個(gè)像素是代表一個(gè)英寸的,所以此時(shí)的邏輯坐標(biāo)系x軸上的單位刻度同時(shí)也是半個(gè)英寸。還有一點(diǎn)要注意的是,如果Lwidth與Pwidth同號(hào),邏輯坐標(biāo)的x軸方向與設(shè)備坐標(biāo)系中的x軸方向相同,否則相反。
 
  此外,當(dāng)使用MM_ISOTROPIC模式時(shí),如果通過(guò)計(jì)算window與viewport范圍的比值得到兩個(gè)方向的單位刻度值不同,那么將會(huì)以較小的那個(gè)為準(zhǔn)。
 
  下面是一個(gè)例子:
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 dc.SetMapMode(MM_ISOTROPIC);
 dc.SetViewportOrg(340, 220);
 dc.SetWindowExt(480, 480);
 dc.SetViewportExt(440, -680);
 CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0));
 CBrush BrushAqua(RGB(0, 255, 255));
 dc.SelectObject(PenRed);
 dc.SelectObject(BrushAqua);
 // Draw a square with a red border and an aqua background
 dc.Rectangle(-100, -100, 100, 100);
 CPen BluePen(PS_SOLID, 1, RGB(0, 0, 255));
 dc.SelectObject(BluePen);
 // Diagonal line at 45 degrees starting at the origin (0, 0)
 dc.MoveTo(0, 0);
 dc.LineTo(200, 200);
}


圖二十一、代碼效果圖
  五、實(shí)例代碼
 
  為了靈活使用邏輯坐標(biāo)系,下面給出了幾個(gè)例子代碼:
 
  例1:繪制帶箭頭的坐標(biāo)軸
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 CBrush bgBrush(BLACK_BRUSH);
 dc.SelectObject(bgBrush);
 dc.Rectangle(Recto);
 dc.SetMapMode(MM_ISOTROPIC);
 dc.SetViewportOrg(0, 440);
 dc.SetWindowExt(480, 480);
 dc.SetViewportExt(440, -680);
 CPen PenWhite(PS_SOLID, 1, RGB(255, 255, 255));
 dc.SelectObject(PenWhite);
 dc.MoveTo(21, 20);
 dc.LineTo(21, 75);
 // Up arrow
 dc.MoveTo(16, 75);
 dc.LineTo(21, 90);
 dc.LineTo(26, 75);
 dc.LineTo(16, 75);
 dc.MoveTo(21, 22);
 dc.LineTo(75, 22);
 // Right arrow
 dc.MoveTo(75, 17); 
 dc.LineTo(90, 22);
 dc.LineTo(75, 27);
 dc.LineTo(75, 17);
 
 dc.SetBkMode(TRANSPARENT);
 dc.SetTextColor(RGB(255, 255, 255));
 dc.TextOut(16, 114, ’Y’);
 dc.TextOut(100, 32, ’X’);
 dc.Rectangle(15, 15, 30, 30);
}


圖二十二、代碼效果圖
 
 
  例2:繪制網(wǎng)格 

void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 CRect Recto;
 GetClientRect(&Recto);
 CBrush bgBrush(BLACK_BRUSH);
 dc.SelectObject(bgBrush);
 dc.Rectangle(Recto);
 CPen PenBlue(PS_SOLID, 1, RGB(0, 0, 255));
 dc.SelectObject(PenBlue);
 for(int x = 0; x < Recto.Width(); x += 20)
 {
  dc.MoveTo(x, 0);
  dc.LineTo(x, Recto.Height()); 
 }
 
 for(int y = 0; y < Recto.Height(); y += 20)
 { 
  dc.MoveTo(0, y);
  dc.LineTo(Recto.Width(), y); 
 }
 
}


 圖二十三、代碼效果圖
 
  例3:點(diǎn)狀網(wǎng)格
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting 
 CRect Recto;
 
 GetClientRect(&Recto);
 CBrush bgBrush(BLACK_BRUSH); 
 dc.SelectObject(bgBrush);
 dc.Rectangle(Recto); 
 for(int x = 0; x < Recto.Width(); x += 20)
 { 
  for(int y = 0; y < Recto.Height(); y += 20)
  { 
   dc.SetPixel(x, y, RGB(255, 255, 255));
  } 
 }
}


圖二十四、代碼效果
 
 
  例4:正弦圖形
 
void CExoView::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 // TODO: Add your message handler code here
 dc.SetMapMode(MM_ANISOTROPIC);
 dc.SetViewportOrg(340, 220);
 dc.SetWindowExt(1440, 1440);
 dc.SetViewportExt(-1440, -220);
 CPen PenBlue(PS_SOLID, 1, RGB(0, 0, 255));
 
 dc.SelectObject(PenBlue);
 // Axes
 dc.MoveTo(-300, 0);
 dc.LineTo( 300, 0);
 dc.MoveTo( 0, -1400);
 dc.LineTo( 0, 1400);
 // I am exaggerating with the PI value here but why not?
 const double PI = 3.141592653589793238462643383279;
 // The following two values were chosen randomly by me.
 // You can chose other values you like
 
 const int MultiplyEachUnitOnX = 50;
 const int MultiplyEachUnitOnY = 250;
 for(double i = -280; i < 280; i += 0.01)
 {
  double j = sin(PI / MultiplyEachUnitOnX * i) * MultiplyEachUnitOnY; 
  dc.SetPixel(i, j, RGB(255, 0, 0));
 }
 
 // Do not call CView::OnPaint() for painting messages
 
}


圖二十五、代碼效果圖
posted on 2006-11-18 16:42 獨(dú)孤九劍 閱讀(191) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Visual C++ 8.0
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品免费一区二区三区| 久久综合九色99| 国产欧美丝祙| 性色av香蕉一区二区| 伊人成人在线| 伊人久久大香线| 亚洲人成网站精品片在线观看| 亚洲欧美日韩在线| 欧美一区久久| 久久久久久夜| 欧美成人乱码一区二区三区| 亚洲国产精品999| 久久伊人一区二区| 亚洲第一福利在线观看| 一区二区激情视频| 午夜精品一区二区三区电影天堂 | 亚洲免费在线看| 亚洲一区二区久久| 久久综合久久综合这里只有精品 | 欧美成人综合一区| 欧美日韩专区| 国内精品国产成人| 亚洲片国产一区一级在线观看| 99精品视频免费观看| 欧美在线中文字幕| 性伦欧美刺激片在线观看| 久久久久这里只有精品| 亚洲人在线视频| 久久国产夜色精品鲁鲁99| 国产综合色产在线精品| 久久国产精品高清| 欧美怡红院视频| 在线播放国产一区中文字幕剧情欧美 | 欧美有码视频| 亚洲成人资源网| 亚洲福利国产精品| 欧美激情第10页| 亚洲亚洲精品三区日韩精品在线视频 | 亚洲国产成人久久综合| 91久久中文| 国产精品国产亚洲精品看不卡15| 欧美亚洲日本网站| 久久一区二区三区国产精品| 亚洲精品视频在线看| 亚洲性视频h| 欧美成人一区二区三区片免费| 亚洲精品一区二区三区婷婷月 | 久久人人97超碰国产公开结果| 久久久久久久综合日本| 亚洲另类一区二区| 午夜国产精品影院在线观看 | 亚洲成色精品| 国产精品乱码久久久久久| 久久久999成人| 欧美日韩精品免费观看| 久久久久91| 国产精品第一区| 亚洲高清精品中出| 国产日韩视频| a4yy欧美一区二区三区| 樱桃国产成人精品视频| 一本色道久久综合狠狠躁篇怎么玩 | 国产精品极品美女粉嫩高清在线 | 99re在线精品| 久久久91精品国产一区二区精品| 一本综合精品| 久久综合网络一区二区| 久久精品九九| 国产精品国产三级欧美二区| 亚洲第一天堂av| 国一区二区在线观看| 一二三区精品| 99视频超级精品| 久久三级视频| 久久精品日韩一区二区三区| 国产精品ⅴa在线观看h| 亚洲欧洲三级| 亚洲人成人一区二区三区| 久久黄金**| 久久九九免费视频| 国产欧美视频一区二区| 亚洲中午字幕| 亚洲欧美电影院| 欧美日韩中文字幕精品| 一本色道久久88综合亚洲精品ⅰ | 欧美中文字幕在线观看| 欧美亚日韩国产aⅴ精品中极品| 欧美成人久久| 亚洲精品久久久蜜桃| 久久亚洲综合色| 欧美高清不卡| 亚洲人成网在线播放| 欧美va亚洲va日韩∨a综合色| 麻豆av一区二区三区久久| 红桃视频国产一区| 久久久久成人精品| 老牛影视一区二区三区| 久久婷婷丁香| 久久另类ts人妖一区二区| 国产亚洲欧美日韩精品| 午夜久久电影网| 久久国产精品一区二区| 激情成人av| 久久九九久久九九| 欧美成人69av| 亚洲伦理久久| 欧美偷拍另类| 亚洲视频在线播放| 欧美资源在线| 国产在线国偷精品产拍免费yy| 欧美在线视频在线播放完整版免费观看 | 亚洲午夜电影| 性亚洲最疯狂xxxx高清| 国产精品无码永久免费888| 亚洲视频狠狠| 久久精品国产77777蜜臀| 国产精品亚洲а∨天堂免在线| 欧美一区二区三区视频在线观看 | 亚洲视频欧美在线| 久久成人精品一区二区三区| 影视先锋久久| 欧美日韩国产黄| 亚洲欧美中文另类| 免费观看在线综合色| 一本色道久久综合亚洲二区三区| 国产精品久久久久影院色老大| 午夜一级久久| 亚洲人成网站777色婷婷| 欧美综合77777色婷婷| 亚洲国产裸拍裸体视频在线观看乱了| 欧美成人一区二免费视频软件| 亚洲一级片在线观看| 欧美岛国激情| 午夜影视日本亚洲欧洲精品| 亚洲国产人成综合网站| 国产精品欧美日韩久久| 欧美1区2区3区| 午夜综合激情| 亚洲精品视频免费观看| 久久综合九色九九| 午夜精品久久久久久久男人的天堂| 亚洲电影免费在线观看| 国产精品三区www17con| 欧美激情91| 美国三级日本三级久久99| 亚洲欧美怡红院| 日韩一二三在线视频播| 欧美成人激情在线| 久久国产加勒比精品无码| 日韩视频一区二区在线观看 | 亚洲综合视频1区| 最新国产拍偷乱拍精品| 久久久国产成人精品| 一区二区三区 在线观看视| 黑人巨大精品欧美一区二区小视频| 欧美日韩另类在线| 久久在精品线影院精品国产| 亚洲一区二区三区四区中文 | 日韩一级裸体免费视频| 欧美a级片网| 久久亚洲风情| 久久久久国色av免费看影院| 午夜在线播放视频欧美| 一区二区三区高清在线观看| 亚洲国产日本| 亚洲人成网站777色婷婷| 亚洲东热激情| 在线看日韩欧美| 有坂深雪在线一区| 韩国精品久久久999| 久久久久国色av免费观看性色| 亚洲与欧洲av电影| 亚洲一区二区三区在线| 亚洲一品av免费观看| 亚洲美女毛片| 夜夜夜久久久| 亚洲一区二区精品视频| 亚洲欧美精品| 久久av一区二区| 久久婷婷久久| 欧美大尺度在线| 欧美日韩国产一级片| 欧美日韩中文在线| 国产精品手机视频| 国产午夜精品全部视频在线播放 | 伊人精品成人久久综合软件| 韩国三级电影久久久久久| 激情五月综合色婷婷一区二区| 精东粉嫩av免费一区二区三区| 伊人久久婷婷| 亚洲另类自拍| 亚洲欧美日韩精品| 久久精品视频在线观看| 老司机一区二区三区| 欧美高清视频一区二区| 亚洲黄页视频免费观看| 一本久道久久综合中文字幕| 午夜视频一区在线观看| 免费在线日韩av| 欧美色欧美亚洲高清在线视频|