From 863f21995955fb3e9aa471430218967d4e642c27 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期四, 29 五月 2025 16:11:24 +0800
Subject: [PATCH] Merge branch 'liuyang'

---
 SourceCode/Bond/Servo/GridControl/GridDropTarget.cpp |  156 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 156 insertions(+), 0 deletions(-)

diff --git a/SourceCode/Bond/Servo/GridControl/GridDropTarget.cpp b/SourceCode/Bond/Servo/GridControl/GridDropTarget.cpp
new file mode 100644
index 0000000..c921abf
--- /dev/null
+++ b/SourceCode/Bond/Servo/GridControl/GridDropTarget.cpp
@@ -0,0 +1,156 @@
+// 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 <chris@codeproject.com>
+// Copyright (c) 1998-2005. 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 const 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
\ No newline at end of file

--
Gitblit v1.9.3