inline HRESULT __stdcall ISimpleDropTarget::DragEnter(IDataObject * pDataObject, DWORD grfKeyState, POINTL ptl, DWORD * pdwEffect) { POINT pt; pt.x = ptl.x; pt.y = ptl.y; if (m_pdth && PrevFancyRenderer) { m_pdth->DragEnter(m_hwnd, pDataObject, &pt, *pdwEffect); } m_DataObject = pDataObject; dragInAction = true; m_RightData = QueryDataObject(pDataObject); bool canDrop = m_RightData && AllowDrop(ptl); if (canDrop) { SetFocus(m_hwnd); auto files = GetFiles(pDataObject); *pdwEffect = OnDragEnter(files, grfKeyState, ptl); } else { *pdwEffect = DROPEFFECT_NONE; } return S_OK; }
HRESULT DropTarget::DragEnter(IDataObject* data_object, DWORD key_state, POINTL cursor_position, DWORD* effect) { // Tell the helper that we entered so it can update the drag image. IDropTargetHelper* drop_helper = DropHelper(); if (drop_helper) { drop_helper->DragEnter(GetHWND(), data_object, reinterpret_cast<POINT*>(&cursor_position), *effect); } // You can't drag and drop within the same HWND. if (suspended_) { *effect = DROPEFFECT_NONE; return S_OK; } current_data_object_ = data_object; POINT screen_pt = { cursor_position.x, cursor_position.y }; *effect = OnDragEnter(current_data_object_, key_state, screen_pt, *effect); return S_OK; }
DROPEFFECT CBCGPPlannerDropTarget::OnDragScroll(CWnd* pWnd, DWORD dwKeyState, CPoint point) { if (m_pPlanner == NULL) { return DROPEFFECT_NONE; } ASSERT_VALID (m_pPlanner); DROPEFFECT dropEffect = m_pPlanner->OnDragScroll(dwKeyState, point); // DROPEFFECT_SCROLL means do the default if (dropEffect != DROPEFFECT_SCROLL) return dropEffect; // get client rectangle of destination window CRect rectClient; m_pPlanner->GetDragScrollRect(rectClient); CRect rect = rectClient; // hit-test against inset region UINT nTimerID = MAKEWORD(-1, -1); rect.InflateRect(-nScrollInset, -nScrollInset); if (rectClient.PtInRect(point) && !rect.PtInRect(point)) { // determine which way to scroll along both X & Y axis if (point.x < rect.left) { nTimerID = MAKEWORD(SB_LINEUP, HIBYTE(nTimerID)); } else if (point.x >= rect.right) { nTimerID = MAKEWORD(SB_LINEDOWN, HIBYTE(nTimerID)); } if (point.y < rect.top) { nTimerID = MAKEWORD(LOBYTE(nTimerID), SB_LINEUP); } else if (point.y >= rect.bottom) { nTimerID = MAKEWORD(LOBYTE(nTimerID), SB_LINEDOWN); } ASSERT(nTimerID != MAKEWORD(-1, -1)); BOOL bEnableScroll = m_pPlanner->OnScroll(nTimerID, 0, FALSE); if (!bEnableScroll) { nTimerID = MAKEWORD(-1, -1); } } if (m_nTimerID == MAKEWORD(-1, -1) && nTimerID != MAKEWORD(-1, -1)) { // send fake OnDragEnter when transition from scroll->normal COleDataObject dataObject; dataObject.Attach(m_lpDataObject, FALSE); OnDragEnter(pWnd, &dataObject, dwKeyState, point); } if (nTimerID == MAKEWORD(-1, -1)) { if (m_nTimerID != MAKEWORD(-1, -1)) { // send fake OnDragEnter when transition from scroll->normal //COleDataObject dataObject; //dataObject.Attach(m_lpDataObject, FALSE); //OnDragEnter(pWnd, &dataObject, dwKeyState, point); m_nTimerID = MAKEWORD(-1, -1); } return DROPEFFECT_NONE; } // save tick count when timer ID changes DWORD dwTick = GetTickCount(); if (nTimerID != m_nTimerID) { m_dwLastTick = dwTick; m_nScrollDelay = nScrollDelay; } // scroll if necessary if (dwTick - m_dwLastTick > m_nScrollDelay) { m_pPlanner->OnScroll(nTimerID, 0, TRUE); m_dwLastTick = dwTick; m_nScrollDelay = nScrollInterval; } if (m_nTimerID == MAKEWORD(-1, -1)) { // send fake OnDragLeave when transitioning from normal->scroll //OnDragLeave(pWnd); } m_nTimerID = nTimerID; /* // check for force link if ((dwKeyState & (MK_CONTROL | MK_SHIFT)) == (MK_CONTROL | MK_SHIFT)) dropEffect = DROPEFFECT_SCROLL|DROPEFFECT_LINK; // check for force copy else */if ((dwKeyState & MK_CONTROL) == MK_CONTROL) dropEffect = DROPEFFECT_SCROLL | DROPEFFECT_COPY; // check for force move else if ((dwKeyState & MK_ALT) == MK_ALT || (dwKeyState & MK_SHIFT) == MK_SHIFT) dropEffect = DROPEFFECT_SCROLL | DROPEFFECT_MOVE; // default -- recommended action is move else dropEffect = DROPEFFECT_SCROLL | DROPEFFECT_MOVE; return dropEffect; }
void UUserWidget::NativeOnDragEnter( const FGeometry& InGeometry, const FDragDropEvent& InDragDropEvent, UDragDropOperation* InOperation ) { OnDragEnter( InGeometry, InDragDropEvent, InOperation ); }
DROPEFFECT COleDropTarget::OnDragScroll(CWnd* pWnd, DWORD dwKeyState, CPoint point) { ASSERT_VALID(this); ASSERT_VALID(pWnd); // CWnds are allowed, but don't support autoscrolling if (!pWnd->IsKindOf(RUNTIME_CLASS(CView))) return DROPEFFECT_NONE; CView* pView = (CView*)pWnd; DROPEFFECT dropEffect = pView->OnDragScroll(dwKeyState, point); // DROPEFFECT_SCROLL means do the default if (dropEffect != DROPEFFECT_SCROLL) return dropEffect; // get client rectangle of destination window CRect rectClient; pWnd->GetClientRect(&rectClient); CRect rect = rectClient; // hit-test against inset region UINT nTimerID = 0xffff; rect.InflateRect(-nScrollInset, -nScrollInset); CSplitterWnd* pSplitter = NULL; if (rectClient.PtInRect(point) && !rect.PtInRect(point)) { // determine which way to scroll along both X & Y axis if (point.x < rect.left) nTimerID = MAKEWORD(SB_LINEUP, HIBYTE(nTimerID)); else if (point.x >= rect.right) nTimerID = MAKEWORD(SB_LINEDOWN, HIBYTE(nTimerID)); if (point.y < rect.top) nTimerID = MAKEWORD(LOBYTE(nTimerID), SB_LINEUP); else if (point.y >= rect.bottom) nTimerID = MAKEWORD(LOBYTE(nTimerID), SB_LINEDOWN); ASSERT(nTimerID != 0xffff); // check for valid scroll first pSplitter = CView::GetParentSplitter(pView, FALSE); BOOL bEnableScroll = FALSE; if (pSplitter != NULL) bEnableScroll = pSplitter->DoScroll(pView, nTimerID, FALSE); else bEnableScroll = pView->OnScroll(nTimerID, 0, FALSE); if (!bEnableScroll) nTimerID = 0xffff; } if (nTimerID == 0xffff) { if (m_nTimerID != 0xffff) { // send fake OnDragEnter when transition from scroll->normal COleDataObject dataObject; dataObject.Attach(m_lpDataObject, FALSE); OnDragEnter(pWnd, &dataObject, dwKeyState, point); m_nTimerID = 0xffff; } return DROPEFFECT_NONE; } // save tick count when timer ID changes DWORD dwTick = GetTickCount(); if (nTimerID != m_nTimerID) { m_dwLastTick = dwTick; m_nScrollDelay = nScrollDelay; } // scroll if necessary if (dwTick - m_dwLastTick > m_nScrollDelay) { if (pSplitter != NULL) pSplitter->DoScroll(pView, nTimerID, TRUE); else pView->OnScroll(nTimerID, 0, TRUE); m_dwLastTick = dwTick; m_nScrollDelay = nScrollInterval; } if (m_nTimerID == 0xffff) { // send fake OnDragLeave when transitioning from normal->scroll OnDragLeave(pWnd); } m_nTimerID = nTimerID; // check for force link if ((dwKeyState & (MK_CONTROL|MK_SHIFT)) == (MK_CONTROL|MK_SHIFT)) dropEffect = DROPEFFECT_SCROLL|DROPEFFECT_LINK; // check for force copy else if ((dwKeyState & MK_CONTROL) == MK_CONTROL) dropEffect = DROPEFFECT_SCROLL|DROPEFFECT_COPY; // check for force move else if ((dwKeyState & MK_ALT) == MK_ALT || (dwKeyState & MK_SHIFT) == MK_SHIFT) dropEffect = DROPEFFECT_SCROLL|DROPEFFECT_MOVE; // default -- recommended action is move else dropEffect = DROPEFFECT_SCROLL|DROPEFFECT_MOVE; return dropEffect; }
// Update this later. For now, bail out (via the base class) DROPEFFECT SECEditCtrlOleDropTarget::OnDragScroll(CWnd* pWnd, DWORD dwKeyState, CPoint point) { //return COleDropTarget::OnDragScroll(pWnd, dwKeyState, point); ASSERT_VALID(this); ASSERT_VALID(pWnd); if (!pWnd->IsKindOf(RUNTIME_CLASS(SECEditCtrl))) return DROPEFFECT_NONE; SECEditCtrl* pSECEditCtrl = (SECEditCtrl*)pWnd; DROPEFFECT dropEffect = 0; // get client rectangle of destination window CRect rectClient; pWnd->GetClientRect(&rectClient); CRect rect = rectClient; // hit-test against inset region UINT nTimerID = MAKEWORD(-1, -1); rect.InflateRect(-nScrollInset, -nScrollInset); if (rectClient.PtInRect(point) && !rect.PtInRect(point)) { // determine which way to scroll along both X & Y axis if (point.x < rect.left) nTimerID = MAKEWORD(SB_LINEUP, HIBYTE(nTimerID)); else if (point.x >= rect.right) nTimerID = MAKEWORD(SB_LINEDOWN, HIBYTE(nTimerID)); if (point.y < rect.top) nTimerID = MAKEWORD(LOBYTE(nTimerID), SB_LINEUP); else if (point.y >= rect.bottom) nTimerID = MAKEWORD(LOBYTE(nTimerID), SB_LINEDOWN); ASSERT(nTimerID != MAKEWORD(-1, -1)); BOOL bEnableScroll = FALSE; bEnableScroll = pSECEditCtrl->OnScroll(nTimerID, 0, FALSE); if (!bEnableScroll) nTimerID = MAKEWORD(-1, -1); } if (nTimerID == MAKEWORD(-1, -1)) { if (m_nTimerID != MAKEWORD(-1, -1)) { // send fake OnDragEnter when transition from scroll->normal COleDataObject dataObject; dataObject.Attach(m_lpDataObject, FALSE); OnDragEnter(pWnd, &dataObject, dwKeyState, point); m_nTimerID = MAKEWORD(-1, -1); } return DROPEFFECT_NONE; } // save tick count when timer ID changes DWORD dwTick = GetTickCount(); if (nTimerID != m_nTimerID) { m_dwLastTick = dwTick; m_nScrollDelay = nScrollDelay; } // scroll if necessary if (dwTick - m_dwLastTick > m_nScrollDelay) { pSECEditCtrl->OnScroll(nTimerID, 0, TRUE); m_dwLastTick = dwTick; m_nScrollDelay = nScrollInterval; } if (m_nTimerID == MAKEWORD(-1, -1)) { // send fake OnDragLeave when transitioning from normal->scroll OnDragLeave(pWnd); } m_nTimerID = nTimerID; // check for force link if ((dwKeyState & (MK_CONTROL|MK_SHIFT)) == (MK_CONTROL|MK_SHIFT)) dropEffect = DROPEFFECT_SCROLL|DROPEFFECT_LINK; // check for force copy else if ((dwKeyState & MK_CONTROL) == MK_CONTROL) dropEffect = DROPEFFECT_SCROLL|DROPEFFECT_COPY; // check for force move else if ((dwKeyState & MK_ALT) == MK_ALT || (dwKeyState & MK_SHIFT) == MK_SHIFT) dropEffect = DROPEFFECT_SCROLL|DROPEFFECT_MOVE; // default -- recommended action is move else dropEffect = DROPEFFECT_SCROLL|DROPEFFECT_MOVE; return dropEffect; }