www.pudn.com > RichEditGrid_src.zip > GridDropTarget.cpp


// 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-2002. 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