home *** CD-ROM | disk | FTP | other *** search
/ Team Palmtops 7 / Palmtops_numero07.iso / WinCE / SDKWindowsCE / HandHeldPCPro30 / sdk.exe / Jupiter SDK / data1.cab / MFC_Samples / cmnctrls / mtreectl.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1999-02-19  |  4.4 KB  |  185 lines

  1. // MyTreeCtrl.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "ctrldemo.h"
  6. #include "mtreectl.h"
  7. #include "treecpg.h"
  8.  
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14.  
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CMyTreeCtrl
  17.  
  18. CMyTreeCtrl::CMyTreeCtrl()
  19. {
  20.     m_bDragging = FALSE;
  21.     m_pimagelist = NULL;
  22. }
  23.  
  24. CMyTreeCtrl::~CMyTreeCtrl()
  25. {
  26. }
  27.  
  28.  
  29. BEGIN_MESSAGE_MAP(CMyTreeCtrl, CTreeCtrl)
  30.     //{{AFX_MSG_MAP(CMyTreeCtrl)
  31.     ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndLabelEdit)
  32. //    ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBeginDrag)
  33. //    ON_NOTIFY_REFLECT(TVN_BEGINRDRAG, OnBeginDrag)
  34.     ON_WM_MOUSEMOVE()
  35.     ON_WM_DESTROY()
  36.     ON_WM_LBUTTONUP()
  37.     //}}AFX_MSG_MAP
  38. END_MESSAGE_MAP()
  39.  
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CMyTreeCtrl message handlers
  42. void CMyTreeCtrl::OnDestroy()
  43. {
  44.     CImageList    *pimagelist;
  45.  
  46.     pimagelist = GetImageList(TVSIL_NORMAL);
  47.     pimagelist->DeleteImageList();
  48.     delete pimagelist;
  49. }
  50.  
  51. void CMyTreeCtrl::SetNewStyle(long lStyleMask, BOOL bSetBits)
  52. {
  53.     long        lStyleOld;
  54.  
  55.     lStyleOld = GetWindowLong(m_hWnd, GWL_STYLE);
  56.     lStyleOld &= ~lStyleMask;
  57.     if (bSetBits)
  58.         lStyleOld |= lStyleMask;
  59.  
  60.     SetWindowLong(m_hWnd, GWL_STYLE, lStyleOld);
  61.     SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
  62. }
  63.  
  64. void CMyTreeCtrl::OnEndLabelEdit(LPNMHDR pnmhdr, LRESULT *pLResult)
  65. {
  66.     TV_DISPINFO        *ptvinfo;
  67.  
  68.     ((CTreeCtrlPage *)GetParent())->ShowNotification(pnmhdr, pLResult);
  69.     ptvinfo = (TV_DISPINFO *)pnmhdr;
  70.     if (ptvinfo->item.pszText != NULL)
  71.     {
  72.         ptvinfo->item.mask = TVIF_TEXT;
  73.         SetItem(&ptvinfo->item);
  74.     }
  75.     *pLResult = TRUE;
  76. }
  77.  
  78. void CMyTreeCtrl::OnMouseMove(UINT nFlags, CPoint point)
  79. {
  80.     HTREEITEM            hitem;
  81.     UINT                flags;
  82.  
  83.     if (m_bDragging)
  84.     {
  85.         m_pimagelist->DragMove(point);
  86.         if ((hitem = HitTest(point, &flags)) != NULL)
  87.         {
  88.             m_pimagelist->DragLeave(this);
  89.             SelectDropTarget(hitem);
  90.             m_hitemDrop = hitem;
  91.             m_pimagelist->DragEnter(this, point);
  92.         }
  93.     }
  94.  
  95.     CTreeCtrl::OnMouseMove(nFlags, point);
  96. }
  97.  
  98. BOOL CMyTreeCtrl::IsChildNodeOf(HTREEITEM hitemChild, HTREEITEM hitemSuspectedParent)
  99. {
  100.     do
  101.     {
  102.         if (hitemChild == hitemSuspectedParent)
  103.             break;
  104.     }
  105.     while ((hitemChild = GetParentItem(hitemChild)) != NULL);
  106.  
  107.     return (hitemChild != NULL);
  108. }
  109.  
  110.  
  111. BOOL CMyTreeCtrl::TransferItem(HTREEITEM hitemDrag, HTREEITEM hitemDrop)
  112. {
  113.     TV_INSERTSTRUCT        tvstruct;
  114.     TCHAR                sztBuffer[50];
  115.     HTREEITEM            hNewItem, hFirstChild;
  116.  
  117.         // avoid an infinite recursion situation
  118.     tvstruct.item.hItem = hitemDrag;
  119.     tvstruct.item.cchTextMax = 49;
  120.     tvstruct.item.pszText = sztBuffer;
  121.     tvstruct.item.mask = TVIF_CHILDREN | TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
  122.     GetItem(&tvstruct.item);  // get information of the dragged element
  123.     tvstruct.hParent = hitemDrop;
  124.     tvstruct.hInsertAfter = TVI_SORT;
  125.     tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
  126.     hNewItem = InsertItem(&tvstruct);
  127.  
  128.     while ((hFirstChild = GetChildItem(hitemDrag)) != NULL)
  129.     {
  130.         TransferItem(hFirstChild, hNewItem);  // recursively transfer all the items
  131.         DeleteItem(hFirstChild);        // delete the first child and all its children
  132.     }
  133.     return TRUE;
  134. }
  135.  
  136. void CMyTreeCtrl::OnButtonUp()
  137. {
  138.     if (m_bDragging)
  139.     {
  140.         m_pimagelist->DragLeave(this);
  141.         m_pimagelist->EndDrag();
  142.         if (m_hitemDrag != m_hitemDrop && !IsChildNodeOf(m_hitemDrop, m_hitemDrag) && 
  143.                                                             GetParentItem(m_hitemDrag) != m_hitemDrop)
  144.         {
  145.             TransferItem(m_hitemDrag, m_hitemDrop);
  146.             DeleteItem(m_hitemDrag);
  147.         }
  148.         else
  149.             MessageBeep(0);
  150.  
  151.         ReleaseCapture();
  152.         m_bDragging = FALSE;
  153.         SelectDropTarget(NULL);
  154.     }
  155. }
  156.  
  157. void CMyTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point)
  158. {
  159.     OnButtonUp();
  160.     CTreeCtrl::OnLButtonUp(nFlags, point);
  161. }
  162.  
  163. /*
  164. void CMyTreeCtrl::OnBeginDrag(LPNMHDR pnmhdr, LRESULT *pLResult)
  165. {
  166.     CPoint        ptAction;
  167.     UINT        nFlags;
  168.  
  169.     GetCursorPos(&ptAction);
  170.     ScreenToClient(&ptAction);
  171.     ((CTreeCtrlPage *)GetParent())->ShowNotification(pnmhdr, pLResult);
  172.     ASSERT(!m_bDragging);
  173.     m_bDragging = TRUE;
  174.     m_hitemDrag = HitTest(ptAction, &nFlags);
  175.     m_hitemDrop = NULL;
  176.     m_pimagelist = CreateDragImage(m_hitemDrag);  // get the image list for dragging
  177.     m_pimagelist->DragShowNolock(TRUE);
  178.     m_pimagelist->SetDragCursorImage(0, CPoint(0, 0));
  179.     m_pimagelist->BeginDrag(0, CPoint(0,0));
  180.     m_pimagelist->DragMove(ptAction);
  181.     m_pimagelist->DragEnter(this, ptAction);
  182.     SetCapture();
  183. }
  184. */
  185.