先確定幾點:
1.默認的時候,視口座標原點在屏幕顯示部分的左上角。
先來熱一下身:
-
void CmfcAppView::OnDraw(CDC* pDC)
-
{
-
CmfcAppDoc* pDoc = GetDocument();
-
ASSERT_VALID(pDoc);
-
if (!pDoc)
-
return;
-
-
CRect rect;
-
GetClientRect(&rect);
-
CBrush brush(RGB(255, 0, 0));
-
CPen pen(PS_SOLID, 3, RGB(0, 0, 255));
-
pDC->SelectObject(&brush);
-
pDC->SelectObject(&pen);
-
-
-
-
-
-
-
-
-
-
pDC->SetWindowOrg(100, 100);
-
pDC->SetWindowOrg(-100, -100);
-
pDC->Rectangle(0, 0, 150, 150);
-
}
結果是:
再來看一看這段:
-
void CmfcAppView::OnDraw(CDC* pDC)
-
{
-
CmfcAppDoc* pDoc = GetDocument();
-
ASSERT_VALID(pDoc);
-
if (!pDoc)
-
return;
-
-
CRect rect;
-
GetClientRect(&rect);
-
-
CBrush brush(RGB(255, 0, 0));
-
CPen pen(PS_SOLID, 3, RGB(0, 0, 255));
-
pDC->SelectObject(&brush);
-
pDC->SelectObject(&pen);
-
-
pDC->Rectangle(0, 0, 150, 150);
-
-
pDC->SetWindowOrg(-100, -100);
-
pDC->Rectangle(0, 0, 150, 150);
-
-
-
-
-
-
-
}
結果是:
好吧!接下來搞點有技術含量的:
-
void CmfcAppView::OnDraw(CDC* pDC)
-
{
-
CmfcAppDoc* pDoc = GetDocument();
-
ASSERT_VALID(pDoc);
-
if (!pDoc)
-
return;
-
-
CRect rect;
-
GetClientRect(&rect);
-
-
CBrush brush(RGB(255, 0, 0));
-
CPen pen(PS_SOLID, 3, RGB(0, 0, 255));
-
pDC->SelectObject(&brush);
-
pDC->SelectObject(&pen);
-
-
pDC->SetWindowOrg(100, 100);
-
pDC->Rectangle(0, 0, 150, 150);
-
-
}
結果是:
有人奇怪上面的結果了,爲什麼矩形只剩下大約1/4的位置了?
看一下這段程序:
-
void CmfcAppView::OnDraw(CDC* pDC)
-
{
-
CmfcAppDoc* pDoc = GetDocument();
-
ASSERT_VALID(pDoc);
-
if (!pDoc)
-
return;
-
-
CRect rect;
-
GetClientRect(&rect);
-
-
CBrush brush(RGB(255, 0, 0));
-
CPen pen(PS_SOLID, 3, RGB(0, 0, 255));
-
pDC->SelectObject(&brush);
-
pDC->SelectObject(&pen);
-
-
pDC->SetViewportOrg(100, 100);
-
pDC->Rectangle(0, 0, 150, 150);
-
-
}
想一想結果,然後和真實的結果比對一下:
我的解釋如下:
在看一下這段代碼,然後猜一下結果?
-
void CmfcAppView::OnDraw(CDC* pDC)
-
{
-
CmfcAppDoc* pDoc = GetDocument();
-
ASSERT_VALID(pDoc);
-
if (!pDoc)
-
return;
-
-
CRect rect;
-
GetClientRect(&rect);
-
-
CBrush brush(RGB(255, 0, 0));
-
CPen pen(PS_SOLID, 3, RGB(0, 0, 255));
-
pDC->SelectObject(&brush);
-
pDC->SelectObject(&pen);
-
-
pDC->SetViewportOrg(100, 100);
-
pDC->SetWindowOrg(-100, -100);
-
pDC->Rectangle(0, 0, 150, 150);
-
-
}
讓我們來覈對一下:
是不是感到有些奇怪?看一下我的解釋!
對於上面的第3步,有人感到很奇怪,爲什麼畫矩形的時候是以變換前的邏輯座標爲準的?而不是以變換後的邏輯座標爲準的?
看一下結果的精確測量:
看見沒有,測量的結果說明,我上面的原理圖是正確的!
關於解釋,我的解釋是:SetWindowOrg函數並未實際上改變邏輯座標,只是通知程序應該怎樣映射,該把邏輯座標的這個點映射到視口座標的哪個點!應該比較清楚了吧?
最好,這兩個函數別同時用,因爲兩個混在一起,很容易糊塗!
既然都講了這麼多了,順帶提一下SetViewportExt和SetWindowExt兩個函數吧!這兩個函數只在映射模式爲MM_ISOTROPIC和MM_ANISOTROPIC下有效!兩個函數裏面參數的值並不重要,重要的只是他們的比值罷了!
看這段代碼:
-
pDC->SetMapMode(MM_ANISOTROPIC);
-
pDC->SetWindowExt(1024,768);
-
pDC->SetViewportExt(10240,7680);
-
pDC->Rectangle(0,0,100,100);
和下面這段代碼:
-
pDC->SetMapMode(MM_ANISOTROPIC);
-
pDC->SetWindowExt(10240,7680);
-
pDC->SetViewportExt(102400,76800);
-
pDC->Rectangle(0,0,100,100);
兩者在效果上沒有區別!
還有,兩者的正負會影響座標軸的方向!當然,這不是這篇文章的重點!
本文轉載自:
http://blog.csdn.net/lishuhuakai/article/details/18467255