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

道。道。道

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

   :: 首頁 :: 聯系 :: 聚合  :: 管理

常用鏈接

搜索

  •  

最新評論

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

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

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


圖一、笛卡爾坐標系

  這個坐標原點只是操作系統默認的坐標原點,所以如果你調用Ellipse(-100, -100, 100, 100)函數來繪制圖形的話,你將得到一個圓,它的圓心位于屏幕的左上角,僅僅只有圓的四分之一部分(270度到360度的部分)顯示在屏幕上。代碼及效果圖如下 

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


  圖二、代碼效果圖 

  按照同樣的原理,你可以使用CpaintDC的方法或按照你的要求創建函數來繪制任何幾何或非幾何圖形。例如,下面的代碼繪制了兩條相互垂直的直線,垂點位與窗口的中心:
 
void CExoDraw1View::OnPaint()  
{
 CPaintDC dc(this); // 繪圖的設備上下文
 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);
 // 得到客戶區域的尺寸;
 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);
}

 
 圖三、代碼效果圖
  三、更改坐標系統
 
  
正如上面所看到的,默認的坐標系統坐標原點位于窗口的左上角,水平軸的正方向向右,垂直軸的正方向向下。為了進一步說明這一點,讓我們來繪制一個半徑為50個單位,圓心位于(0,0)點,同時繪制一個連接(0,0)(100,100)兩點的直線。
 
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);
}


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

  需要注意的是,你也可以相對于客戶區域來指定坐標原點
 
void CExoDraw1View::OnPaint()  
{
 CPaintDC dc(this); //繪圖的設備上下文;
 CRect Recto;
 //獲取客戶區尺寸;
 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);
}


  圖六、代碼效果圖 

  現在你已了解了如何設置坐標原點,讓我們來將(380,220)點作為坐標原點,并繪制出笛卡爾的坐標軸:
 
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);
}


 圖七、代碼效果圖 

  正如已經看到的,SetViewportOrg()函數可以更改設備上下文的坐標原點,同時,它也用來規定坐標軸的正方向,即水平軸向右,垂直軸向下:


 圖八、坐標軸示意圖 

  為了說明這一點,下面來繪制一條黃色的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);
}


 圖九、代碼效果圖 

  正如你所看到的,我們的直線沒有在45度位置,而是位于坐標系統的第四象限,造成這種情況的原因是默認的坐標系統。
  三、固定映射模式
 
  為了控制設備上下文中的坐標軸的方向,可以使用CDC類的SetMapMode()函數,它的語法如下:
 
int SetMapMode(int nMapMode);
 
  這個函數將根據參數的設置的不同做兩件事,一是控制坐標軸的方向;二是坐標系統的單位長度。
 
  這個函數的參數是用來定義映射模式的整型常量。它可能的值是:MM_TEXT, MM_LOENGLISH、MM_HIENGLISH、MM_ANISOTROPIC、MM_HIMETRIC, MM_ISOTROPIC、 MM_LOMETRIC, MM_TWIPS。
 
  默認情況下使用MM_TEXT映射模式。換句話說,如果你沒有具體的規定某一映射模式,你的應用程序就將使用MM_TEXT映射模式。在這種映射模式下,設備上下文中的度量尺寸將使用默認的像素單位,水平坐標軸正方向向右,垂直坐標軸正方向向下。例如,上面的OnPaint事件可以用下面的代碼重寫,它將產生同樣的效果,仿佛沒有使用映射模式。
 
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模式)一樣,執行兩個動作,它改變坐標軸的方向,垂直坐標軸的正方向向上;


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


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


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


圖十四、代碼效果圖
 

  MM_HIMETRIC使用與上述三種映射模式相同的坐標系,但它的坐標單位是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映射模式將每個邏輯單位(像素)除以20,實際上一twip等于1/1440 英寸,坐標系統仍然與上面幾種映射方式相同。
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 CRect Recto;
 dc.SetMapMode(MM_TWIPS);
 dc.SetViewportOrg(380, 220);
 . . .
}


