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

📄 treedroptarget.cpp

📁 dsacd_ivr 的实现
💻 CPP
字号:
// TreeDropTarget.cpp: implementation of the CTreeDropTarget class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "dsACD_IVR.h"
#include "TreeDropTarget.h"

#include "dsACD_IVRDoc.h"
#include "dsACD_IVRView.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

/////////////////////////////////////////////////////////////////////////////
// CTreeDropTarget

#define RECT_BORDER	10
HWND CTreeDropTarget::m_shWndTreeCtrl = NULL;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTreeDropTarget::CTreeDropTarget()
{

}

CTreeDropTarget::~CTreeDropTarget()
{

}

/********************************************************************
OnDragEnter()
	Called when the user drags the object in Tree control.
********************************************************************/
DROPEFFECT CTreeDropTarget::OnDragEnter( CWnd* pWnd, COleDataObject* pDataObject, 
	DWORD dwKeyState, CPoint point 
)
{	
	DROPEFFECT dropeffectRet = DROPEFFECT_MOVE;
//	DROPEFFECT dropeffectRet = DROPEFFECT_COPY;
//	if ( (dwKeyState & MK_SHIFT) == MK_SHIFT)
//		dropeffectRet = DROPEFFECT_MOVE;
	return dropeffectRet;
}

/********************************************************************
OnDragOver()
	Called when the user drags the object over Tree control.
********************************************************************/
		
DROPEFFECT CTreeDropTarget::OnDragOver( CWnd* pWnd, COleDataObject* pDataObject, 
	DWORD dwKeyState, CPoint point )
{	
	DROPEFFECT dropeffectRet = DROPEFFECT_MOVE;
//	DROPEFFECT dropeffectRet = DROPEFFECT_COPY;
//	if ( (dwKeyState & MK_SHIFT) == MK_SHIFT)
//		dropeffectRet = DROPEFFECT_MOVE;

	// Expand and highlight the item under the mouse and 
	m_pDestView = (CDsACD_IVRView *)pWnd;
	m_pDestTreeCtrl = m_pDestView->m_TreeCtrl;
	HTREEITEM hItem = m_pDestTreeCtrl->HitTest(point);

	if ( hItem != NULL ) 
	{
		m_pDestTreeCtrl->Expand(hItem, TVE_EXPAND);
		m_pDestTreeCtrl->SelectDropTarget(hItem);
	}	
	
	// Scroll Tree control depending on mouse position
	CRect rectClient;
	pWnd->GetClientRect(&rectClient);
	pWnd->ClientToScreen(rectClient);
	pWnd->ClientToScreen(&point);

//	垂直滚动
	int nScrollDir = -1;
	if ( point.y >= rectClient.bottom - RECT_BORDER)
		nScrollDir = SB_LINEDOWN;
	else
	if ( (point.y <= rectClient.top + RECT_BORDER) )
		nScrollDir = SB_LINEUP;
	
	if ( nScrollDir != -1 ) 
	{
		int nScrollPos = pWnd->GetScrollPos(SB_VERT);
		WPARAM wParam = MAKELONG(nScrollDir, nScrollPos);
		pWnd->SendMessage(WM_VSCROLL, wParam);
	}
	
//	水平滚动
	nScrollDir = -1;
	if ( point.x <= rectClient.left + RECT_BORDER )
		nScrollDir = SB_LINELEFT;
	else
	if ( point.x >= rectClient.right - RECT_BORDER)
		nScrollDir = SB_LINERIGHT;
	
	if ( nScrollDir != -1 ) 
	{
		int nScrollPos = pWnd->GetScrollPos(SB_HORZ);
//		int nScrollPos = pWnd->GetScrollPos(SB_VERT);//by 郭建国
		WPARAM wParam = MAKELONG(nScrollDir, nScrollPos);
		pWnd->SendMessage(WM_HSCROLL, wParam);
	}
	
	return dropeffectRet;	
}

/********************************************************************
OnDragLeave()
	Called when the user drags the object out of Tree control.
********************************************************************/
void CTreeDropTarget::OnDragLeave( CWnd* pWnd )
{
	// Remove Highlighting 
//	m_pDestView = (CDsACD_IVRView *)pWnd;	//by 郭建国
	m_pDestView->SendMessage(TVM_SELECTITEM, TVGN_DROPHILITE,0);
}

