⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selecttool.cpp

📁 参数化车间设备资源绘制程序
💻 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 + -