65.9K
CodeProject 正在变化。 阅读更多。
Home

CZoomView

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.44/5 (27投票s)

2004年6月9日

Eclipse

1分钟阅读

viewsIcon

220082

downloadIcon

7127

一个提供“缩放”功能的类

引言

这个类基于CScrollView实现缩放功能。它提供了方便地设置应用程序缩放比例的函数。

使用代码

使用应用程序向导创建一个文档/视图应用程序。将您的CView类更改为继承自CZoomView,而不是CViewCScrollView。这样,您的应用程序就具有了缩放功能。当您想要设置应用程序的缩放比例时,只需调用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提供了DPtoLPLPtoDP函数。用户可以像使用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);
}

历史

  • 2004年7月30日
    • 减少无闪烁处理中不必要的位图分配。
  • 2004年6月5日
    • 添加了CZoomView,您可以将其代替CScrollView类使用。
© . All rights reserved.