OleTarget.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:7k
源码类别:

CA认证

开发平台:

Visual C++

  1. // COleTarget.cpp: implementation of the COleDropTargetEx class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "..MiniCA.h"
  6. #include "OleTarget.h"
  7. #include <shlwapi.h>
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. //********************************************************************
  14. // If you don't have a recent Platform SDK installed, you'll get linker
  15. // errors on CLSID_DragDropHelper and IID_IDropTargetHelper, and you
  16. // won't have the definition of IDropTargetHelper.  Uncomment the
  17. // following stuff to fix that.
  18. /*
  19. struct IDropTargetHelper : public IUnknown
  20. {
  21. // IUnknown methods
  22. STDMETHOD (QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
  23. STDMETHOD_(ULONG, AddRef) ( THIS ) PURE;
  24. STDMETHOD_(ULONG, Release) ( THIS ) PURE;
  25.   // IDropTargetHelper
  26.   STDMETHOD (DragEnter)(THIS_ HWND hwndTarget, IDataObject* pDataObject,
  27.   POINT* ppt, DWORD dwEffect) PURE;
  28.   STDMETHOD (DragLeave)(THIS) PURE;
  29.   STDMETHOD (DragOver)(THIS_ POINT* ppt, DWORD dwEffect) PURE;
  30.   STDMETHOD (Drop)(THIS_ IDataObject* pDataObject, POINT* ppt,
  31.   DWORD dwEffect) PURE;
  32.   STDMETHOD (Show)(THIS_ BOOL fShow) PURE;
  33.   };
  34.   
  35. // {4657278A-411B-11d2-839A-00C04FD918D0}
  36. extern "C" const GUID __declspec(selectany) CLSID_DragDropHelper = 
  37.     { 0x4657278a, 0x411b, 0x11d2, { 0x83, 0x9a, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0xd0 }};
  38.   // {4657278B-411B-11d2-839A-00C04FD918D0}
  39.   extern "C" const GUID __declspec(selectany) IID_IDropTargetHelper = 
  40.   { 0x4657278b, 0x411b, 0x11d2, { 0x83, 0x9a, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0xd0 }};
  41. */
  42. //********************************************************************
  43. //////////////////////////////////////////////////////////////////////
  44. // Construction/destruction
  45. CDropTarget::CDropTarget() :m_piDropHelper(NULL), m_bUseDnDHelper(false)
  46. {
  47.     // Create an instance of the shell DnD helper object.
  48.     if ( SUCCEEDED( CoCreateInstance ( CLSID_DragDropHelper, NULL, 
  49. CLSCTX_INPROC_SERVER,
  50. IID_IDropTargetHelper, 
  51. (void**) &m_piDropHelper ) ))
  52. {
  53.         m_bUseDnDHelper = true;
  54. }
  55. }
  56. CDropTarget::~CDropTarget()
  57. {
  58.     if ( NULL != m_piDropHelper )
  59.         m_piDropHelper->Release();
  60. }
  61. //////////////////////////////////////////////////////////////////////
  62. // IDropTarget methods
  63. DROPEFFECT CDropTarget::OnDragEnter ( CWnd* pWnd, COleDataObject* pDataObject,
  64.    DWORD dwKeyState, CPoint point )
  65. {
  66. m_StrArray.RemoveAll();
  67. DROPEFFECT dwEffect = DROPEFFECT_NONE;
  68.     // Check for our own custom clipboard format in the data object.  If it's
  69.     // present, then the DnD was initiated from our own window, and we won't
  70.     // accept the drop.
  71.     // If it's not present, then we check for CF_HDROP data in the data object.
  72.  if ( NULL == pDataObject->GetGlobalData ( m_uCustomClipbrdFormat ))
  73. {
  74. // Look for CF_HDROP data in the data object, and accept the drop if
  75. // it's there.
  76.   if ( NULL != pDataObject->GetGlobalData ( CF_HDROP ) )
  77.   dwEffect = DROPEFFECT_COPY;
  78. }
  79.     // Call the DnD helper.
  80.     if ( m_bUseDnDHelper )
  81. {
  82.         // The DnD helper needs an IDataObject interface, so get one from
  83.         // the COleDataObject.  Note that the FALSE param means that
  84.         // GetIDataObject will not AddRef() the returned interface, so 
  85.         // we do not Release() it.
  86.         IDataObject* piDataObj = pDataObject->GetIDataObject ( FALSE ); 
  87.         m_piDropHelper->DragEnter ( pWnd->GetSafeHwnd(), piDataObj, 
  88. &point, dwEffect );
  89. }
  90.     return dwEffect;
  91. }
  92. DROPEFFECT CDropTarget::OnDragOver( CWnd* pWnd, COleDataObject* pDataObject,
  93.   DWORD dwKeyState, CPoint point )
  94. {
  95. DROPEFFECT dwEffect = DROPEFFECT_NONE;
  96.     // Check for our own custom clipboard format in the data object.  If it's
  97.     // present, then the DnD was initiated from our own window, and we won't
  98.     // accept the drop.
  99.     // If it's not present, then we check for CF_HDROP data in the data object.
  100.     if ( NULL == pDataObject->GetGlobalData ( m_uCustomClipbrdFormat ))
  101. {
  102.         // Look for CF_HDROP data in the data object, and accept the drop if
  103.         // it's there.
  104.         if ( NULL != pDataObject->GetGlobalData ( CF_HDROP ) )
  105.             dwEffect = DROPEFFECT_COPY;
  106. }
  107.     // Call the DnD helper.
  108.     if ( m_bUseDnDHelper )
  109. {
  110.         m_piDropHelper->DragOver ( &point, dwEffect );
  111. }
  112.     return dwEffect;
  113. }
  114. BOOL CDropTarget::OnDrop(CWnd* pWnd, COleDataObject* pDataObject,
  115. DROPEFFECT dropEffect, CPoint point )
  116. {
  117.     // Read the CF_HDROP data and put the files in the main window's list.
  118.    ReadHdropData (pDataObject);
  119.     // Call the DnD helper.
  120.     if ( m_bUseDnDHelper )
  121. {
  122.         // The DnD helper needs an IDataObject interface, so get one from
  123.         // the COleDataObject.  Note that the FALSE param means that
  124.         // GetIDataObject will not AddRef() the returned interface, so 
  125.         // we do not Release() it.
  126.         IDataObject* piDataObj = pDataObject->GetIDataObject ( FALSE ); 
  127.         m_piDropHelper->Drop ( piDataObj, &point, dropEffect );
  128. }
  129. ASSERT(::IsWindow(pWnd->m_hWnd));
  130. return ::SendMessage( pWnd->GetSafeHwnd(), DROPM_DROPOK, (WPARAM)&m_StrArray, 0 );
  131. }
  132. void CDropTarget::OnDragLeave ( CWnd* pWnd )
  133. {
  134.     if ( m_bUseDnDHelper )
  135. {
  136.         m_piDropHelper->DragLeave();
  137. }
  138. }
  139. // ReadHdropData() reads CF_HDROP data from the passed-in data object, and 
  140. // puts all dropped files/folders into the main window's list control.
  141. BOOL CDropTarget::ReadHdropData (COleDataObject* pDataObject )
  142. {
  143. HGLOBAL     hg;
  144. HDROP       hdrop;
  145. UINT        uNumFiles;
  146. TCHAR       szNextFile [MAX_PATH];
  147. // HANDLE      hFind;
  148. // WIN32_FIND_DATA rFind;
  149. // TCHAR       szFileLen [64];
  150.     // Get the HDROP data from the data object.
  151.     hg = pDataObject->GetGlobalData ( CF_HDROP );
  152.     
  153.     if ( NULL == hg )
  154. {
  155.         return FALSE;
  156. }
  157.     hdrop = (HDROP) GlobalLock ( hg );
  158.     if ( NULL == hdrop )
  159. {
  160.         GlobalUnlock ( hg );
  161.         return FALSE;
  162. }
  163.     // Get the # of files being dropped.
  164.     uNumFiles = DragQueryFile ( hdrop, -1, NULL, 0 );
  165.     for ( UINT uFile = 0; uFile < uNumFiles; uFile++ )
  166. {
  167.         // Get the next filename from the HDROP info.
  168.         if ( DragQueryFile ( hdrop, uFile, szNextFile, MAX_PATH ) > 0 )
  169. {
  170.             // If the filename is already in the list, skip it.
  171.             // Get the index of the file's icon in the system image list and
  172.             // it's type description.
  173. /*            SHGetFileInfo ( szNextFile, 0, &rFileInfo, sizeof(rFileInfo),
  174. SHGFI_SYSICONINDEX | SHGFI_ATTRIBUTES |
  175. SHGFI_TYPENAME );*/
  176. m_StrArray.Add(szNextFile);
  177.        /*     hFind = FindFirstFile ( szNextFile, &rFind );
  178.             if ( INVALID_HANDLE_VALUE != hFind )
  179. {
  180.                 StrFormatByteSize ( rFind.nFileSizeLow, szFileLen, 64 );
  181.                 FindClose ( hFind );
  182. }*/
  183. }
  184. }   // end for
  185.     GlobalUnlock ( hg );
  186.     // Resize columns so all text is visible.
  187.     return TRUE;
  188. }