// GridDropTarget.cpp : implementation file // // MFC Grid Control - Drag/Drop target implementation // // CGridDropTarget is an OLE drop target for CGridCtrl. All it does // is handle the drag and drop windows messages and pass them // directly onto the grid control. // // Written by Chris Maunder // Copyright (c) 1998-2001. All Rights Reserved. // // This code may be used in compiled form in any way you desire. This // file may be redistributed unmodified by any means PROVIDING it is // not sold for profit without the authors written consent, and // providing that this notice and the authors name and all copyright // notices remains intact. // // An email letting me know how you are using it would be nice as well. // // This file is provided "as is" with no expressed or implied warranty. // The author accepts no liability for any damage/loss of business that // this product may cause. // // For use with CGridCtrl v2.10+ // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "GridCtrl.h" #ifndef GRIDCONTROL_NO_DRAGDROP #include "GridDropTarget.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CGridDropTarget CGridDropTarget::CGridDropTarget() { m_pGridCtrl = NULL; m_bRegistered = FALSE; } CGridDropTarget::~CGridDropTarget() { } // Overloaded Register() function performs the normal COleDropTarget::Register // but also serves to connect this COleDropTarget with the parent grid control, // where all drop messages will ultimately be forwarded. BOOL CGridDropTarget::Register(CGridCtrl *pGridCtrl) { if (m_bRegistered) return FALSE; // Stop re-entry problems static BOOL bInProcedure = FALSE; if (bInProcedure) return FALSE; bInProcedure = TRUE; ASSERT(pGridCtrl->IsKindOf(RUNTIME_CLASS(CGridCtrl))); ASSERT(pGridCtrl); if (!pGridCtrl || !pGridCtrl->IsKindOf(RUNTIME_CLASS(CGridCtrl))) { bInProcedure = FALSE; return FALSE; } m_pGridCtrl = pGridCtrl; m_bRegistered = COleDropTarget::Register(pGridCtrl); bInProcedure = FALSE; return m_bRegistered; } void CGridDropTarget::Revoke() { m_bRegistered = FALSE; COleDropTarget::Revoke(); } BEGIN_MESSAGE_MAP(CGridDropTarget, COleDropTarget) //{{AFX_MSG_MAP(CGridDropTarget) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CGridDropTarget message handlers DROPEFFECT CGridDropTarget::OnDragScroll(CWnd* pWnd, DWORD dwKeyState, CPoint /*point*/) { // TRACE("In CGridDropTarget::OnDragScroll\n"); if (pWnd->GetSafeHwnd() == m_pGridCtrl->GetSafeHwnd()) { if (dwKeyState & MK_CONTROL) return DROPEFFECT_COPY; else return DROPEFFECT_MOVE; } else return DROPEFFECT_NONE; } DROPEFFECT CGridDropTarget::OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point) { TRACE(_T("In CGridDropTarget::OnDragEnter\n")); ASSERT(m_pGridCtrl); if (pWnd->GetSafeHwnd() == m_pGridCtrl->GetSafeHwnd()) return m_pGridCtrl->OnDragEnter(pDataObject, dwKeyState, point); else return DROPEFFECT_NONE; } void CGridDropTarget::OnDragLeave(CWnd* pWnd) { TRACE(_T("In CGridDropTarget::OnDragLeave\n")); ASSERT(m_pGridCtrl); if (pWnd->GetSafeHwnd() == m_pGridCtrl->GetSafeHwnd()) m_pGridCtrl->OnDragLeave(); } DROPEFFECT CGridDropTarget::OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point) { // TRACE("In CGridDropTarget::OnDragOver\n"); ASSERT(m_pGridCtrl); if (pWnd->GetSafeHwnd() == m_pGridCtrl->GetSafeHwnd()) return m_pGridCtrl->OnDragOver(pDataObject, dwKeyState, point); else return DROPEFFECT_NONE; } BOOL CGridDropTarget::OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point) { TRACE(_T("In CGridDropTarget::OnDrop\n")); ASSERT(m_pGridCtrl); if (pWnd->GetSafeHwnd() == m_pGridCtrl->GetSafeHwnd()) return m_pGridCtrl->OnDrop(pDataObject, dropEffect, point); else return FALSE; } #endif // GRIDCONTROL_NO_DRAGDROP