// trackvw.cpp : implementation of the CTrackerView class
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "trackapp.h"
#include "trackdoc.h"
#include "trackvw.h"
#include "dialogs.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTrackerView
IMPLEMENT_DYNCREATE(CTrackerView, CView)
BEGIN_MESSAGE_MAP(CTrackerView, CView)
//{{AFX_MSG_MAP(CTrackerView)
ON_WM_LBUTTONDOWN()
ON_WM_SETCURSOR()
ON_COMMAND(ID_VIEW_SETHANDLESIZE, OnViewSethandlesize)
ON_COMMAND(ID_VIEW_SETMINIMUMSIZE, OnViewSetminimumsize)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTrackerView construction/destruction
CTrackerView::CTrackerView()
{
// TODO: add construction code here
}
CTrackerView::~CTrackerView()
{
}
/////////////////////////////////////////////////////////////////////////////
// CTrackerView drawing
static void SetNormalRect(CRect& rect, int left, int top, int width, int height)
{
// set it
rect.left = left;
rect.top = top;
rect.right = left + width;
rect.bottom = top + height;
// normalize it
int nTemp;
if (rect.left > rect.right)
{
nTemp = rect.left;
rect.left = rect.right;
rect.right = nTemp;
}
if (rect.top > rect.bottom)
{
nTemp = rect.top;
rect.top = rect.bottom;
rect.bottom = nTemp;
}
}
void CTrackerView::OnDraw(CDC* pDC)
{
CTrackerDoc* pDoc = GetDocument();
CBrush* pOldBrush = NULL;
TRY
{
// draw inside in various colors
CBrush brush1, brush2;
CRect rect;
int nWidth = pDoc->m_tracker.m_rect.Width();
int nHeight = pDoc->m_tracker.m_rect.Height();
int nSgnX = nWidth != 0 ? nWidth / abs(nWidth) : 1;
int nSgnY = nHeight != 0 ? nHeight / abs(nHeight) : 1;
pDC->SetTextAlign(TA_CENTER);
pDC->SetBkMode(TRANSPARENT);
int nCenterX, nCenterY;
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
brush1.CreateSolidBrush(RGB(255, 0, 0));
pOldBrush = pDC->SelectObject(&brush1);
SetNormalRect(rect, pDoc->m_tracker.m_rect.left,
pDoc->m_tracker.m_rect.top, nWidth/2, nHeight/2);
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
nCenterX = rect.left + rect.Width()/2;
nCenterY = rect.top + rect.Height()/2 - tm.tmHeight/2;
pDC->ExtTextOut(nCenterX, nCenterY, ETO_CLIPPED, rect, _T("1"), 1, NULL);
brush2.CreateSolidBrush(RGB(0, 255, 0));
pDC->SelectObject(&brush2);
brush1.DeleteObject();
SetNormalRect(rect, pDoc->m_tracker.m_rect.left+nWidth/2,
pDoc->m_tracker.m_rect.top, (nWidth+nSgnX)/2, nHeight/2);
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
nCenterX = rect.left + rect.Width()/2;
nCenterY = rect.top + rect.Height()/2 - tm.tmHeight/2;
pDC->ExtTextOut(nCenterX, nCenterY, ETO_CLIPPED, rect, _T("2"), 1, NULL);
brush1.CreateSolidBrush(RGB(0, 0, 255));
pDC->SelectObject(&brush1);
brush2.DeleteObject();
SetNormalRect(rect, pDoc->m_tracker.m_rect.left,
pDoc->m_tracker.m_rect.top+nHeight/2, nWidth/2, (nHeight+nSgnY)/2);
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
nCenterX = rect.left + rect.Width()/2;
nCenterY = rect.top + rect.Height()/2 - tm.tmHeight/2;
pDC->ExtTextOut(nCenterX, nCenterY, ETO_CLIPPED, rect, _T("3"), 1, NULL);
brush2.CreateSolidBrush(RGB(192, 192, 192));
pDC->SelectObject(&brush2);
brush1.DeleteObject();
SetNormalRect(rect, pDoc->m_tracker.m_rect.left+nWidth/2,
pDoc->m_tracker.m_rect.top+nHeight/2,
(nWidth+nSgnX)/2, (nHeight+nSgnY)/2);
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
nCenterX = rect.left + rect.Width()/2;
nCenterY = rect.top + rect.Height()/2 - tm.tmHeight/2;
pDC->ExtTextOut(nCenterX, nCenterY, ETO_CLIPPED, rect, _T("4"), 1, NULL);
// cleanup DC
if (pOldBrush != NULL)
pDC->SelectObject(pOldBrush);
brush2.DeleteObject();
// draw tracker on outside
pDoc->m_tracker.Draw(pDC);
}
CATCH_ALL(e)
{
if (pOldBrush != NULL)
pDC->SelectObject(pOldBrush);
}
END_CATCH_ALL
}
/////////////////////////////////////////////////////////////////////////////
// CTrackerView printing
BOOL CTrackerView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CTrackerView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CTrackerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CTrackerView diagnostics
#ifdef _DEBUG
void CTrackerView::AssertValid() const
{
CView::AssertValid();
}
void CTrackerView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CTrackerDoc* CTrackerView::GetDocument() // non-debug version is inline
{
return STATIC_DOWNCAST(CTrackerDoc, m_pDocument);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTrackerView update
void CTrackerView::OnUpdate(CView* /*pSender*/, LPARAM lHint, CObject* /*pHint*/)
{
if (lHint == 0)
{
CRect rectTrue;
CTrackerDoc* pDoc = GetDocument();
pDoc->m_tracker.GetTrueRect(&rectTrue);
InvalidateRect(rectTrue);
}
else
{
InvalidateRect((CRect*)lHint);
}
}
/////////////////////////////////////////////////////////////////////////////
// CTrackerView message handlers
void CTrackerView::OnLButtonDown(UINT nFlags, CPoint point)
{
CTrackerDoc* pDoc = GetDocument();
CRect rectSave;
pDoc->m_tracker.GetTrueRect(rectSave);
if (pDoc->m_tracker.HitTest(point) < 0)
{
// just to demonstrate CRectTracker::TrackRubberBand
CRectTracker tracker;
if (tracker.TrackRubberBand(this, point, pDoc->m_bAllowInvert))
{
MessageBeep(0); // beep indicates TRUE
// see if rubber band intersects with the doc's tracker
CRect rectT;
tracker.m_rect.NormalizeRect(); // so intersect rect works
if (rectT.IntersectRect(tracker.m_rect, pDoc->m_tracker.m_rect))
{
// if so, put resize handles on it (ie. select it)
if (pDoc->m_tracker.m_nStyle & CRectTracker::resizeInside)
{
// swap from resize inside to resize outside for effect
pDoc->m_tracker.m_nStyle &= ~CRectTracker::resizeInside;
pDoc->m_tracker.m_nStyle |= CRectTracker::resizeOutside;
}
else
{
// just use inside resize handles on first time
pDoc->m_tracker.m_nStyle &= ~CRectTracker::resizeOutside;
pDoc->m_tracker.m_nStyle |= CRectTracker::resizeInside;
}
pDoc->SetModifiedFlag();
pDoc->UpdateAllViews(NULL, (LPARAM)(LPCRECT)rectSave);
pDoc->UpdateAllViews(NULL);
}
}
}
else if (pDoc->m_tracker.Track(this, point, pDoc->m_bAllowInvert))
{
// normal tracking action, when tracker is "hit"
pDoc->SetModifiedFlag();
pDoc->UpdateAllViews(NULL, (LPARAM)(LPCRECT)rectSave);
pDoc->UpdateAllViews(NULL);
}
CView::OnLButtonDown(nFlags, point);
}
BOOL CTrackerView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// forward to tracker
CTrackerDoc* pDoc = GetDocument();
if (pWnd == this && pDoc->m_tracker.SetCursor(this, nHitTest))
return TRUE;
ret
没有合适的资源?快使用搜索试试~ 我知道了~
CRectTracker类(即俗称的橡皮筋)的使用
共30个文件
h:7个
cpp:6个
rc:2个
4星 · 超过85%的资源 需积分: 9 43 下载量 185 浏览量
2010-12-26
11:43:59
上传
评论
收藏 55KB ZIP 举报
温馨提示
CRectTracker(俗称“橡皮筋”类)是一个非常有意思的类。你在Windows中经常看到这样的情况:它可以用做显示边界,你也可以扽它的八个角用来放大缩小,或做框选使用。如何通过编程来实现这种功能呢?这就是CRectTracker类的作用。
资源推荐
资源详情
资源评论
收起资源包目录
tracker.zip (30个子文件)
resource.h 1KB
trackapp.cpp 4KB
stdafx.h 744B
tracker.mak 6KB
trackvw.h 2KB
trackdoc.cpp 6KB
mainfrm.h 1KB
dialogs.h 2KB
mainfrm.cpp 3KB
makefile 620B
tracker.plg 2KB
tracker.opt 54KB
tracker.rc 12KB
stdafx.cpp 628B
tracker.dsp 5KB
trackdoc.h 2KB
Tracker.aps 32KB
tracker.dsw 537B
tracker.clw 6KB
Release
tracker.exe 36KB
l.jpn
tracker.rc 11KB
res
tracker.rc2 2KB
res
tracker.rc2 2KB
trackdoc.ico 768B
tracker.ico 766B
toolbar.bmp 2KB
trackvw.cpp 8KB
tracker.ncb 65KB
dialogs.cpp 2KB
trackapp.h 1KB
共 30 条
- 1
资源评论
- xiaocaovc2013-10-29可以编译,值得研究
- Owen_SYC2014-02-21很简单的一个示例
- lifei89560972014-08-26很有用,不用自己实现了 哈哈
- cane_he2014-01-03挺好,过简单。
- zhengxiaoding2013-07-19挺好的, 很简单清楚。 受教了。
haxzhyh
- 粉丝: 4
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功