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

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
基于VC++的GDI常用坐標系統(tǒng)及應用 (4)
 四、自定義坐標系統(tǒng) 
  目前為止,我們使用的映射模式可以允許我們選擇坐標軸的方向,但僅僅是Y軸的方向。而且,我們不能更改坐標系統(tǒng)的單位,這是因為各種映射模式(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)處,我們已經(jīng)知道可以使用CDC::SetViewportOrg()(記住,這個函數(shù)只用來更改坐標原點,它并不影響坐標軸的方向及坐標單位。同時,需要注意的是,它使用的坐標單位是像素)函數(shù),下面是一個例子(我們沒有規(guī)定映射模式,所以程序使用的是默認的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);
}


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


圖十九、代碼效果圖
 
 
  先拋開上面的圖片。當調(diào)用CDC::SetMapMode(),并使用MM_ISOTROPIC或 MM_ANISOTROPIC作為參數(shù)后,并沒有結(jié)束,這兩種映射方式允許我們改變坐標軸的正方向及坐標單位。這兩種映射方式的區(qū)別在于:MM_ISOTROPIC映射方式中水平、垂直坐標軸的單位相等,MM_ANISOTROPIC映射方式可以隨意控制水平及垂直方向的坐標單位長度。
 
  所以,在調(diào)用SetMapMode()函數(shù)并規(guī)定了MM_ISOTROPIC或MM_ANISOTROPIC映射模式后,你必須調(diào)用CDC:SetWindowExt()函數(shù),這個函數(shù)用來計算老的或默認的坐標系中一個單位的長度。這個函數(shù)有兩個版本:
 
CSize SetWindowExt(int cx, int cy);
CSize SetWindowExt(SIZE size);
 
  如果使用第一版本,第一個參數(shù)CX說明了水平坐標軸上按照新的邏輯單位代表的長度,CY代表了垂直坐標軸上按照新的邏輯單位代表的長度。
 
  如果你知道按照新的坐標單位計算需要的邏輯尺寸的話,可以使用第二個版本的函數(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ù)后,緊接著應調(diào)用SetViewportExt()函數(shù),它的任務是規(guī)定水平及垂直坐標軸的單位。我們可以這樣認為,SetWindowExt()函數(shù)對應著“窗口”,SetViewportExt()函數(shù)對應著“視口”。SetViewportExt()函數(shù)有兩個版本:
 
CSize SetViewportExt(int cx, int cy);
CSize SetViewportExt(SIZE size);
 
  上述兩個函數(shù)中的參數(shù)與“窗口”中的尺寸是相互對應的,它的單位是像素。為了進一步說明這兩個函數(shù)的使用,我對這兩個函數(shù)進行了重新說明:
 
SetWindowExt(int Lwidth, int Lheight) //參數(shù)的單位為邏輯單位(Logical);
SetViewportExt(int Pwidth, int Pheight) //參數(shù)的單位為像素(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);
}


圖二十一、代碼效果圖
 
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
基于VC++的GDI常用坐標系統(tǒng)及應用
坐標系統(tǒng)與坐標變換
簡單的MFC畫正弦曲線
在Visual C++中透明浮動按鍵的實現(xiàn)
MFC畫筆CPen類
內(nèi)存DC
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服