圖十六、代碼效果圖
 
  四、自定義坐標系統
 
  目前為止,我們使用的映射模式可以允許我們選擇坐標軸的方向,但僅僅是Y軸的方向。而且,我們不能更改坐標系統的單位,這是因為各種映射模式(MM_TEXT, MM_HIENGLISH, MM_LOENGLISH, MM_HIMETRIC, MM_LOMETRIC, and MM_TWIPS)有固定的屬性集,例如坐標軸的方向和坐標單位等。在CAD應用程序中,如果你需要靈活設置坐標軸方向及坐標單位的話,應該怎么做呢?
 
  仔細研究下面的OnPaint()事件代碼,它繪制了一個200X200像素大小的紅邊、淺綠色背景的正方形,這個正方形的頂點在(-100,-100)處,右底端位于(100,100)處。同時,從坐標原點處繪制一個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);
}


圖十七、代碼效果圖
  
  正如你所看到的,我們只得到了正方形的右下部分,同時直線指向時鐘的三點到六點之間的方向。假定你想將坐標原點設置與窗口中央位置,或者是更精確一點,設置于點(340, 220)處,我們已經知道可以使用CDC::SetViewportOrg()(記住,這個函數只用來更改坐標原點,它并不影響坐標軸的方向及坐標單位。同時,需要注意的是,它使用的坐標單位是像素)函數,下面是一個例子(我們沒有規定映射模式,所以程序使用的是默認的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);
}


圖十八、代碼效果圖
 
 
  為了控制你自己應用程序中的坐標系統單位,坐標軸的方向,可以使用MM_ISOTROPIC 或MM_ANISOTROPIC映射模式。第一件事是調用CDC::SetMapMode()函數,并在兩個常量中選擇一個(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);
}


圖十九、代碼效果圖
 
 
  先拋開上面的圖片。當調用CDC::SetMapMode(),并使用MM_ISOTROPIC或 MM_ANISOTROPIC作為參數后,并沒有結束,這兩種映射方式允許我們改變坐標軸的正方向及坐標單位。這兩種映射方式的區別在于:MM_ISOTROPIC映射方式中水平、垂直坐標軸的單位相等,MM_ANISOTROPIC映射方式可以隨意控制水平及垂直方向的坐標單位長度。
 
  所以,在調用SetMapMode()函數并規定了MM_ISOTROPIC或MM_ANISOTROPIC映射模式后,你必須調用CDC:SetWindowExt()函數,這個函數用來計算老的或默認的坐標系中一個單位的長度。這個函數有兩個版本:
 
CSize SetWindowExt(int cx, int cy);
CSize SetWindowExt(SIZE size);
 
  如果使用第一版本,第一個參數CX說明了水平坐標軸上按照新的邏輯單位代表的長度,CY代表了垂直坐標軸上按照新的邏輯單位代表的長度。
 
  如果你知道按照新的坐標單位計算需要的邏輯尺寸的話,可以使用第二個版本的函數,例子代碼如下:
 
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);
}


圖二十、代碼效果圖
  
  調用SetWindowExt()函數后,緊接著應調用SetViewportExt()函數,它的任務是規定水平及垂直坐標軸的單位。我們可以這樣認為,SetWindowExt()函數對應著“窗口”,SetViewportExt()函數對應著“視口”。SetViewportExt()函數有兩個版本:
 
CSize SetViewportExt(int cx, int cy);
CSize SetViewportExt(SIZE size);
 
  上述兩個函數中的參數與“窗口”中的尺寸是相互對應的,它的單位是像素。為了進一步說明這兩個函數的使用,我對這兩個函數進行了重新說明:
 
