• 大小: 6KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-05-22
  • 语言: 其他
  • 标签: 缩放视图  

资源简介

在CZoomView类的基础上加入了一些实用的功能:如视图拖动、缩放、滚动、复制视图等功能,并将注释改成中文,以便大家学习参考。

资源截图

代码片段和文件信息

#include “StdAfx.h“
#include “ZoomView.h“
#include “resource.h“

#ifdef _DEBUG
#undef THIS_FILE
static char baseD_CODE THIS_FILE[] = __FILE__;
#endif


#define MAXZOOMIN 4 //最大缩放比例因子
#define PICKMARGIN 10 //点缩放与矩形缩放鼠标拾取的界限值

BEGIN_MESSAGE_MAP(CZoomView CScrollView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_MOUSEWHEEL()
ON_WM_SETCURSOR()
ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()

IMPLEMENT_DYNAMIC(CZoomViewCScrollView)
CZoomView::CZoomView(void):CScrollView()
{
m_zoomMode=MODE_ZOOMOFF;
m_bCaptured=FALSE;
m_zoomScale=1.0f;
m_ptDragRect.SetRectEmpty();
m_hZoomInCursor=::LoadCursor(AfxGetInstanceHandle()MAKEINTRESOURCE(IDC_ZOOMIN_CURSOR));
m_hZoomOutCursor=::LoadCursor(AfxGetInstanceHandle()MAKEINTRESOURCE(IDC_ZOOMOUT_CURSOR));
m_hMoveCursor=::LoadCursor(AfxGetInstanceHandle()MAKEINTRESOURCE(IDC_MOVE_CURSOR));
m_bCenter=TRUE;
}

CZoomView::~CZoomView(void)
{
if (m_hZoomInCursor)
DestroyCursor(m_hZoomInCursor);
if (m_hZoomOutCursor)
DestroyCursor(m_hZoomOutCursor);
if (m_hMoveCursor)
DestroyCursor(m_hMoveCursor);
}

void CZoomView::OnPrepareDC(CDC* pDC CPrintInfo* pInfo)
{
// TODO: 在此添加专用代码和/或调用基类
#ifdef _DEBUG
if (m_nMapMode != MM_ANISOTROPIC) {
TRACE0(“Error: must call SetZoomSizes() before painting zoom view\n“);
ASSERT(FALSE);
return;
}
#endif //_DEBUG
ASSERT_VALID(pDC);
ASSERT(m_totalLog.cx>=0 && m_totalLog.cy>=0);
ASSERT(m_totalDev.cx>=0 && m_totalDev.cy>=0);
//设置窗口坐标系和设备坐标系的映射方式,并设置窗口和视口的原点及坐标范围
pDC->SetMapMode(m_nMapMode);  //映射方式
pDC->SetWindowExt(m_totalLog); //窗口范围
CPoint ptVpOrg;
if (!pDC->IsPrinting())
{
pDC->SetViewportExt(m_totalDev);  //设置设备坐标系中的视口范围
ASSERT(pDC->GetWindowOrg()==CPoint(00));  //默认的窗口坐标系原点为0
ptVpOrg=-GetDeviceScrollPosition();  //设备坐标系原点
//是否在客户区中间显示视图
if (m_bCenter)
{
CRect rc;
GetClientRect(&rc);
if (m_totalDev.cx ptVpOrg.x=(rc.Width()-m_totalDev.cx)/2;
if (m_totalDev.cy ptVpOrg.y=(rc.Height()-m_totalDev.cy)/2;
}
}
else
{
CSize  printSize;
printSize.cx = pDC->GetDeviceCaps(HORZRES);
printSize.cy = pDC->GetDeviceCaps(VERTRES);
PersistRatio(m_totalLog printSize ptVpOrg);
pDC->SetViewportExt(printSize);
}
pDC->SetViewportOrg(ptVpOrg);  //设置设备坐标系原点
CScrollView::OnPrepareDC(pDC pInfo);
}

void CZoomView::SetZoomSizes(SIZE sizeTotal const SIZE& sizePage const SIZE& sizeLine)
{
ASSERT(sizeTotal.cx>=0 && sizeTotal.cy>=0);
m_nMapMode=MM_ANISOTROPIC;  //设置映射模式
m_totalLog=sizeTotal;  //设置逻辑坐标系范围
//以下是将窗口坐标的范围转换为设备坐标范围
{
CWindowDC dc(NULL);
dc.SetMapMode(m_nMapMode);
m_totalDev=m_totalLog;
dc.LPtoDP((LPPOINT)&m_totalDev);
}
//将当前设备坐标范围负值给初始设备坐标坐标范围
m_origTotalDev=m_totalDev;
m_origPageDev=sizePage;
m_origLineDev=sizeLine;
//重新计算并更新滚动条
CalcBars();
//通知视图进行缩放
NotifyZoom(); 
}

void CZoomView::CenterOnLogicalPoint(CPoint ptCenter)
{
//将视图中某点的逻辑坐标转换为设备坐标
Vi

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      15052  2014-02-24 05:35  CZoomView类\ZoomView.cpp

     文件       3117  2014-02-24 05:30  CZoomView类\ZoomView.h

     目录          0  2014-02-24 23:59  CZoomView类

----------- ---------  ---------- -----  ----

                18169                    3


评论

共有 条评论

相关资源