?? drawtool.cpp
字號:
// DrawTool.cpp: implementation of the CDrawTool class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DrawCli.h"
#include "DrawTool.h"
#include "drawdoc.h"
#include "drawvw.h"
#include "drawobj.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CDrawTool implementation
CPtrList CDrawTool::c_tools;
static CSelectTool selectTool;
static CRectTool lineTool(line);
static CRectTool rectTool(rect);
static CRectTool roundRectTool(roundRect);
static CRectTool ellipseTool(ellipse);
static CRectTool circleTool(circle);
//static CPolyTool polyTool;
CPoint CDrawTool::c_down;
UINT CDrawTool::c_nDownFlags;
CPoint CDrawTool::c_last;
DrawShape CDrawTool::c_drawShape = selection;
CDrawTool::CDrawTool(DrawShape drawShape)
{
m_drawShape = drawShape;
c_tools.AddTail(this);
}
CDrawTool* CDrawTool::FindTool(DrawShape drawShape)
{
POSITION pos = c_tools.GetHeadPosition();
while (pos != NULL)
{
CDrawTool* pTool = (CDrawTool*)c_tools.GetNext(pos);
if (pTool->m_drawShape == drawShape)
return pTool;
}
return NULL;
}
void CDrawTool::OnLButtonDown(CDrawView* pView, UINT nFlags, const CPoint& point)
{
// deactivate any in-place active item on this view!
COleClientItem* pActiveItem = pView->GetDocument()->GetInPlaceActiveItem(pView);
if (pActiveItem != NULL)
{
pActiveItem->Close();
ASSERT(pView->GetDocument()->GetInPlaceActiveItem(pView) == NULL);
}
pView->SetCapture();
c_nDownFlags = nFlags;
c_down = point;
c_last = point;
}
void CDrawTool::OnLButtonDblClk(CDrawView* /*pView*/, UINT /*nFlags*/, const CPoint& /*point*/)
{
}
void CDrawTool::OnLButtonUp(CDrawView* /*pView*/, UINT /*nFlags*/, const CPoint& point)
{
ReleaseCapture();
if (point == c_down)
c_drawShape = selection;
}
void CDrawTool::OnMouseMove(CDrawView* /*pView*/, UINT /*nFlags*/, const CPoint& point)
{
c_last = point;
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}
void CDrawTool::OnEditProperties(CDrawView* /*pView*/)
{
}
void CDrawTool::OnCancel()
{
c_drawShape = selection;
}
////////////////////////////////////////////////////////////////////////////
// CResizeTool
enum SelectMode
{
none,
netSelect,
move,
size
};
SelectMode selectMode = none;
int nDragHandle;
CPoint lastPoint;
CSelectTool::CSelectTool()
: CDrawTool(selection)
{
}
void CSelectTool::OnLButtonDown(CDrawView* pView, UINT nFlags, const CPoint& point)
{
CPoint local = point;
pView->ClientToDoc(local);
CDrawObj* pObj;
selectMode = none;
// Check for resizing (only allowed on single selections)
if (pView->m_selection.GetCount() == 1)
{
pObj = pView->m_selection.GetHead();
nDragHandle = pObj->HitTest(local, pView, TRUE);
if (nDragHandle != 0)
selectMode = size;
}
// See if the click was on an object, select and start move if so
if (selectMode == none)
{
pObj = pView->GetDocument()->ObjectAt(local);
if (pObj != NULL)
{
selectMode = move;
if (!pView->IsSelected(pObj))
pView->Select(pObj, (nFlags & MK_SHIFT) != 0);
// Ctrl+Click clones the selection...
#ifndef _MAC
if ((nFlags & MK_CONTROL) != 0)
#else
if ((nFlags & MK_OPTION) != 0)
#endif
pView->CloneSelection();
}
}
// Click on background, start a net-selection
if (selectMode == none)
{
if ((nFlags & MK_SHIFT) == 0)
pView->Select(NULL);
selectMode = netSelect;
CClientDC dc(pView);
CRect rect(point.x, point.y, point.x, point.y);
rect.NormalizeRect();
dc.DrawFocusRect(rect);
}
lastPoint = local;
CDrawTool::OnLButtonDown(pView, nFlags, point);
}
void CSelectTool::OnLButtonDblClk(CDrawView* pView, UINT nFlags, const CPoint& point)
{
if ((nFlags & MK_SHIFT) != 0)
{
// Shift+DblClk deselects object...
CPoint local = point;
pView->ClientToDoc(local);
CDrawObj* pObj = pView->GetDocument()->ObjectAt(local);
if (pObj != NULL)
pView->Deselect(pObj);
}
else
{
// "Normal" DblClk opens properties, or OLE server...
if (pView->m_selection.GetCount() == 1)
pView->m_selection.GetHead()->OnOpen(pView);
}
CDrawTool::OnLButtonDblClk(pView, nFlags, point);
}
void CSelectTool::OnEditProperties(CDrawView* pView)
{
if (pView->m_selection.GetCount() == 1)
pView->m_selection.GetHead()->OnEditProperties();
}
void CSelectTool::OnLButtonUp(CDrawView* pView, UINT nFlags, const CPoint& point)
{
if (pView->GetCapture() == pView)
{
if (selectMode == netSelect)
{
CClientDC dc(pView);
CRect rect(c_down.x, c_down.y, c_last.x, c_last.y);
rect.NormalizeRect();
dc.DrawFocusRect(rect);
pView->SelectWithinRect(rect, TRUE);
}
else if (selectMode != none)
{
pView->GetDocument()->UpdateAllViews(pView);
}
}
CDrawTool::OnLButtonUp(pView, nFlags, point);
}
void CSelectTool::OnMouseMove(CDrawView* pView, UINT nFlags, const CPoint& point)
{
if (pView->GetCapture() != pView)
{
if (c_drawShape == selection && pView->m_selection.GetCount() == 1)
{
CDrawObj* pObj = pView->m_selection.GetHead();
CPoint local = point;
pView->ClientToDoc(local);
int nHandle = pObj->HitTest(local, pView, TRUE);
if (nHandle != 0)
{
SetCursor(pObj->GetHandleCursor(nHandle));
return; // bypass CDrawTool
}
}
if (c_drawShape == selection)
CDrawTool::OnMouseMove(pView, nFlags, point);
return;
}
if (selectMode == netSelect)
{
CClientDC dc(pView);
CRect rect(c_down.x, c_down.y, c_last.x, c_last.y);
rect.NormalizeRect();
dc.DrawFocusRect(rect);
rect.SetRect(c_down.x, c_down.y, point.x, point.y);
rect.NormalizeRect();
dc.DrawFocusRect(rect);
CDrawTool::OnMouseMove(pView, nFlags, point);
return;
}
CPoint local = point;
pView->ClientToDoc(local);
CPoint delta = (CPoint)(local - lastPoint);
POSITION pos = pView->m_selection.GetHeadPosition();
while (pos != NULL)
{
CDrawObj* pObj = pView->m_selection.GetNext(pos);
CRect position = pObj->m_position;
if (selectMode == move)
{
position += delta;
pObj->MoveTo(position, pView);
}
else if (nDragHandle != 0)
{
pObj->MoveHandleTo(nDragHandle, local, pView);
}
}
lastPoint = local;
if (selectMode == size && c_drawShape == selection)
{
c_last = point;
SetCursor(pView->m_selection.GetHead()->GetHandleCursor(nDragHandle));
return; // bypass CDrawTool
}
c_last = point;
if (c_drawShape == selection)
CDrawTool::OnMouseMove(pView, nFlags, point);
}
////////////////////////////////////////////////////////////////////////////
// CRectTool (does rectangles, round-rectangles, and ellipses)
CRectTool::CRectTool(DrawShape drawShape)
: CDrawTool(drawShape)
{
}
void CRectTool::OnLButtonDown(CDrawView* pView, UINT nFlags, const CPoint& point)
{
CDrawTool::OnLButtonDown(pView, nFlags, point);
CPoint local = point;
pView->ClientToDoc(local);
CDrawRect* pObj = new CDrawRect(CRect(local, CSize(0, 0)));
switch (m_drawShape)
{
default:
ASSERT(FALSE); // unsuported shape!
case rect:
pObj->m_nShape = CDrawRect::rectangle;
break;
case roundRect:
pObj->m_nShape = CDrawRect::roundRectangle;
break;
case ellipse:
pObj->m_nShape = CDrawRect::ellipse;
break;
case line:
pObj->m_nShape = CDrawRect::line;
break;
case circle:
pObj->m_nShape = CDrawRect::circle;
break;
}
pView->GetDocument()->Add(pObj);
pView->Select(pObj);
selectMode = size;
nDragHandle = 1;
lastPoint = local;
}
void CRectTool::OnLButtonDblClk(CDrawView* pView, UINT nFlags, const CPoint& point)
{
CDrawTool::OnLButtonDblClk(pView, nFlags, point);
}
void CRectTool::OnLButtonUp(CDrawView* pView, UINT nFlags, const CPoint& point)
{
if (point == c_down)
{
// Don't create empty objects...
CDrawObj *pObj = pView->m_selection.GetTail();
pView->GetDocument()->Remove(pObj);
pObj->Remove();
selectTool.OnLButtonDown(pView, nFlags, point); // try a select!
}
selectTool.OnLButtonUp(pView, nFlags, point);
}
void CRectTool::OnMouseMove(CDrawView* pView, UINT nFlags, const CPoint& point)
{
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));
selectTool.OnMouseMove(pView, nFlags, point);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -