📄 selecttool.cpp
字号:
#include "StdAfx.h"
#include ".\selecttool.h"
#include "VisDrawView.h"
#include "FigureObj.h"
//#include "ShebeiDlg.h"
//#include "gongshiDlg.h"
//#include "yunxingDlg.h"
CPoint CSelectTool::c_down;
//UINT CSelectTool::c_nDownFlags;
CPoint CSelectTool::c_last;
//extern CDialogBar m_wndDlgBarLanguage;
//拾取模式
enum SelectMode
{
none,
netSelect,
move,
size
};
//初始拾取模式
SelectMode selectMode = none;
int nDragHandle;
CSelectTool::CSelectTool()
{
}
CSelectTool::~CSelectTool(void)
{
}
CSelectTool::CSelectTool(DrawShape drawShape)
: CDrawTool(drawShape)
{
m_bMoved = false;
}
void CSelectTool::OnLButtonDown(CVisDrawView* pView, UINT nFlags, const CPoint& point)
{
//把鼠标点坐标转化为逻辑坐标
CPoint local = point;
pView->ClientToDoc(local);
double x, y;
//把逻辑坐标转化为世界坐标
pView->ClientToWorld(local,x,y);
pView->WorldToClient(local,x,y);
//定义图元基类指针
CFigureObj* pObj;
//拾取模式
selectMode = none;
//鼠标按下次数
//图形手柄击中测试
if (pView->m_selection.GetCount() == 1)
{
pObj = pView->m_selection.GetHead();
nDragHandle = pObj->HitTest(pView, local, TRUE);
//如果有手柄被击中,则拾取状态设定为size
if (nDragHandle != 0 && nDragHandle < 9)
selectMode = size;
//如果手柄是图形中心点,则移动图形
if (nDragHandle == 9)
selectMode = move;
}
//CVisDrawDoc* pDoc;//=GetDocument();
//if (pView->m_selection.GetCount() == 1)
// pView->m_selection.GetHead()->FindObj(CFigureObj::c_drawObj);
/*if(CFigureObj::c_drawObj==baoObj)
{
pDoc->m_strLanguage=_T("12345");
}
*/
if(selectMode == size && m_bMoved )
{
pObj = pView->m_selection.GetHead();
CPoint pt = pObj->GetHandle(pView,nDragHandle);
pObj->MoveHandleTo(nDragHandle,local,pView);
//更新图形矩形区域
pView->InvalObj(pObj);
selectMode = move;
m_bMoved = false;
}
//如果点击拾取到图形对象
if (selectMode == none)
{
pObj = pView->GetDocument()->ObjectAt(pView, local);
if (pObj != NULL)
{
selectMode = move;
// m_wndDlgBarLanguage.SetDlgItemTextA(IDC_EDIT_LANGUAGE,_T("0000"));
if (!pView->IsSelected(pObj))
pView->Select(pObj, (nFlags & MK_SHIFT) != 0);
}
}
// 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;
prePoint = local;
pView->SetCapture();
//c_nDownFlags = nFlags;
c_down = point;
c_last = point;
// CDrawTool::OnLButtonDown(pView, nFlags, point);
}
void CSelectTool::OnLButtonUp(CVisDrawView* 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);
}
}
ReleaseCapture();
if (point == c_down)
c_drawShape = selectTool;
}
void CSelectTool::OnMouseMove(CVisDrawView* pView, UINT nFlags, const CPoint& point)
{
//把鼠标点坐标转化为逻辑坐标
CPoint local = point;
pView->ClientToDoc(local);
//如果选择集有且只有一个被拾取图形对象
if(pView->m_selection.GetCount() == 1 && selectMode == size)
{
//获得选择集对象指针
CFigureObj* pObj = pView->m_selection.GetHead();
//移动图形手柄nDragHandle到前一个鼠标位置
pObj->MoveHandleTo(nDragHandle,prePoint,pView);
//更新图形矩形区域
pView->InvalObj(pObj);
//移动图形手柄nDragHandle到当前鼠标位置
pObj->MoveHandleTo(nDragHandle,local,pView);
//更新图形矩形区域
pView->InvalObj(pObj);
m_bMoved = true;
}
//如果没有捕获鼠标
if (pView->GetCapture() != pView&& selectMode != size)
{
//手柄击中测试
if (c_drawShape == selectTool && pView->m_selection.GetCount() == 1 )
{
CFigureObj* pObj = pView->m_selection.GetHead();
CPoint local = point;
pView->ClientToDoc(local);
int nHandle = pObj->HitTest(pView, local, TRUE);
if (nHandle != 0)
{
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZEALL));
return;
}
}
if (c_drawShape == selectTool)
c_last = 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);
c_last = point;
return;
}
CPoint delta;
POSITION pos = pView->m_selection.GetHeadPosition();
while (pos != NULL)
{
CFigureObj* pObj = pView->m_selection.GetNext(pos);
if (selectMode == move)
{
//移动图形
delta = (CPoint)(local - prePoint);
pView->InvalObj(pObj);
pObj->MoveTo(delta, pView);
pView->InvalObj(pObj);
}
else if (nDragHandle != 0)
{
pObj->MoveHandleTo(nDragHandle, local, pView);
}
}
lastPoint = local;
c_last = point;
if (c_drawShape == selectTool)
c_last = point;
prePoint = local;
}
void CSelectTool::OnLButtonDblClk(CVisDrawView* pView, UINT nFlags, const CPoint& point)
{
if ((nFlags & MK_SHIFT) != 0)
{
// Shift+DblClk deselects object...
CPoint local = point;
pView->ClientToDoc(local);
CFigureObj* pObj = pView->GetDocument()->ObjectAt(pView,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::OnRButtonDown(CVisDrawView* pView, UINT nFlags, const CPoint& point)
{
if(pView->m_selection.GetCount() == 1)
CDrawTool::OnRButtonDown(pView, nFlags, point);
}
void CSelectTool::CreateObj(CVisDrawView* pView, const CPoint& point)
{
}
void CSelectTool::OnEditProperties(CVisDrawView* pView)
{
if (pView->m_selection.GetCount() == 1)
pView->m_selection.GetHead()->OnEditProperties();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -