UIDragDropTree.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:18k
源码类别:

图形图象

开发平台:

Visual C++

  1. //*******************************************************************************
  2. // COPYRIGHT NOTES
  3. // ---------------
  4. // You may use this source code, compile or redistribute it as part of your application 
  5. // for free. You cannot redistribute it as a part of a software development 
  6. // library without the agreement of the author. If the sources are 
  7. // distributed along with the application, you should leave the original 
  8. // copyright notes in the source code without any changes.
  9. // This code can be used WITHOUT ANY WARRANTIES at your own risk.
  10. // 
  11. // For the latest updates to this code, check this site:
  12. // http://www.masmex.com 
  13. // after Sept 2000
  14. // 
  15. // Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
  16. //*******************************************************************************
  17. //////////////////////////////////////////////////////////////////////////////////////--*/
  18. // UIDragDropTree.cpp : implementation file
  19. //
  20. #include "stdafx.h"
  21. #include "UICtrl.h"
  22. #include "UIDragDropTree.h"
  23. #include "cbformats.h"
  24. #include "UIRes.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. IMPLEMENT_DYNAMIC(CUIDragDropTree,CTreeCtrl)
  31. /////////////////////////////////////////////////
  32. //
  33. // For OLE drag and drop 
  34. //
  35. /////////////////////////////////////////////////
  36. void CUI_TreeDropTarget::OnDragLeave(CWnd* pWnd)
  37. {
  38. CUIDragDropTree *pTree = static_cast<CUIDragDropTree*>(pWnd);
  39. if (pTree == NULL)
  40. return;
  41. pTree->KillDragTimer();
  42. pTree->SelectDropTarget(NULL);
  43. CDD_OleDropTargetInfo Info(pWnd->GetSafeHwnd());
  44. Info.SetItem(pTree->GetDropHilightItem());
  45. BOOL bRet = pTree->SendMessage(WM_APP_OLE_DD_LEAVE,(WPARAM)&Info);
  46. if (bRet == FALSE)
  47. bRet = pTree->GetParent()->SendMessage(WM_APP_OLE_DD_LEAVE,(WPARAM)&Info);
  48. }
  49. DROPEFFECT CUI_TreeDropTarget::OnDragEnter( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point )
  50. {
  51. // ASSERT_KINDOF(CUIDragDropTree,pWnd);
  52. CUIDragDropTree *pTree = static_cast<CUIDragDropTree*>(pWnd);
  53. if (pTree == NULL)
  54. return DROPEFFECT_NONE;
  55. ((CUIDragDropTree*)pWnd)->SetDragTimer();
  56. CDD_OleDropTargetInfo Info(pWnd->GetSafeHwnd(),point,pDataObject);
  57. m_dwEnterKeyboardState = dwKeyState;
  58. Info.SetKeyboardState(dwKeyState);
  59. Info.SetItem(pTree->GetDropHilightItem());
  60. BOOL bRet = pTree->SendMessage(WM_APP_OLE_DD_ENTER,(WPARAM)&Info);
  61. if (bRet == FALSE)
  62. bRet = pTree->GetParent()->SendMessage(WM_APP_OLE_DD_ENTER,(WPARAM)&Info);
  63. return Info.GetDropEffect();
  64. }
  65. DROPEFFECT CUI_TreeDropTarget::OnDragOver( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point )
  66. {
  67. // disallow if the control key pressed
  68. EraseOldImage();
  69. CUIDragDropTree *pTree = static_cast<CUIDragDropTree*>(pWnd);
  70. if (pTree == NULL)
  71. return DROPEFFECT_NONE;
  72. // ASSERT_KINDOF(CUIDragDropTree,pWnd);
  73. CDD_OleDropTargetInfo Info(pWnd->GetSafeHwnd(),point,pDataObject);
  74. m_dwKeyboardState = dwKeyState;
  75. Info.SetKeyboardState(dwKeyState);
  76. // WM_APP_OLE_DD_OVER message sent in SelectCurrentTarget
  77. DROPEFFECT dropEffect = pTree->SelectCurrentTarget(&Info);
  78. CUI_ImageDropTarget::OnDragOver(pWnd,pDataObject,dwKeyState,point);
  79. return dropEffect;
  80. }
  81. BOOL CUI_TreeDropTarget::OnDrop( CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point )
  82. {
  83. CUIDragDropTree *pTree = static_cast<CUIDragDropTree*>(pWnd);
  84. if (pTree == NULL)
  85. return FALSE;
  86. // ASSERT_KINDOF(CUIDragDropTree,pWnd);
  87. pTree->KillDragTimer();
  88. HTREEITEM hItem = pTree->GetDropHilightItem();
  89. BOOL bRet=FALSE;
  90. if (hItem) 
  91. {
  92. CDD_OleDropTargetInfo Info(pWnd->GetSafeHwnd(),point,pDataObject);
  93. Info.SetDropEffect(dropEffect);
  94. Info.SetItem(hItem);
  95.         if (m_dwEnterKeyboardState & MK_RBUTTON)
  96. m_dwKeyboardState |= MK_RBUTTON;
  97.         if (m_dwEnterKeyboardState & MK_LBUTTON)
  98. m_dwKeyboardState |= MK_LBUTTON;
  99. Info.SetKeyboardState(m_dwKeyboardState);
  100. bRet = pTree->SendMessage(WM_APP_OLE_DD_DROP,(WPARAM)&Info);
  101. if (bRet == FALSE)
  102. bRet = pTree->GetParent()->SendMessage(WM_APP_OLE_DD_DROP,(WPARAM)&Info);
  103. }
  104. pTree->SelectDropTarget(NULL);
  105. return bRet;
  106. }
  107. // During slow scroll, process every third message.
  108. #define SLOWSCROLL_FREQUENCY 3
  109. /////////////////////////////////////////////////////////////////////////////
  110. // CUIDragDropTree
  111. CUIDragDropTree::CUIDragDropTree(bool bDragDrop): m_nUpperYCoor(0), 
  112. m_nLowerYCoor(0), 
  113. m_nSlowScrollTimeout(0),
  114. m_nTimerID(0),
  115. m_bDragging(FALSE),
  116. m_pImageList(NULL),
  117. m_hitemDrag(NULL),
  118. m_hitemDrop(NULL),
  119. m_bDragDrop(bDragDrop),
  120. m_bDropFiles(true)
  121. {
  122. m_nScrollBarSize = GetSystemMetrics( SM_CYHSCROLL );
  123. m_CopyMode = eDDCancel;
  124. }
  125. CUIDragDropTree::~CUIDragDropTree()
  126. {
  127. }
  128. void CUIDragDropTree::OnDropFile(HTREEITEM hItem,LPCTSTR pszFile,UINT nFlags)
  129. {
  130. }
  131. BEGIN_MESSAGE_MAP(CUIDragDropTree, CTreeCtrl)
  132. //{{AFX_MSG_MAP(CUIDragDropTree)
  133. ON_NOTIFY_REFLECT_EX(TVN_BEGINDRAG, OnBegindrag)
  134. ON_NOTIFY_REFLECT_EX(TVN_BEGINRDRAG, OnBeginRDrag)
  135. ON_WM_TIMER()
  136. ON_WM_RBUTTONUP()
  137. ON_WM_MOUSEMOVE()
  138. ON_WM_DESTROY()
  139. ON_WM_CREATE()
  140. ON_WM_DROPFILES()
  141. ON_WM_LBUTTONUP()
  142. //}}AFX_MSG_MAP
  143. END_MESSAGE_MAP()
  144. /////////////////////////////////////////////////////////////////////////////
  145. // CUIDragDropTree message handlers
  146. void CUIDragDropTree::OnDropFiles(HDROP hDropInfo)
  147. {
  148. UINT wNumFilesDropped = DragQueryFile(hDropInfo, 0XFFFFFFFF, NULL, 0);
  149. TCHAR szFile[MAX_PATH];
  150. UINT nLen;
  151. UINT nFlags;
  152. POINT pt;
  153. ::DragQueryPoint(hDropInfo,&pt);
  154. HTREEITEM hitemDrag = HitTest(CPoint(pt), &nFlags);
  155. for(UINT i=0; i < wNumFilesDropped;i++)
  156. {
  157. nLen = DragQueryFile(hDropInfo,i,szFile,sizeof(szFile)/sizeof(TCHAR));
  158. if (nLen)
  159. OnDropFile(hitemDrag,szFile,nFlags);
  160. }
  161. }
  162. BOOL CUIDragDropTree::OnBeginRDrag(NMHDR* pNMHDR, LRESULT* pResult) 
  163. {
  164. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  165. return StartDragDrop(pNMTreeView);
  166. }
  167. BOOL CUIDragDropTree::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 
  168. {
  169. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  170. return StartDragDrop(pNMTreeView);
  171. }
  172. BOOL CUIDragDropTree::StartDragDrop(NM_TREEVIEW* pNMTreeView)
  173. {
  174. /* if (GetDragDrop() == false || pNMTreeView->itemNew.hItem == GetRootItem())
  175. return FALSE;
  176. // See if COM drag drop is implemented in this window or parent window
  177. DWORD dwDragEffect = SendMessage(WM_APP_OLE_DD_DODRAGDROP,(WPARAM)pNMTreeView,(LPARAM)&m_OleDataSource);
  178. if (dwDragEffect == 0)
  179. dwDragEffect = GetParent()->SendMessage(WM_APP_OLE_DD_DODRAGDROP,(WPARAM)pNMTreeView,(LPARAM)&m_OleDataSource);
  180. if (dwDragEffect)   
  181. {
  182. CRect rcDrag; 
  183. m_hitemDrag = pNMTreeView->itemNew.hItem;
  184. // Define starting rect
  185. GetItemRect(pNMTreeView->itemNew.hItem,rcDrag,TRUE);
  186. // Start the DragDrop
  187. DWORD dwEffect = m_OleDataSource.DoDragDrop(dwDragEffect,rcDrag);
  188. // Clear the cache
  189. m_OleDataSource.Empty();        
  190. }
  191. else // otherwise start local drag drop
  192. {
  193. CPoint ptAction;
  194. UINT nFlags;
  195. GetCursorPos(&ptAction);
  196. ScreenToClient(&ptAction);
  197. m_bDragging = TRUE;
  198. m_hitemDrag = HitTest(pNMTreeView->ptDrag, &nFlags);
  199. m_hitemDrop = NULL;
  200. // Create drag image and begin dragging
  201. m_pImageList = CreateDragImage(m_hitemDrag);  
  202. m_pImageList->BeginDrag(0, CPoint(0,0));
  203. m_pImageList->DragEnter(GetDesktopWindow(), ptAction);
  204. SetCapture();
  205. SetDragTimer();  
  206. }
  207. return TRUE;
  208. */ //all commit by ygcl
  209. TRACE0("BEGIN DRAG");
  210. CPoint      ptAction;
  211. UINT        nFlags;
  212. GetCursorPos(&ptAction);
  213. ScreenToClient(&ptAction);
  214. m_bDragging = TRUE;
  215. m_hitemDrag = HitTest(ptAction, &nFlags);
  216. m_hitemDrop = NULL;
  217. ASSERT(m_pImageList == NULL);
  218. m_pImageList = CreateDragImage(m_hitemDrag);  // get the image list for dragging
  219. m_pImageList->DragShowNolock(TRUE);
  220. m_pImageList->SetDragCursorImage(0, CPoint(0, 0));
  221. m_pImageList->BeginDrag(0, CPoint(0,0));
  222. m_pImageList->DragMove(ptAction);
  223. m_pImageList->DragEnter(this, ptAction);
  224. SetCapture();
  225. return TRUE;
  226. }
  227. void CUIDragDropTree::SetDragTimer()
  228. {
  229. // Set the timer to slow down the scrolling when the dragging cursor
  230. // is close to the top/bottom border of the tree control
  231. if (!m_nTimerID) 
  232. {
  233. m_nTimerID = SetTimer(1, 75, NULL);
  234. CRect rect;
  235. GetClientRect(&rect);
  236. ClientToScreen(&rect);
  237. m_nUpperYCoor = rect.top;
  238. m_nLowerYCoor = rect.bottom;
  239. }
  240. }
  241. void CUIDragDropTree::KillDragTimer()
  242. {
  243. if (m_nTimerID)
  244. {
  245. KillTimer(m_nTimerID);
  246. }
  247. m_nTimerID = 0;
  248. m_nUpperYCoor = 0;
  249. m_nLowerYCoor = 0;
  250. m_nSlowScrollTimeout = 0;
  251. }
  252. void CUIDragDropTree::OnTimer(UINT nIDEvent) 
  253. {
  254. // TODO: Add your message handler code here and/or call default
  255. if (nIDEvent != m_nTimerID)
  256. {
  257. CTreeCtrl::OnTimer(nIDEvent);
  258. return;
  259. }
  260. // Get the "current" mouse position
  261. const MSG* pMessage;
  262. CPoint ptMouse;
  263. pMessage = GetCurrentMessage();
  264. ASSERT(pMessage);
  265. ptMouse = pMessage->pt;
  266. // Move the ghost image
  267. if (m_pImageList)
  268. m_pImageList->DragMove(ptMouse);
  269. // Find out if scrolling is needed.
  270. // Scrolling is not needed for example, if the dragging cursor is 
  271. // within the tree control itself
  272. if(!NeedToScroll(ptMouse))
  273. {
  274.    CTreeCtrl::OnTimer(nIDEvent);
  275. return;
  276. }
  277. if (!m_bDragging)
  278. m_OleDropTarget.EraseOldImage();
  279. // Refine the scrolling mode -
  280. // Scroll Up/Down, Slow/Normal
  281.   int nScrollMode = RefineScrollMode(ptMouse);
  282. switch(nScrollMode) 
  283. {
  284. case SCROLL_UP_SLOW:
  285. case SCROLL_DOWN_SLOW:
  286. if( m_nSlowScrollTimeout == 0)
  287. SendMessage( WM_VSCROLL, 
  288. nScrollMode == SCROLL_UP_SLOW ? SB_LINEUP : SB_LINEDOWN);
  289. m_nSlowScrollTimeout = ++m_nSlowScrollTimeout%SLOWSCROLL_FREQUENCY;
  290. break;
  291. case SCROLL_UP_NORMAL:
  292. case SCROLL_DOWN_NORMAL:
  293. SendMessage( WM_VSCROLL, 
  294. nScrollMode == SCROLL_UP_NORMAL ? SB_LINEUP : SB_LINEDOWN);
  295. break;
  296. default:
  297. ASSERT(FALSE);
  298. return;
  299. break;
  300. }
  301. if (m_bDragging)
  302. {
  303. // Select the drop target
  304. if (m_pImageList)
  305. m_pImageList->DragLeave(this);
  306. HTREEITEM hitem = GetFirstVisibleItem();
  307. switch( nScrollMode )
  308.   {
  309. case SCROLL_UP_SLOW:
  310. case SCROLL_UP_NORMAL:
  311.   {
  312. SelectDropTarget(hitem);
  313. m_hitemDrop = hitem;
  314. break;
  315.   }
  316. case SCROLL_DOWN_SLOW:
  317. case SCROLL_DOWN_NORMAL:
  318.   {
  319. // Get the last visible item in the control
  320. int nCount = GetVisibleCount();
  321. for ( int i=0; i<nCount-1; ++i )
  322. hitem = GetNextVisibleItem(hitem);
  323. SelectDropTarget(hitem);
  324. m_hitemDrop = hitem;
  325. break;
  326.   }
  327. default:
  328. ASSERT(FALSE);
  329. return;
  330. break;
  331.   }
  332. if (m_pImageList)
  333. m_pImageList->DragEnter(this, ptMouse); CTreeCtrl::OnTimer(nIDEvent);
  334. }
  335. }
  336. void CUIDragDropTree::OnRButtonUp(UINT nFlags, CPoint point) 
  337. {
  338. if (!m_bDragging)
  339. return;
  340. // Kill the timer and reset all variables
  341. EndDragging();
  342. CMenu menu;
  343. VERIFY(menu.LoadMenu(IDR_POPUPMENU_DRAGDROP));
  344. CMenu* pPopup = menu.GetSubMenu(0);
  345. ASSERT(pPopup != NULL);
  346. pPopup->SetDefaultItem(ID_POPUP_DD_MOVE);
  347. CPoint pts(point);
  348. ClientToScreen(&pts);
  349. if (GetRDragMenu(pPopup))
  350. {
  351. UINT nCmd = pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_NONOTIFY | TPM_RIGHTBUTTON | TPM_RETURNCMD, pts.x, pts.y,this);
  352. if (nCmd == ID_POPUP_DD_MOVE)
  353. {
  354. OnButtonUp(true);
  355. }
  356. else if (nCmd == ID_POPUP_DD_COPY)
  357. {
  358. OnButtonUp(false);
  359. }
  360. }
  361. else
  362. {
  363. // otherwise just move
  364. OnButtonUp(true);
  365. }
  366. CTreeCtrl::OnRButtonUp(nFlags, point);
  367. }
  368. void CUIDragDropTree::OnMouseMove(UINT nFlags, CPoint point) 
  369. {
  370. /* // TODO: Add your message handler code here and/or call default
  371. HTREEITEM hItem;
  372. UINT flags;
  373. if (!m_bDragging)
  374. return;
  375. CPoint ptScreen(point);
  376. ClientToScreen(&ptScreen);
  377. m_pImageList->DragMove(ptScreen);
  378. m_pImageList->DragShowNolock(FALSE);  by ygcl
  379. if ((hItem = HitTest(point, &flags)) != NULL)
  380. {
  381. CDD_OleDropTargetInfo Info(this->GetSafeHwnd(),point,NULL);
  382. Info.SetItem(hItem);
  383. LRESULT lResult = SendMessage(WM_APP_OLE_DD_OVER,(WPARAM)&Info);
  384. if (lResult == 0)
  385. {
  386. lResult = GetParent()->SendMessage(WM_APP_OLE_DD_OVER,(WPARAM)&Info);
  387. }
  388. if (lResult)
  389. {
  390. SelectDropTarget(hItem);
  391. m_hitemDrop = hItem;
  392. }
  393. }
  394. m_pImageList->DragShowNolock(TRUE);
  395. CTreeCtrl::OnMouseMove(nFlags, point);
  396. */ // all commit by ygcl
  397. HTREEITEM           hitem;
  398. UINT                flags;
  399. if (m_bDragging)
  400. {
  401. ASSERT(m_pImageList != NULL);
  402. m_pImageList->DragMove(point);
  403. if ((hitem = HitTest(point, &flags)) != NULL)
  404. {
  405. m_pImageList->DragLeave(this);
  406. SelectDropTarget(hitem);
  407. m_hitemDrop = hitem;
  408. m_pImageList->DragEnter(this, point);
  409. }
  410. HTREEITEM t_hItem;
  411. t_hItem = GetDropHilightItem();
  412. }
  413. CTreeCtrl::OnMouseMove(nFlags, point);
  414. }
  415. void CUIDragDropTree::OnButtonUp(bool bMove)
  416. {
  417. if (!m_bDragging)
  418. return;
  419. EndDragging();
  420. if (m_hitemDrag && m_hitemDrag != m_hitemDrop && !IsChildNodeOf(m_hitemDrop, m_hitemDrag) && 
  421. GetParentItem(m_hitemDrag) != m_hitemDrop)
  422. {
  423. CDD_OleDropTargetInfo Info(GetSafeHwnd(),CPoint(),NULL);
  424. Info.SetDropEffect(bMove ? DROPEFFECT_MOVE : DROPEFFECT_COPY);
  425. Info.SetItem(m_hitemDrop);
  426. LRESULT lResult = SendMessage(WM_APP_OLE_DD_DROP,(WPARAM)&Info);
  427. if (lResult == 0)
  428. lResult = GetParent()->SendMessage(WM_APP_OLE_DD_DROP,(WPARAM)&Info);
  429. }
  430. }
  431. void CUIDragDropTree::EndDragging()
  432. {
  433. if (!m_bDragging)
  434. return;
  435. m_bDragging = FALSE;
  436. if (m_pImageList)
  437. {
  438. m_pImageList->DragLeave(this);
  439. m_pImageList->EndDrag();
  440. }
  441. delete m_pImageList;
  442. m_pImageList = NULL;
  443. ReleaseCapture();
  444. SelectDropTarget( NULL );
  445. KillDragTimer();  
  446. TRACE0("END DRAG");
  447. }
  448. void CUIDragDropTree::NewTransferItem(HTREEITEM hNewItem)
  449. {
  450. }
  451. BOOL CUIDragDropTree::TransferItem(HTREEITEM hitemDrag, HTREEITEM hitemDrop)
  452. {
  453. TV_INSERTSTRUCT tvstruct;
  454. TCHAR sztBuffer[256];
  455. HTREEITEM hNewItem, hFirstChild;
  456. // avoid an infinite recursion situation
  457. tvstruct.item.hItem = hitemDrag;
  458. tvstruct.item.cchTextMax = sizeof(sztBuffer)-1;
  459. tvstruct.item.pszText = sztBuffer;
  460. tvstruct.item.mask = TVIF_CHILDREN | TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_PARAM;
  461. GetItem(&tvstruct.item);  
  462. tvstruct.hParent = hitemDrop;
  463. tvstruct.hInsertAfter = TVI_SORT;
  464. tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_PARAM;
  465. hNewItem = InsertItem(&tvstruct);
  466. NewTransferItem(hNewItem);
  467. while ((hFirstChild = GetChildItem(hitemDrag)) != NULL)
  468. {
  469. // recursively transfer all the items
  470. TransferItem(hFirstChild, hNewItem);  
  471. // delete the first child and all its children
  472. DeleteItem(hFirstChild);
  473. }
  474. return TRUE;
  475. }
  476. BOOL CUIDragDropTree::NeedToScroll( CPoint ptMouse )
  477. {
  478. if (m_bDragging)
  479. {
  480. return ptMouse.y < m_nUpperYCoor || ptMouse.y > m_nLowerYCoor;
  481. }
  482. else
  483. {
  484. return ptMouse.y < m_nUpperYCoor+10 || ptMouse.y > m_nLowerYCoor-30;
  485. }
  486. }
  487. CUIDragDropTree::SCROLLMODE CUIDragDropTree::RefineScrollMode( CPoint ptMouse )
  488. {
  489. int nYCoor = ptMouse.y;
  490. CUIDragDropTree::SCROLLMODE nScrollMode;
  491. if (m_bDragging)
  492. {
  493. nScrollMode = nYCoor > m_nLowerYCoor + m_nScrollBarSize ? SCROLL_DOWN_NORMAL :
  494.   nYCoor > m_nLowerYCoor ? SCROLL_DOWN_SLOW :
  495.   nYCoor < m_nUpperYCoor - m_nScrollBarSize ? SCROLL_UP_NORMAL :
  496.   SCROLL_UP_SLOW;
  497. }
  498. else
  499. {
  500. nScrollMode = nYCoor > m_nLowerYCoor-30 ? SCROLL_DOWN_NORMAL : 
  501. nYCoor < m_nUpperYCoor-10 ? SCROLL_UP_NORMAL : SCROLL_UP_NORMAL;
  502. }
  503. return nScrollMode;
  504. }
  505. BOOL CUIDragDropTree::IsChildNodeOf(HTREEITEM hitemChild, HTREEITEM hitemSuspectedParent)
  506. {
  507. do
  508. {
  509. if (hitemChild == hitemSuspectedParent)
  510. break;
  511. }
  512. while ((hitemChild = GetParentItem(hitemChild)) != NULL);
  513. return (hitemChild != NULL);
  514. }
  515. void CUIDragDropTree::RegisterDropTarget()
  516. {
  517. if (GetDragDrop())
  518. {
  519. VERIFY(m_OleDropTarget.Register(this));
  520. if (GetDropFiles())
  521. DragAcceptFiles();
  522. }
  523. }
  524. DROPEFFECT CUIDragDropTree::SelectCurrentTarget(CDD_OleDropTargetInfo *pInfo)
  525. {
  526. /* HTREEITEM hItem;
  527. UINT flags;
  528. if ((hItem = HitTest(pInfo->GetPoint(), &flags)) != NULL) 
  529. {
  530. // select it
  531. SelectDropTarget(hItem);
  532. // save it
  533. m_hitemDrop = hItem;
  534. // returns 1 if allowed
  535. pInfo->SetItem(hItem);
  536. LRESULT lResult = SendMessage(WM_APP_OLE_DD_OVER,(WPARAM)pInfo);
  537. if (lResult == 0)
  538. {
  539. lResult = GetParent()->SendMessage(WM_APP_OLE_DD_OVER,(WPARAM)pInfo);
  540. }
  541. if (lResult)
  542. {
  543. if (::GetKeyState(VK_LCONTROL) < 0) 
  544. {
  545. if (ItemHasChildren(hItem))
  546. {
  547. Expand(hItem, TVE_EXPAND);
  548. }
  549. }
  550. return pInfo->GetDropEffect();
  551. }
  552. }*/ // ygcl
  553. return DROPEFFECT_NONE;
  554. }
  555. void CUIDragDropTree::OnDestroy() 
  556. {
  557. CTreeCtrl::OnDestroy();
  558. // TODO: Add your message handler code here
  559. }
  560. int CUIDragDropTree::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  561. {
  562. if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
  563. return -1;
  564. // TODO: Add your specialized creation code here
  565. RegisterDropTarget();
  566. return 0;
  567. }
  568. bool CUIDragDropTree::GetRDragMenu(CMenu *pMenu)
  569. {
  570. return true;
  571. }
  572. void CUIDragDropTree::OnDDMove()
  573. {
  574. m_CopyMode = eDDMove;
  575. }
  576. void CUIDragDropTree::OnDDCopy()
  577. {
  578. m_CopyMode = eDDCopy;
  579. }
  580. void CUIDragDropTree::OnDDCancel()
  581. {
  582. m_CopyMode = eDDCancel;
  583. }
  584. void CUIDragDropTree::OnLButtonUp(UINT nFlags, CPoint point) 
  585. {
  586. // TODO: Add your message handler code here and/or call default
  587. if (!m_bDragging)
  588. return;
  589. EndDragging();
  590. if (m_hitemDrag && m_hitemDrag != m_hitemDrop && !IsChildNodeOf(m_hitemDrop, m_hitemDrag) && 
  591. GetParentItem(m_hitemDrag) != m_hitemDrop)
  592. {
  593. CDD_OleDropTargetInfo Info(GetSafeHwnd(),CPoint(),NULL);
  594. Info.SetDropEffect( /*bMove*/ m_CopyMode ? DROPEFFECT_MOVE : DROPEFFECT_COPY);
  595. Info.SetItem(m_hitemDrop);
  596. LRESULT lResult = SendMessage(WM_APP_OLE_DD_DROP,(WPARAM)&Info);
  597. if (lResult == 0)
  598. lResult = GetParent()->SendMessage(WM_APP_OLE_DD_DROP,(WPARAM)&Info);
  599. }
  600. CTreeCtrl::OnLButtonUp(nFlags, point);
  601. }