/********************************************************************
OnDrop()
	Called when the user drops the object in the  Tree control.
********************************************************************/
BOOL CTreeDropTarget::OnDrop(CWnd* pWnd, COleDataObject* pDataObject,
		DROPEFFECT dropEffect, CPoint point)
{
	//Get the selected item from Source and destination Tree controls 
	m_pSourceView = (CDsACD_IVRView *)CWnd::FromHandlePermanent(m_shWndTreeCtrl);
	m_pSourceTreeCtrl = m_pSourceView->m_TreeCtrl;
	HTREEITEM hSelectedItem = m_pSourceTreeCtrl->GetSelectedItem();

	HTREEITEM hDropItem =m_pDestTreeCtrl->GetDropHilightItem();

	// Get the image indexes from ImageList, if one exists
	int nImage = 0;
	int nSelImage = 0;
	GetItemImages(hSelectedItem, nImage, nSelImage);
	
	// Add the items to destination tree control
	CString csSourceItemName = m_pSourceTreeCtrl->GetItemText(hSelectedItem);
	CString csDestItemName = m_pDestTreeCtrl->GetItemText(hDropItem);
	HTREEITEM hParentDropItem = m_pDestTreeCtrl->GetParentItem(hDropItem);
	HTREEITEM hPrevSiblingItem = m_pDestTreeCtrl->GetPrevSiblingItem(hDropItem);

	if (csSourceItemName.Left(8) == _T("数据定义") || csSourceItemName.Left(8) == _T("流程开始")
		|| csSourceItemName.Left(8) == _T("流程结束")|| csSourceItemName.Left(6) == _T("返回值")
		|| csSourceItemName.Left(8) == _T("条件为真")|| csSourceItemName.Left(8) == _T("条件为假")
		|| csSourceItemName.Left(8) == _T("缺省匹配"))
		return FALSE;

	else if (csSourceItemName.Left(8) == _T("分支匹配"))
	{
		if(csDestItemName.Left(8) == _T("多路分支"))
		{
			m_hDestItem = m_pDestView->AddItem(hDropItem, m_pSourceTreeCtrl->GetItemText(hSelectedItem), TVI_FIRST, nImage, nSelImage, 0);
		}
		else if(csDestItemName.Left(8) == _T("分支匹配"))
		{
			m_hDestItem = m_pDestView->AddItem(hParentDropItem, m_pSourceTreeCtrl->GetItemText(hSelectedItem), hDropItem, nImage, nSelImage, 0);
		}
		else if(csDestItemName.Left(8) == _T("缺省匹配"))
		{
			if(hPrevSiblingItem == NULL)
				m_hDestItem = m_pDestView->AddItem(hParentDropItem, m_pSourceTreeCtrl->GetItemText(hSelectedItem), TVI_FIRST, nImage, nSelImage, 0);
			else
				m_hDestItem = m_pDestView->AddItem(hParentDropItem, m_pSourceTreeCtrl->GetItemText(hSelectedItem), hPrevSiblingItem, nImage, nSelImage, 0);
		}
		else
			return FALSE;
	}

	else if (csSourceItemName.Left(8) == _T("变量定义") || csSourceItemName.Left(8) == _T("数据分类")
		|| csSourceItemName.Left(10) == _T("数据库连接"))
	{
		if(csDestItemName.Left(8) == _T("数据定义"))
		{
			m_hDestItem = m_pDestView->AddItem(hDropItem, m_pSourceTreeCtrl->GetItemText(hSelectedItem), m_pDestView->m_hChild, nImage, nSelImage, 0);
		}
		else if(csDestItemName.Left(8) == _T("变量定义") || csDestItemName.Left(8) == _T("数据分类")
			|| csDestItemName.Left(10) == _T("数据库连接")|| csDestItemName.Left(6) == _T("返回值"))
		{
			m_hDestItem = m_pDestView->AddItem(hParentDropItem, m_pSourceTreeCtrl->GetItemText(hSelectedItem), hDropItem, nImage, nSelImage, 0);
		}
		else
			return FALSE;
	}
	
	else if (csSourceItemName.Left(8) == _T("条件控制") || csSourceItemName.Left(8) == _T("多路分支"))
	{
		HTREEITEM htempDropItem = hDropItem;

		while ((htempDropItem != NULL) && (htempDropItem != hSelectedItem))
		{
			htempDropItem = m_pDestTreeCtrl->GetParentItem(htempDropItem);	//点睛之句
		}

		if ((htempDropItem == hSelectedItem))
			return FALSE;

		else if (csDestItemName.Left(8) == _T("流程开始") || csDestItemName.Left(8) == _T("流程结束")
			|| csDestItemName.Left(8) == _T("条件为真")|| csDestItemName.Left(8) == _T("条件为假")
			|| csDestItemName.Left(8) == _T("分支匹配")|| csDestItemName.Left(8) == _T("缺省匹配"))
		{
			m_hDestItem = m_pDestView->AddItem(hDropItem, m_pSourceTreeCtrl->GetItemText(hSelectedItem), TVI_FIRST, nImage, nSelImage, 0);
		}
		else if (csDestItemName.Left(8) == _T("数据定义") || csDestItemName.Left(8) == _T("变量定义") 
			|| csDestItemName.Left(8) == _T("数据分类")|| csDestItemName.Left(10) == _T("数据库连接")
			|| csDestItemName.Left(6) == _T("返回值"))
		{
			return FALSE;
		}
		else
		{
			m_hDestItem = m_pDestView->AddItem(hParentDropItem, m_pSourceTreeCtrl->GetItemText(hSelectedItem), hDropItem, nImage, nSelImage, 0);
		}
	}

	else
	{
		if (csDestItemName.Left(8) == _T("流程开始") || csDestItemName.Left(8) == _T("流程结束")
			|| csDestItemName.Left(8) == _T("条件为真")|| csDestItemName.Left(8) == _T("条件为假")
			|| csDestItemName.Left(8) == _T("分支匹配")|| csDestItemName.Left(8) == _T("缺省匹配"))
		{
			m_hDestItem = m_pDestView->AddItem(hDropItem, m_pSourceTreeCtrl->GetItemText(hSelectedItem), TVI_FIRST, nImage, nSelImage, 0);
		}
		else if (csDestItemName.Left(8) == _T("数据定义") || csDestItemName.Left(8) == _T("变量定义") 
			|| csDestItemName.Left(8) == _T("数据分类")|| csDestItemName.Left(10) == _T("数据库连接")
			|| csDestItemName.Left(6) == _T("返回值"))
		{
			return FALSE;
		}
		else
		{
			m_hDestItem = m_pDestView->AddItem(hParentDropItem, m_pSourceTreeCtrl->GetItemText(hSelectedItem), hDropItem, nImage, nSelImage, 0);
		}
	}
	
//	dsACDObjectBase * pObj = g_MapObj.FindObj(hSelectedItem);
//	g_MapObj.AddMapItem(m_hDestItem,pObj);
	g_MapObj.SetTreeItem(hSelectedItem, m_hDestItem);

	AddItem(m_pSourceTreeCtrl->GetChildItem(hSelectedItem),m_hDestItem);
	
	//Remove highlighting
	m_pDestTreeCtrl->SendMessage(TVM_SELECTITEM, TVGN_DROPHILITE,0);
	return TRUE;	
}

