TRACKVW.CPP
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:8k
源码类别:
Windows编程
开发平台:
Visual C++
- // 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;
- return CView::OnSetCursor(pWnd, nHitTest, message);
- }
- void CTrackerView::OnViewSethandlesize()
- {
- CTrackerDoc* pDoc = GetDocument();
- CHandleSize dlg;
- dlg.m_nHandleSize = pDoc->m_tracker.m_nHandleSize;
- if (dlg.DoModal() == IDOK)
- {
- pDoc->m_tracker.m_nHandleSize = dlg.m_nHandleSize;
- pDoc->UpdateAllViews(NULL);
- }
- }
- void CTrackerView::OnViewSetminimumsize()
- {
- CTrackerDoc* pDoc = GetDocument();
- CMinSize dlg;
- dlg.m_nMinX = pDoc->m_tracker.m_sizeMin.cx;
- dlg.m_nMinY = pDoc->m_tracker.m_sizeMin.cy;
- if (dlg.DoModal() == IDOK)
- {
- pDoc->m_tracker.m_sizeMin.cx = dlg.m_nMinX;
- pDoc->m_tracker.m_sizeMin.cy = dlg.m_nMinY;
- pDoc->UpdateAllViews(NULL);
- }
- }