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

图形图象

开发平台:

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. // IM_OleImageDropTarget.cpp : implementation file
  18. //
  19. #include "stdafx.h"
  20. #include "UIDragImage.h"
  21. #include "UIImageDropTarget.h"
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CUI_ImageDropTarget
  29. CUI_ImageDropTarget::CUI_ImageDropTarget() : m_pImage(NULL),m_pWnd(NULL)
  30. {
  31. m_nCFFormat = ::RegisterClipboardFormat(_T("APP_CF_DD_LISTCTRL_IMAGE"));
  32. m_nImage = -1;
  33. }
  34. CUI_ImageDropTarget::~CUI_ImageDropTarget()
  35. {
  36. }
  37. /////////////////////////////////////////////////
  38. //
  39. // For OLE drag and drop 
  40. //
  41. /////////////////////////////////////////////////
  42. void CUI_ImageDropTarget::OnDragLeave( CWnd* pWnd)
  43. {
  44.     if (m_pImage == NULL) 
  45. return;
  46. // Erase the old drag image and delete the temporary widget.
  47. CClientDC dc(GetImageWin(pWnd));
  48.     m_pImage->DrawDragImage (&dc,m_ptOldImage,m_ptItem);
  49.     delete m_pImage;
  50.     m_pImage = NULL;
  51. COleDropTarget::OnDragLeave(pWnd);
  52. }
  53. DROPEFFECT CUI_ImageDropTarget::OnDragEnter( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point )
  54. {
  55. DROPEFFECT dwEffect = COleDropTarget::OnDragEnter(pWnd,pDataObject,dwKeyState,point);
  56.     HGLOBAL hData = pDataObject->GetGlobalData(GetClipboardFormat());
  57. if (hData == NULL)
  58. return dwEffect;
  59.     //
  60.     // Create a temporary image for drag imaging.
  61.     //
  62.     int *pData = (int*)::GlobalLock(hData);
  63.     int nType = *pData++;
  64. int nSelected = *pData++;
  65.     DD_ImageData *pImageData = (DD_ImageData*)pData;
  66. CPoint pt = pImageData->m_ptDrag;
  67. int i;
  68.     switch (nType) 
  69. {
  70.     case LVS_ICON: 
  71. case LVS_SMALLICON:
  72. case LVS_LIST:
  73. case LVS_REPORT:
  74.         m_pImage = new CDragDropImage(nSelected,nType);
  75. for(i=0;i < nSelected;i++)
  76. {
  77. m_pImage->AddItem(&pImageData->m_rcItem,&pImageData->m_rcIcon);
  78. pImageData++;
  79. }
  80.         break;
  81.     default:
  82. ASSERT(0);
  83. // Just in case
  84.     ::GlobalUnlock(hData);
  85.         return DROPEFFECT_NONE;
  86.     }
  87. // total item
  88.     CRect rcItem;
  89. pData = (int*)pImageData;
  90. rcItem.left = *pData++;
  91. rcItem.right = *pData++;
  92. rcItem.top = *pData++;
  93. rcItem.bottom = *pData;
  94.     ::GlobalUnlock(hData);
  95.     //
  96.     // Begin dragging.
  97.     //
  98. CClientDC dc(GetImageWin(pWnd));
  99. pWnd->ClientToScreen(&point);
  100. m_pWnd->ScreenToClient(&point);
  101.     dc.DPtoLP(&point);
  102. m_ptItem = pt;
  103.     CPoint ptDrag (point.x, point.y);
  104.     m_ptOldImage.x = m_ptOldImage.y = -32000;
  105.     m_ptPrevPos = point;
  106. return dwEffect;
  107. }
  108. DROPEFFECT CUI_ImageDropTarget::OnDragOver( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point )
  109. {
  110. DROPEFFECT dwEffect = COleDropTarget::OnDragOver(pWnd,pDataObject,dwKeyState,point);
  111. if (!pDataObject->IsDataAvailable(GetClipboardFormat()))
  112. return dwEffect;
  113.     // Erase the old drag image and draw a new one if the cursor has moved.
  114. CClientDC dc(GetImageWin(pWnd));
  115. pWnd->ClientToScreen(&point);
  116. m_pWnd->ScreenToClient(&point);
  117.     dc.DPtoLP(&point);
  118.     if (m_pImage && point != m_ptPrevPos) 
  119. {
  120. // erase the old image
  121.         m_pImage->DrawDragImage(&dc,m_ptOldImage,m_ptItem);
  122. //        CPoint ptDrag (point.x - m_sizeDelta.cx, point.y - m_sizeDelta.cy);
  123.         CPoint ptDrag (point.x, point.y);
  124. // draw the new image
  125.         m_pImage->DrawDragImage (&dc, ptDrag, m_ptItem);
  126. // save coords
  127.         m_ptOldImage = ptDrag;
  128.         m_ptPrevPos = point;
  129.     }
  130. return dwEffect;
  131. }
  132. BOOL CUI_ImageDropTarget::OnDrop( CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point )
  133. {
  134. BOOL bRet = COleDropTarget::OnDrop(pWnd,pDataObject,dropEffect,point);
  135. if (!pDataObject->IsDataAvailable(GetClipboardFormat()))
  136. return bRet;
  137.     //
  138.     // Erase the old drag image and delete the temporary widget.
  139.     //
  140.     CClientDC dc(GetImageWin(pWnd));
  141.     if (m_pImage != NULL) 
  142. {
  143.         m_pImage->DrawDragImage (&dc,m_ptOldImage,m_ptItem);
  144.         delete m_pImage;
  145.         m_pImage = NULL;
  146.     }
  147. return bRet;
  148. }
  149. void CUI_ImageDropTarget::EraseOldImage()
  150. {
  151. if (m_pImage == NULL)
  152. return;
  153. CClientDC dc(GetImageWin(NULL));
  154.     m_pImage->DrawDragImage(&dc,m_ptOldImage,m_ptItem);
  155.     m_ptOldImage.x = m_ptOldImage.y = -32000;
  156. }