📄 treedroptarget.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 + -