SetWindowExt(int Lwidth, int Lheight) //參數的單位為邏輯單位(Logical);
SetViewportExt(int Pwidth, int Pheight) //參數的單位為像素(Pixel);
 
  以x軸為例(y軸類似),邏輯坐標系中的x軸的單位刻度=| Pwidth | / | Lwidth |。這表示x軸上一個邏輯單位等于多少個像素。比如我們先通過GetDeviceCap(LOGPIXELSX)獲得在我們的顯示器上每英寸等于多少個像素,設為p,然后我們將它賦給Pwidth,將Lwidth賦成2,即Pwidth / Lwidth=p / 2。那么,此時邏輯坐標系x軸上的單位刻度就是p / 2個像素;又由于p個像素是代表一個英寸的,所以此時的邏輯坐標系x軸上的單位刻度同時也是半個英寸。還有一點要注意的是,如果Lwidth與Pwidth同號,邏輯坐標的x軸方向與設備坐標系中的x軸方向相同,否則相反。
 
  此外,當使用MM_ISOTROPIC模式時,如果通過計算window與viewport范圍的比值得到兩個方向的單位刻度值不同,那么將會以較小的那個為準。
 
  下面是一個例子:
 
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);
}


圖二十一、代碼效果圖
  五、實例代碼
 
  為了靈活使用邏輯坐標系,下面給出了幾個例子代碼:
 
  例1:繪制帶箭頭的坐標軸
 
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:繪制網格 

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:點狀網格
 
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 獨孤九劍 閱讀(195) 評論(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>
            精品成人一区| 在线看日韩av| 亚洲欧美日韩一区二区三区在线| 亚洲乱码国产乱码精品精天堂| 欧美黄色一级视频| 一二三区精品| 亚洲综合社区| 亚洲成色精品| 亚洲欧洲美洲综合色网| 欧美精品日日鲁夜夜添| 一区二区三区免费网站| 亚洲一区欧美二区| 精东粉嫩av免费一区二区三区| 欧美激情日韩| 欧美日韩在线播放三区| 久久精品中文字幕一区二区三区| 久久激情视频| 一区二区三区精品视频| 亚洲免费视频中文字幕| 亚洲二区在线视频| 99日韩精品| 伊伊综合在线| 一本色道久久99精品综合| 国产欧美精品一区二区三区介绍| 美女视频黄a大片欧美| 欧美日韩国产一区二区三区地区| 欧美专区18| 欧美国产日韩视频| 久久精品亚洲| 欧美日韩一区二区在线播放| 久久久99免费视频| 欧美日韩高清免费| 免费不卡在线观看| 国产精品视频导航| 亚洲高清一区二| 国产亚洲一区在线播放| 日韩一级免费观看| 尹人成人综合网| 亚洲欧美久久久| 99精品热视频只有精品10| 欧美在线黄色| 亚洲男人天堂2024| 欧美成人中文字幕| 久久性天堂网| 国产精品天天摸av网| 亚洲欧洲一二三| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲国产精品一区二区久 | 久久国产精品72免费观看| 欧美黄色日本| 免费观看国产成人| 国内精品视频久久| 亚洲欧美在线高清| 午夜精品视频在线| 欧美日韩国产成人| 亚洲欧洲综合| 亚洲国产精品一区二区久| 久久精品三级| 久久久国产视频91| 国产伊人精品| 欧美夜福利tv在线| 久久激情网站| 国产三级欧美三级| 亚洲欧洲99久久| 欧美综合国产| 国产一区二区在线观看免费| 香蕉成人伊视频在线观看| 亚洲欧美日韩高清| 国产精品高清网站| 亚洲图片自拍偷拍| 欧美一区二区三区播放老司机| 国产精品成人观看视频免费| 99在线精品视频在线观看| 亚洲一区二区影院| 国产精品美女久久久浪潮软件| 一本久道久久综合中文字幕| 亚洲伊人一本大道中文字幕| 国产精品人成在线观看免费 | 欧美日韩免费观看一区二区三区| 亚洲精品影视| 亚洲男女自偷自拍| 国产欧美在线观看| 久久精品国产免费| 欧美成人精品在线视频| 日韩系列欧美系列| 国产精品二区在线| 久久精品成人一区二区三区| 欧美顶级艳妇交换群宴| 日韩一区二区精品在线观看| 欧美午夜欧美| 欧美一区二区三区视频免费播放| 久久综合久久综合久久综合| 亚洲欧洲一区二区三区久久| 欧美日韩三区四区| 午夜在线精品| 亚洲国产精品热久久| 亚洲综合色激情五月| 国产综合香蕉五月婷在线| 女同性一区二区三区人了人一| 一区二区国产日产| 久久在线免费视频| 亚洲视频综合| 影音先锋日韩资源| 欧美亚洲第一区| 免费人成精品欧美精品| 一区二区三区福利| 欧美国产成人在线| 性欧美video另类hd性玩具| 亚洲欧洲精品成人久久奇米网| 国产精品视频久久| 欧美日韩高清在线观看| 久久久精品日韩| 在线亚洲电影| 亚洲精品一区二区网址| 久久一二三国产| 午夜精品福利一区二区三区av| 亚洲国产精品一区二区第四页av| 国产精品一香蕉国产线看观看| 欧美激情一区三区| 久久久国产一区二区三区| 亚洲一区二区在线免费观看| 亚洲观看高清完整版在线观看| 亚洲欧美视频一区| 亚洲黑丝在线| 国产情人节一区| 老司机久久99久久精品播放免费| 午夜精品久久久久久久久| 亚洲高清电影| 免费一级欧美片在线播放| 亚洲在线观看视频网站| 日韩一级网站| 亚洲激情网站| 国产最新精品精品你懂的| 欧美三级午夜理伦三级中视频| 欧美91大片| 久久久久免费视频| 亚洲男女毛片无遮挡| 亚洲国产专区校园欧美| 欧美黄色aa电影| 久久久夜精品| 亚洲女女做受ⅹxx高潮| 亚洲日本成人女熟在线观看| 国产一区二区黄| 国产精品久久夜| 欧美午夜无遮挡| 欧美激情精品久久久| 欧美日韩国产成人在线观看| 久久综合给合| 久久夜色精品国产噜噜av| 欧美一区二区三区视频在线| 亚洲色诱最新| 99ri日韩精品视频| 亚洲精品乱码久久久久久久久 | 午夜精品www| 午夜精品久久久久久久久| 一本色道久久综合亚洲精品按摩 | 韩国av一区二区三区| 国产精品美女在线| 国产精品乱人伦一区二区| 欧美日韩国产123区| 欧美日本韩国一区二区三区| 欧美视频成人| 国产精品乱码一区二区三区| 国产精品扒开腿做爽爽爽软件| 欧美天天在线| 韩国v欧美v日本v亚洲v| 国内伊人久久久久久网站视频| 黄色亚洲大片免费在线观看| 黑丝一区二区三区| 国产视频在线观看一区二区| 亚洲国产天堂久久国产91| 最新中文字幕一区二区三区| 最新亚洲激情| 亚洲午夜在线观看视频在线| 久久精品最新地址| 嫩草国产精品入口| 欧美激情导航| 在线天堂一区av电影| 亚洲在线视频免费观看| 久久久久五月天| 欧美福利在线观看| 欧美日韩日日夜夜| 国产精品二区在线| 国内精品久久久久影院优| 亚洲欧洲免费视频| 亚洲综合成人婷婷小说| 久久久久久久91| 欧美激情精品久久久久久蜜臀 | 91久久中文字幕| 亚洲一级片在线看| 久久久五月婷婷| 欧美日韩人人澡狠狠躁视频| 国产精品免费看| 亚洲高清视频的网址| 亚洲图片在线| 免费黄网站欧美| 在线一区免费观看| 久久亚洲综合色| 国产精品毛片在线看| 夜夜嗨av一区二区三区免费区|