资源简介
在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
评论
共有 条评论