資源簡介
在CZoomView類的基礎(chǔ)上加入了一些實(shí)用的功能:如視圖拖動(dòng)、縮放、滾動(dòng)、復(fù)制視圖等功能,并將注釋改成中文,以便大家學(xué)習(xí)參考。

代碼片段和文件信息
#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?//點(diǎn)縮放與矩形縮放鼠標(biāo)拾取的界限值
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:?在此添加專用代碼和/或調(diào)用基類
#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);
//設(shè)置窗口坐標(biāo)系和設(shè)備坐標(biāo)系的映射方式,并設(shè)置窗口和視口的原點(diǎn)及坐標(biāo)范圍
pDC->SetMapMode(m_nMapMode);??//映射方式
pDC->SetWindowExt(m_totalLog);?//窗口范圍
CPoint?ptVpOrg;
if?(!pDC->IsPrinting())
{
pDC->SetViewportExt(m_totalDev);??//設(shè)置設(shè)備坐標(biāo)系中的視口范圍
ASSERT(pDC->GetWindowOrg()==CPoint(00));??//默認(rèn)的窗口坐標(biāo)系原點(diǎn)為0
ptVpOrg=-GetDeviceScrollPosition();??//設(shè)備坐標(biāo)系原點(diǎn)
//是否在客戶區(qū)中間顯示視圖
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);??//設(shè)置設(shè)備坐標(biāo)系原點(diǎn)
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;??//設(shè)置映射模式
m_totalLog=sizeTotal;??//設(shè)置邏輯坐標(biāo)系范圍
//以下是將窗口坐標(biāo)的范圍轉(zhuǎn)換為設(shè)備坐標(biāo)范圍
{
CWindowDC?dc(NULL);
dc.SetMapMode(m_nMapMode);
m_totalDev=m_totalLog;
dc.LPtoDP((LPPOINT)&m_totalDev);
}
//將當(dāng)前設(shè)備坐標(biāo)范圍負(fù)值給初始設(shè)備坐標(biāo)坐標(biāo)范圍
m_origTotalDev=m_totalDev;
m_origPageDev=sizePage;
m_origLineDev=sizeLine;
//重新計(jì)算并更新滾動(dòng)條
CalcBars();
//通知視圖進(jìn)行縮放
NotifyZoom();?
}
void?CZoomView::CenterOnLogicalPoint(CPoint?ptCenter)
{
//將視圖中某點(diǎn)的邏輯坐標(biāo)轉(zhuǎn)換為設(shè)備坐標(biāo)
Vi
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件??????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
評(píng)論
共有 條評(píng)論