|
// UndoDemoView.cpp : implementation of the CUndoDemoView class
//
#include "stdafx.h"
#include "UndoDemo.h"
#include "UndoDemoDoc.h"
#include "UndoDemoView.h"
#include "MemDC.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CUndoDemoView
IMPLEMENT_DYNCREATE(CUndoDemoView, CView)
BEGIN_MESSAGE_MAP(CUndoDemoView, CView)
//{{AFX_MSG_MAP(CUndoDemoView)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_ERASEBKGND()
ON_WM_SETCURSOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUndoDemoView construction/destruction
CUndoDemoView::CUndoDemoView()
{
// TODO: add construction code here
}
CUndoDemoView::~CUndoDemoView()
{
}
BOOL CUndoDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CUndoDemoView drawing
BOOL CUndoDemoView::OnEraseBkgnd(CDC* /*pDC*/){
return FALSE;
}
void CUndoDemoView::OnDraw(CDC* pDC)
{
CUndoDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CMemDC memdc (pDC);
CRect rc;
GetClientRect (&rc);
memdc.FillSolidRect (rc, RGB(255,255,255));
CBrush brush;
brush.CreateStockObject (NULL_BRUSH);
CBrush* pOldBrush = memdc.SelectObject (&brush);
for (int i=0; i<pDoc->m_MiniDB.GetSize (); i++){
CDrawObject& obj = pDoc->m_MiniDB[i];
CPen pen (PS_SOLID, 1, obj.clr);
CPen* pOldPen = memdc.SelectObject (&pen);
switch (obj.type)
{
case DOT_LINE:
memdc.MoveTo (obj.TopLeft ());
memdc.LineTo (obj.BottomRight ());
break;
case DOT_RECTANGLE:
memdc.Rectangle (obj);
break;
case DOT_ELLIPSE:
memdc.Ellipse (obj);
break;
default:
ASSERT (FALSE); //unknow type
break;
}
memdc.SelectObject (pOldPen);
}
memdc.SelectObject (pOldBrush);
}
/////////////////////////////////////////////////////////////////////////////
// CUndoDemoView diagnostics
#ifdef _DEBUG
void CUndoDemoView::AssertValid() const
{
CView::AssertValid();
}
void CUndoDemoView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CUndoDemoDoc* CUndoDemoView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CUndoDemoDoc)));
return (CUndoDemoDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CUndoDemoView message handlers
void CUndoDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
CUndoDemoDoc* pDoc = GetDocument();
switch (pDoc->m_DocState)
{
case STATE_DRAW_LINE_PT1:
{
CDrawObject obj;
obj.clr = pDoc->m_CurClr;
obj.type = DOT_LINE;
obj.left = obj.right = point.x;
obj.top = obj.bottom = point.y;
pDoc->m_MiniDB.Add (obj);
pDoc->m_DocState = STATE_DRAW_LINE_PT2;
Invalidate();
break;
}
case STATE_DRAW_RECTANGLE_PT1:
{
CDrawObject obj;
obj.clr = pDoc->m_CurClr;
obj.type = DOT_RECTANGLE;
obj.left = obj.right = point.x;
obj.top = obj.bottom = point.y;
pDoc->m_MiniDB.Add (obj);
pDoc->m_DocState = STATE_DRAW_RECTANGLE_PT2;
Invalidate();
break;
}
case STATE_DRAW_ELLIPSE_PT1:
{
CDrawObject obj;
obj.clr = pDoc->m_CurClr;
obj.type = DOT_ELLIPSE;
obj.left = obj.right = point.x;
obj.top = obj.bottom = point.y;
pDoc->m_MiniDB.Add (obj);
pDoc->m_DocState = STATE_DRAW_ELLIPSE_PT2;
Invalidate();
break;
}
case STATE_DRAW_LINE_PT2:
case STATE_DRAW_RECTANGLE_PT2:
case STATE_DRAW_ELLIPSE_PT2:
{
OnMouseMove (nFlags,point);
pDoc->FinishCurrentOperation ();
break;
}
default:
CView::OnLButtonDown(nFlags, point);
break;
}
}
void CUndoDemoView::OnMouseMove(UINT nFlags, CPoint point)
{
CUndoDemoDoc* pDoc = GetDocument();
switch (pDoc->m_DocState)
{
case STATE_DRAW_LINE_PT2:
{
CDrawObject& obj = pDoc->m_MiniDB[pDoc->m_MiniDB.GetUpperBound ()];
ASSERT (obj.type == DOT_LINE);
obj.right = point.x;
obj.bottom = point.y;
Invalidate();
break;
}
case STATE_DRAW_RECTANGLE_PT2:
{
CDrawObject& obj = pDoc->m_MiniDB[pDoc->m_MiniDB.GetUpperBound ()];
ASSERT (obj.type == DOT_RECTANGLE);
obj.right = point.x;
obj.bottom = point.y;
Invalidate();
break;
}
case STATE_DRAW_ELLIPSE_PT2:
{
CDrawObject& obj = pDoc->m_MiniDB[pDoc->m_MiniDB.GetUpperBound ()];
ASSERT (obj.type == DOT_ELLIPSE);
obj.right = point.x;
obj.bottom = point.y;
Invalidate();
break;
}
default:
CView::OnMouseMove(nFlags, point);
break;
}
}
BOOL CUndoDemoView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (nHitTest == HTCLIENT)
{
CUndoDemoDoc* pDoc = GetDocument ();
switch (pDoc->m_DocState)
{
case STATE_DRAW_RECTANGLE_PT1:
case STATE_DRAW_RECTANGLE_PT2:
case STATE_DRAW_LINE_PT1:
case STATE_DRAW_LINE_PT2:
case STATE_DRAW_ELLIPSE_PT1:
case STATE_DRAW_ELLIPSE_PT2:
SetCursor (AfxGetApp()->LoadCursor (IDC_CURSOR_DRAW));
return TRUE;
}
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.