PageDragAndDropClient.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:6k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // PageDragAndDropClient.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "toolbox.h"
  22. #include "PageDragAndDropClient.h"
  23. #ifdef _DEBUG
  24. #define new DEBUG_NEW
  25. #undef THIS_FILE
  26. static char THIS_FILE[] = __FILE__;
  27. #endif
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CPageDragAndDropClient
  30. CPageDragAndDropClient::CPageDragAndDropClient()
  31. {
  32. m_imageManager.SetIcons(IDB_TRASH, 0, 0, CSize(48, 48));
  33. m_bDragging = FALSE;
  34. }
  35. CPageDragAndDropClient::~CPageDragAndDropClient()
  36. {
  37. for (int i = 0; i < m_arrItems.GetSize(); i++)
  38. {
  39. m_arrItems[i]->InternalRelease();
  40. }
  41. }
  42. BEGIN_MESSAGE_MAP(CPageDragAndDropClient, CStatic)
  43. //{{AFX_MSG_MAP(CPageDragAndDropClient)
  44. ON_WM_ERASEBKGND()
  45. ON_WM_PAINT()
  46. ON_WM_LBUTTONDOWN()
  47. //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CPageDragAndDropClient message handlers
  51. BOOL CPageDragAndDropClient::OnEraseBkgnd(CDC* )
  52. {
  53. return TRUE;
  54. }
  55. CXTPTaskPanel* CPageDragAndDropClient::GetTaskPanel()
  56. {
  57. CWnd* pSplitterWnd = GetParentFrame()->GetDlgItem(AFX_IDW_PANE_FIRST);
  58. ASSERT_KINDOF(CSplitterWnd, pSplitterWnd);
  59. return (CXTPTaskPanel*)pSplitterWnd->GetDlgItem(AFX_IDW_PANE_FIRST);
  60. }
  61. void CPageDragAndDropClient::OnPaint()
  62. {
  63. CPaintDC dcPaint(this); // device context for painting
  64. CXTPClientRect rc(this);
  65. CXTPBufferDC dc(dcPaint, rc);
  66. dc.FillSolidRect(rc, GetSysColor(COLOR_3DFACE));
  67. for (int i = 0; i < m_arrItems.GetSize(); i++)
  68. {
  69. CXTPTaskPanelGroupItem* pItem = m_arrItems[i];
  70. CRect rcItem = pItem->GetItemRect();
  71. GetTaskPanel()->GetPaintManager()->DrawGroupItemFrame(&dc, pItem, rcItem);
  72. CXTPImageManagerIcon* pImage = GetTaskPanel()->GetImageManager()->GetImage(pItem->GetIconIndex());
  73. if (pImage)
  74. {
  75. CPoint ptIcon((rcItem.right + rcItem.left - 16) / 2, (rcItem.top + rcItem.bottom - 16) / 2);
  76. pImage->Draw(&dc, ptIcon, pImage->GetIcon());
  77. }
  78. }
  79. CRect rcTrash(rc.right - 72, rc.bottom - 72, rc.right - 12, rc.bottom - 12);
  80. dc.FillSolidRect(rcTrash, GetSysColor(COLOR_3DFACE));
  81. dc.Draw3dRect(rcTrash, GetSysColor(COLOR_3DHIGHLIGHT), GetSysColor(COLOR_3DSHADOW));
  82. CXTPImageManagerIcon* pImage = m_imageManager.GetImage(0, 48);
  83. if (pImage)
  84. {
  85. CPoint ptImage((rcTrash.right + rcTrash.left - 48) / 2, (rcTrash.top + rcTrash.bottom - 48) / 2);
  86. pImage->Draw(&dc, ptImage, pImage->GetIcon());
  87. }
  88. }
  89. void CPageDragAndDropClient::PreSubclassWindow()
  90. {
  91. Register(this);
  92. EnableToolTips();
  93. CStatic::PreSubclassWindow();
  94. }
  95. BOOL CPageDragAndDropClient::PtInTrash(CPoint point)
  96. {
  97. CXTPClientRect rc(this);
  98. CRect rcTrash(rc.right - 72, rc.bottom - 72, rc.right - 12, rc.bottom - 12);
  99. return rcTrash.PtInRect(point);
  100. }
  101. DROPEFFECT CPageDragAndDropClient::OnDragOver(CWnd* /*pWnd*/, COleDataObject* pDataObject,
  102. DWORD dwKeyState, CPoint point)
  103. {
  104. if (!pDataObject || !pDataObject->IsDataAvailable(CXTPTaskPanel::GetClipboardFormat()))
  105. return DROPEFFECT_NONE;
  106. if (PtInTrash(point))
  107. return DROPEFFECT_MOVE;
  108. if (!m_bDragging || ((dwKeyState & MK_CONTROL) == MK_CONTROL))
  109. return DROPEFFECT_COPY;
  110. return DROPEFFECT_MOVE;
  111. }
  112. BOOL CPageDragAndDropClient::OnDrop(CWnd* /*pWnd*/, COleDataObject* pDataObject,
  113. DROPEFFECT /*dropEffect*/, CPoint point)
  114. {
  115. if (PtInTrash(point))
  116. return TRUE;
  117. CXTPTaskPanelGroupItem* pItemDrop = (CXTPTaskPanelGroupItem*)CXTPTaskPanelItem::CreateFromOleData(pDataObject);
  118. if (!pItemDrop)
  119. return FALSE;
  120. ASSERT_KINDOF(CXTPTaskPanelGroupItem, pItemDrop);
  121. m_arrItems.Add(pItemDrop);
  122. pItemDrop->SetItemRect(CRect(point.x - 14, point.y - 14, point.x + 14, point.y + 14));
  123. Invalidate(FALSE);
  124. return TRUE;
  125. }
  126. int CPageDragAndDropClient::HitTest(CPoint point) const
  127. {
  128. for (int i = (int)m_arrItems.GetSize() - 1; i >= 0; i--)
  129. {
  130. CXTPTaskPanelGroupItem* pItem = m_arrItems[i];
  131. if (pItem->GetItemRect().PtInRect(point))
  132. return i;
  133. }
  134. return -1;
  135. }
  136. void CPageDragAndDropClient::OnLButtonDown(UINT /*nFlags*/, CPoint point)
  137. {
  138. int nHit = HitTest(point);
  139. CXTPTaskPanelGroupItem* pItem = (nHit >= 0? m_arrItems[nHit]: NULL);
  140. if (!pItem)
  141. return;
  142. COleDataSource ds;
  143. if (!pItem->PrepareDrag(ds))
  144. return;
  145. m_bDragging = TRUE;
  146. DROPEFFECT dropEffect = ds.DoDragDrop(DROPEFFECT_COPY|DROPEFFECT_MOVE);
  147. m_bDragging = FALSE;
  148. if (dropEffect == DROPEFFECT_MOVE)
  149. {
  150. pItem->InternalRelease();
  151. m_arrItems.RemoveAt(nHit);
  152. }
  153. Invalidate(FALSE);
  154. }
  155. INT_PTR CPageDragAndDropClient::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
  156. {
  157. // check child windows first by calling CControlBar
  158. INT_PTR nHit = CWnd::OnToolHitTest(point, pTI);
  159. if (nHit != -1)
  160. return nHit;
  161. int nItem = HitTest(point);
  162. CXTPTaskPanelGroupItem* pItem = (nItem >= 0? m_arrItems[nItem]: NULL);
  163. if (pItem)
  164. {
  165. int nHit = pItem->GetID();
  166. CString strTip = pItem->GetCaption();
  167. if (strTip.GetLength() == 0)
  168. return -1;
  169. #if _MSC_VER < 1200 // MFC 5.0
  170. if (pTI != NULL)
  171. #else
  172. if (pTI != NULL)
  173. #endif
  174. {
  175. pTI->hwnd = GetSafeHwnd();
  176. pTI->rect = pItem->GetItemRect();
  177. pTI->uId = nHit;
  178. pTI->lpszText = (LPTSTR) ::calloc(strTip.GetLength() + 1, sizeof(TCHAR));
  179. if( pTI->lpszText != NULL ) STRCPY_S(pTI->lpszText, strTip.GetLength() + 1, (LPCTSTR)strTip);
  180. }
  181. return TRUE;
  182. }
  183. return -1;
  184. }