在开发具有缩放功能的应用程序时,经常需要在不同的地方设置缩放比例,这可能会导致代码的冗余和难以维护。本文将介绍一种通过继承CZoomView类来实现应用程序缩放功能的方法,并通过MM_ISOTROPIC映射模式来设置视图和窗口区域的比例。
首先,使用应用程序向导创建一个Doc/View应用程序。然后,将CView类更改为继承自CZoomView而不是CView或CScrollView。这样,应用程序就具备了缩放功能。当想要设置应用程序的缩放比例时,只需调用SetZoomScale()方法即可。
void CDemoZoomView::OnViewZoomin() {
SetZoomScale(m_zoomFactor + 1.0f);
}
void CDemoZoomView::OnViewZoomout() {
SetZoomScale(m_zoomFactor - 1.0f);
}
在开发过程中,发现其他开发者需要在所有绘图函数中创建缩放变量并进行乘法运算,这使得使用起来并不方便。因此,尝试寻找一种可以在一个地方设置缩放比例并应用于所有绘图代码的方法。幸运的是,存在一些映射模式可以设置视口和窗口区域之间的比例,而MM_ISOTROPIC正是答案。可以通过调用SetWindowExt()和SetViewPortExt()来设置这个比例。
int CZoomView::SetMapMode(CDC* pDC) {
int previousMode = pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(100, 100);
pDC->SetViewportExt(FloatToInt(100*m_zoomFactor), FloatToInt(100*m_zoomFactor));
return previousMode;
}
SetWindowExt()和SetViewPortExt()是CDC类的方法。如果想让它们易于使用,用户就不需要知道如何操作CDC类的实例的。因此,CZoomView类有一个CDC类的实例。这个实例将通过OnDraw()函数发送。用户将调用常规的绘图函数,缩放功能将自动应用。
由于CZoomView基于CScrollView,因此需要关注逻辑点和设备点。CZoomView提供了DPtoLP和LPtoDP函数。用户可以像往常一样使用CDC实例来使用它们。
void CDemoZoomView::OnLButtonDown(UINT nFlags, CPoint point) {
if (m_bSelectMode == FALSE) {
m_bSelectMode = TRUE;
m_ptStart = point;
DPtoLP(&m_ptStart);
m_rubberBand.SetRect(m_ptStart, m_ptStart);
Invalidate(FALSE);
}
CZoomView::OnLButtonDown(nFlags, point);
}