/********************************************************************
AddItem()
	Recursive function for adding items from selected tree control to
	destination tree control
********************************************************************/
void CTreeDropTarget::AddItem(HTREEITEM hSrcItem,HTREEITEM hDestItem )
{
	int nImage;
	int nSelImage;
	while ((hSrcItem != NULL) && (hSrcItem != m_hDestItem)) 
	{
		// Get the item text and Image indexes for source tree control
		CString csItemText = m_pSourceTreeCtrl->GetItemText(hSrcItem);

		GetItemImages(hSrcItem, nImage, nSelImage);
		
		// Add item to destination tree control
		HTREEITEM hDestChildItem = m_pDestView->AddItem(hDestItem, csItemText, TVI_LAST, nImage, nSelImage, 0);

//		dsACDObjectBase * pObj = g_MapObj.FindObj(hSrcItem);
//		g_MapObj.AddMapItem(hDestChildItem,pObj);
		g_MapObj.SetTreeItem(hSrcItem, hDestChildItem);

		HTREEITEM hSrcChildItem = m_pSourceTreeCtrl->GetChildItem(hSrcItem);
		
		if(hSrcChildItem != NULL) 
			AddItem(hSrcChildItem, hDestChildItem);
		
		hSrcItem = m_pSourceTreeCtrl->GetNextSiblingItem(hSrcItem);
		hDestItem = m_pDestTreeCtrl->GetParentItem(hDestChildItem);
	}	
}
/********************************************************************
GetItemImages()
	Gets image indexes associated with a tree item
********************************************************************/
void CTreeDropTarget::GetItemImages(HTREEITEM hSrcItem, int &nSelItemImage, int &nNonSelItemImage)
{	
	CImageList *pImageList = m_pSourceTreeCtrl->GetImageList(TVSIL_NORMAL);
	//If no image list is associated with the tree control, return
	if (pImageList == NULL )
	{
		nSelItemImage =0;
		nNonSelItemImage = 0;
	}
	else
	{
		// If no image list is associated with Destination tree control
		// Set the image list of source tree control
		if ( m_pDestTreeCtrl->GetImageList(TVSIL_NORMAL) == NULL )
		{
			m_pDestTreeCtrl->SetImageList(pImageList, TVSIL_NORMAL);
		}
		// Get the image indexes
		m_pSourceTreeCtrl->GetItemImage(hSrcItem, nSelItemImage, nNonSelItemImage);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -