On
{
根據窗口大小算出新的圖形坐標;
使用計算出的圖形坐標繪制圖形;
}
這樣每次拖動(dòng)后,On
*****************************************************************************************************************************************
'視' (View) 是 '窗口' (Window)的一種。像你現在看到的瀏覽器,整個(gè)IE就是'窗口'(Screen/Window),而顯示網(wǎng)頁(yè)的區域就是'視口'(Client/View)。視口是顯示文檔的區域,即客戶(hù)區!
窗口是依據邏輯坐標的,邏輯坐標可以是圖素、毫米、英寸或者您想要的任何其它單位。您在GDI繪圖函數中指定邏輯窗口坐標;而視口是相對于設備坐標而言的。
MM_ISOTROPIC --> 長(cháng)寬比例保持一致,相當于設備長(cháng)寬比變了后,圖形也不會(huì )變形
MM_ANISOTROPIC --> 長(cháng)寬比例根據設備坐標的長(cháng)寬自動(dòng)調整,可以不成比例
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(XRange/Rect.width, YRange/Rect.Height); // XRange指x方向需要畫(huà)的點(diǎn)數,Rect.width是畫(huà)布寬度
pDC->SetViewportExt(1,1); //設置1,意思是指在一個(gè)像素點(diǎn)上能畫(huà)XRange/Rect.width個(gè)點(diǎn)
pDC->SetViewportOrg((rc.right+rc.left)/2, (rc.bottom+rc.top)/2); //將設備坐標點(diǎn)((rc.right+rc.left)/2, (rc.bottom+rc.top)/2)映射為邏輯坐標原點(diǎn)(0, 0)
你定了窗口的大小,視口的大小,那么你在窗口上的畫(huà)圖操作映射的視口(也就是顯示設備上)的比例也就確定了 :視口大小/窗口大小,即 XRange/Rect.width 和 YRange/Rect.Height。這樣點(diǎn)的一個(gè)像素大小在顯示設備上將按這個(gè)比例縮放(即一個(gè)像素點(diǎn)能畫(huà)幾個(gè)點(diǎn))。從畫(huà)圖效果應該就能看出來(lái)。
注釋?zhuān)?br style="line-height: 25px; ">0、用設備上下文繪圖的函數,其坐標參數值都是值邏輯單位,在默認情況下,映射模式為MM_TEXT,也就是說(shuō)每個(gè)邏輯單位1對應1個(gè)像素(設備單位)。
1、窗口和視口(viewport)的概念
窗口用邏輯范圍表示大小
視口用設備范圍表示大小
這里所謂的窗口和視圖只是一種大小范圍的描述方式,主要是為了理解MapMode而劃分的概念
2、邏輯單位和設備單位的映射
SetWindowExt() 設定窗口的邏輯范圍
SetViewportExt() 設定視口的物理大小(參數值為設備單位,也就是像素大小)
SetWindowExt 必須要和SetViewportExt結合使用,并且只用在MM_ISOTROPIC和MM_ANISOTROPIC 模式下。在MM_ISOTROPIC 模式下SetWindowExt 必須在SetViewportExt之前調用。
例如:
pDC->SetMapMode(MM_ISOTROPIC); // 等比例模式
pDC->SetWindowExt(1000, -1000); // 設置窗口設為1000*1000的矩形
pDC->SetViewportExt(500, 500); // 設置視圖設為500*500像素的矩形,
// 由此可計算出每個(gè)像素對應2個(gè)邏輯單位:
// x坐標 1000/500 = 2, 向左為正向
// y坐標 -1000/500 = -2, 向下為負向
同理如下代碼:
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(1000, 1000);
pDC->SetViewportExt(500, -500);
產(chǎn)生的效果是和上述代碼的效果是一樣的。
3、坐標原點(diǎn)
默認情況下,邏輯坐標原點(diǎn)和設備坐標原點(diǎn)是一致的,都是(0, 0),即窗口左上角設備坐標原點(diǎn)總是在左上角。
可用如下兩個(gè)函數改變(移動(dòng))邏輯坐標原點(diǎn):
SetWindowOrg() // 將設備坐標原點(diǎn)(0, 0)映射為某個(gè)邏輯坐標點(diǎn)
SetViewportOrg() // 將某個(gè)設備坐標點(diǎn)映射為邏輯坐標原點(diǎn)(0, 0)
SetWindowOrg 和SetViewportOrg可起到相同的效果,一般只用其中一個(gè)。
例如:
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(1000, 1000);
pDC->SetViewportExt(500, 500); // 由此可計算出每個(gè)設備坐標單位和邏輯單位的比例是1:2
// 一下兩句的效果都是一樣的
pDC->SetWindowOrg(-40, -40); // 將設備坐標原點(diǎn)(0, 0)設置映射邏輯坐標點(diǎn)(-40, -40)
// pDC->SetViewportOrg(20, 20); // 將設備坐標點(diǎn)(20, 20)映射為邏輯坐標原點(diǎn)(0, 0)
// 為什么是20 呢?因為每個(gè)設備坐標單位和邏輯單位的比例是 1:2
pDC->Rectangle(0, 0, 500, 300);
//若需將某點(diǎn)(x,y)畫(huà)到所設置的新的原點(diǎn)(0,0)上,只需使用
pDC->SetPixel(x-x,y-y,RGB(123,25,0));
//如果想畫(huà)一個(gè)大點(diǎn)的實(shí)心點(diǎn),則可以首先定義一個(gè)CBrush對象,之后將它SelectObject到pDC中,最后使用ecllipse函數。例子具體如下:
CBrush hBrush(RGB(123,25,0)); //定義畫(huà)刷
CBrush *pOldBrush = pDC->SelectObject(&hBrush); //選到設備中去
pDC->Ellipse(pt-10,pt-10,pt+10,pt+10); //畫(huà)一個(gè)半徑為10個(gè)設備單位的圓
//鼠標點(diǎn)擊處pt相對于矩形rt中新原點(diǎn)(中心點(diǎn))的位置(xpt,ypt):
if(pt.x>rt.top && pt.y<rt.bottom && pt.x<rt.right && pt.y>rt.top)
{
// xpt = (pt.x-rt.left)*(XRange/rt.width)-(XRange/rt.width)*(rt.right-rt.left)/2);
// ypt = - ((pt.y-rt.top)*(YRange/rt.Height)-((YRange/rt.Height)*(rt.bottom-rt.top)/2));
// AfxMessageBox(" button in rect ");
UpdateData(FALSE);
}
4、通過(guò)SetMapMode 函數可改變映射模式。
5、用戶(hù)坐標值和屏幕坐標值的互相轉化函數
CWnd::ClientToScreen 和 CWnd::ScreenToClient
6、坐標轉換函數
CDC::LPtoDP 和 CDC::DPtoLP
聯(lián)系客服