關(guān)于這兩個(gè)函數(shù)的解釋,我就不詳細(xì)敘述了,,我的前兩篇博客關(guān)于這兩個(gè)函數(shù)的內(nèi)容已經(jīng)講的比較清楚了,,有需要的同學(xué)可以找一找!我只是記錄一下我自己使用的心得,!
先確定幾點(diǎn):
1.默認(rèn)的時(shí)候,,視口坐標(biāo)原點(diǎn)在屏幕顯示部分的左上角。
先來(lái)熱一下身:
- void CmfcAppView::OnDraw(CDC* pDC)
- {
- CmfcAppDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- if (!pDoc)
- return;
-
- CRect rect;
- GetClientRect(&rect);
- CBrush brush(RGB(255, 0, 0)); /*紅色的畫(huà)刷*/
- CPen pen(PS_SOLID, 3, RGB(0, 0, 255)); /*藍(lán)色的筆*/
- pDC->SelectObject(&brush);
- pDC->SelectObject(&pen);
-
- /*
- * 通常這個(gè)SetViewportOrg函數(shù)調(diào)用多次實(shí)際上就只有最后的一次起效果,!如同下面的語(yǔ)句,。
- * pDC->SetWindowOrg(100, 100),這句有或者沒(méi)有都不影響結(jié)果!
- * 我是這樣理解的,程序里記錄著一張邏輯坐標(biāo)表.第一次時(shí),邏輯坐標(biāo)系原點(diǎn)被移至(100, 100)這個(gè)點(diǎn),!
- *當(dāng)然,,這個(gè)點(diǎn)是相對(duì)于程序記錄的那個(gè)邏輯坐標(biāo)系為準(zhǔn)的。第二次時(shí),,邏輯坐標(biāo)系被移至原點(diǎn)(-100, -100)
- *這個(gè)點(diǎn),,這個(gè)點(diǎn)也是相對(duì)于程序記錄的那個(gè)邏輯坐標(biāo)系而言的,。我們看到,第一次等于沒(méi)做。
- * (每次調(diào)用SetWindowOrg都以這張邏輯坐標(biāo)為準(zhǔn)!)
- */
- pDC->SetWindowOrg(100, 100);
- pDC->SetWindowOrg(-100, -100);
- pDC->Rectangle(0, 0, 150, 150);
- }
結(jié)果是:
再來(lái)看一看這段:
- void CmfcAppView::OnDraw(CDC* pDC)
- {
- CmfcAppDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- if (!pDoc)
- return;
-
- CRect rect;
- GetClientRect(&rect);
-
- CBrush brush(RGB(255, 0, 0)); /*紅色的畫(huà)刷*/
- CPen pen(PS_SOLID, 3, RGB(0, 0, 255)); /*藍(lán)色的筆*/
- pDC->SelectObject(&brush);
- pDC->SelectObject(&pen);
-
- pDC->Rectangle(0, 0, 150, 150); /*先畫(huà)一個(gè)矩形*/
-
- pDC->SetWindowOrg(-100, -100); /*將邏輯坐標(biāo)系原點(diǎn)移至(-100, -100),相對(duì)于原來(lái)的那個(gè)邏輯坐標(biāo)系而言*/
- pDC->Rectangle(0, 0, 150, 150); /*再畫(huà)一個(gè)矩形*/
-
- /*
- * 看了結(jié)果,,有人很疑惑,,怎么上面那個(gè)矩形沒(méi)有隨著邏輯坐標(biāo)一起移動(dòng)?
- * 整個(gè)程序的客戶區(qū)你可以看做是一塊畫(huà)布啦,!怎么會(huì)有已經(jīng)畫(huà)好的東西,,還可以移動(dòng)的道理,你說(shuō)算是吧,?
- *
- */
- }
結(jié)果是:
好吧,!接下來(lái)搞點(diǎn)有技術(shù)含量的:
- void CmfcAppView::OnDraw(CDC* pDC)
- {
- CmfcAppDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- if (!pDoc)
- return;
-
- CRect rect;
- GetClientRect(&rect);
-
- CBrush brush(RGB(255, 0, 0)); /*紅色的畫(huà)刷*/
- CPen pen(PS_SOLID, 3, RGB(0, 0, 255)); /*藍(lán)色的筆*/
- pDC->SelectObject(&brush);
- pDC->SelectObject(&pen);
-
- pDC->SetWindowOrg(100, 100); /*將邏輯坐標(biāo)系原點(diǎn)移至(-100, -100),相對(duì)于原來(lái)的那個(gè)邏輯坐標(biāo)系而言*/
- pDC->Rectangle(0, 0, 150, 150); /*再畫(huà)一個(gè)矩形*/
-
- }
結(jié)果是:
有人奇怪上面的結(jié)果了,為什么矩形只剩下大約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)); /*紅色的畫(huà)刷*/
- CPen pen(PS_SOLID, 3, RGB(0, 0, 255)); /*藍(lán)色的筆*/
- pDC->SelectObject(&brush);
- pDC->SelectObject(&pen);
-
- pDC->SetViewportOrg(100, 100); /*將視口坐標(biāo)系原點(diǎn)移至(-100, -100),相對(duì)于原來(lái)的那個(gè)視口坐標(biāo)系而言*/
- pDC->Rectangle(0, 0, 150, 150); /*畫(huà)一個(gè)矩形*/
-
- }
想一想結(jié)果,,然后和真實(shí)的結(jié)果比對(duì)一下:
我的解釋如下:
在看一下這段代碼,然后猜一下結(jié)果,?
- void CmfcAppView::OnDraw(CDC* pDC)
- {
- CmfcAppDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- if (!pDoc)
- return;
-
- CRect rect;
- GetClientRect(&rect);
-
- CBrush brush(RGB(255, 0, 0)); /*紅色的畫(huà)刷*/
- CPen pen(PS_SOLID, 3, RGB(0, 0, 255)); /*藍(lán)色的筆*/
- pDC->SelectObject(&brush);
- pDC->SelectObject(&pen);
-
- pDC->SetViewportOrg(100, 100); /*將視口坐標(biāo)系原點(diǎn)移至(100, 100),相對(duì)于原來(lái)的那個(gè)視口坐標(biāo)系而言*/
- pDC->SetWindowOrg(-100, -100); /*將邏輯(窗口)坐標(biāo)系原點(diǎn)移至(100, 100),相對(duì)于原來(lái)的那個(gè)邏輯坐標(biāo)系而言*/
- pDC->Rectangle(0, 0, 150, 150); /*畫(huà)一個(gè)矩形*/
-
- }
讓我們來(lái)核對(duì)一下:
是不是感到有些奇怪,?看一下我的解釋!
對(duì)于上面的第3步,,有人感到很奇怪,,為什么畫(huà)矩形的時(shí)候是以變換前的邏輯坐標(biāo)為準(zhǔn)的?而不是以變換后的邏輯坐標(biāo)為準(zhǔn)的,?
看一下結(jié)果的精確測(cè)量:
看見(jiàn)沒(méi)有,,測(cè)量的結(jié)果說(shuō)明,我上面的原理圖是正確的,!
關(guān)于解釋,我的解釋是:SetWindowOrg函數(shù)并未實(shí)際上改變邏輯坐標(biāo),,只是通知程序應(yīng)該怎樣映射,該把邏輯坐標(biāo)的這個(gè)點(diǎn)映射到視口坐標(biāo)的哪個(gè)點(diǎn),!應(yīng)該比較清楚了吧,?
最好,這兩個(gè)函數(shù)別同時(shí)用,,因?yàn)閮蓚€(gè)混在一起,,很容易糊涂!
既然都講了這么多了,,順帶提一下SetViewportExt和SetWindowExt兩個(gè)函數(shù)吧,!這兩個(gè)函數(shù)只在映射模式為MM_ISOTROPIC和MM_ANISOTROPIC下有效!兩個(gè)函數(shù)里面參數(shù)的值并不重要,,重要的只是他們的比值罷了,!
看這段代碼:
- pDC->SetMapMode(MM_ANISOTROPIC);
- pDC->SetWindowExt(1024,768);
- pDC->SetViewportExt(10240,7680); //表示一個(gè)窗口單位,也就是在x軸上邏輯單位對(duì)應(yīng)10個(gè)視口單位,當(dāng)然屏幕上表示像素,,在y軸上亦然
- pDC->Rectangle(0,0,100,100);
和下面這段代碼:
- pDC->SetMapMode(MM_ANISOTROPIC);
- pDC->SetWindowExt(10240,7680);
- pDC->SetViewportExt(102400,76800); //表示一個(gè)窗口單位,,也就是在x軸上邏輯單位對(duì)應(yīng)10個(gè)視口單位,當(dāng)然屏幕上表示像素,,在y軸上亦然
- pDC->Rectangle(0,0,100,100);
兩者在效果上沒(méi)有區(qū)別,!
還有,兩者的正負(fù)會(huì)影響坐標(biāo)軸的方向,!當(dāng)然,,這不是這篇文章的重點(diǎn)!
|