Drag & Drop Fragen

Ravebaby

Erfahrenes Mitglied
Ich versteh es einfach nicht. Muss man denn die Zwischenablage nutzen, um Drag & Drop zu realisieren? Was macht dieses DROPEFFECT_COPY? Kopiert es mir die gesamte Datei?! Warum tut es dann bei mir nicht. Ich poste mal den Code, mal schaun, ob einer was mit anfangen kann...
Code:
DROPEFFECT CColumnLevelView::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
	TRACE("OnDragEnter\n");
	CFileExplorerDoc* pDoc = (CFileExplorerDoc*)GetDocument();
	ASSERT_VALID(pDoc);

	if(pDataObject->IsDataAvailable(CF_TEXT))
	{
		return DROPEFFECT_COPY;
	}
	else
	{
		return DROPEFFECT_NONE;
	}

	return CFileExplorerLevelView::OnDragEnter(pDataObject, dwKeyState, point);
}

Code:
DROPEFFECT CColumnLevelView::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
	TRACE("OnDragOver\n");
	CFileExplorerDoc* pDoc = (CFileExplorerDoc*)GetDocument();
	ASSERT_VALID(pDoc);

	if(pDataObject->IsDataAvailable(CF_TEXT))
	{
		return DROPEFFECT_COPY;
	}
	else
	{
		return DROPEFFECT_NONE;
	}

	return CFileExplorerLevelView::OnDragOver(pDataObject, dwKeyState, point);
}

Code:
void CColumnLevelView::OnInitialUpdate()
{
	m_dropTarget.Register(this);
}

Code:
CString CColumnLevelView::ConvertAndStoreData(CString text)
{
	CString path;
	int nPos;

	nPos = text.Find('\n');
	if(nPos > -1)
	{
		path = text.Left(nPos);
	}
	return path;
}

Code:
bool CColumnLevelView::ExtractData(COleDataObject *pDataObject, CString &text)
{
	if(pDataObject->IsDataAvailable(CF_TEXT))
	{
		HGLOBAL hPath;
		hPath = pDataObject->GetGlobalData(CF_TEXT);
		
		if(hPath)
		{
			text = (LPTSTR)::GlobalLock(hPath);
			GlobalUnlock(hPath);
			GlobalFree(hPath);
			return true;
		}
	}
	return false;
}

Code:
BOOL CColumnLevelView::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point){

	CString text;

	CFileExplorerDoc* pDoc = (CFileExplorerDoc*)GetDocument();
	ASSERT_VALID(pDoc);

	if(ExtractData (pDataObject, text))
	{
		CString filepath;
		filepath = ConvertAndStoreData(text);

		Invalidate();
		return true;
	}
	return false;
}

Code:
COleDataSource* CColumnLevelView::PutData()
{
	HGLOBAL hPath;

	COleDataSource* pDataSource = new COleDataSource();

	// alloc memory to exchange via clipboard
	hPath = ::GlobalAlloc(GMEM_SHARE, 256);
	LPTSTR pPath = (LPTSTR)::GlobalLock(hPath);
	ASSERT(pPath);

	CString filepath = m_filepath;

	sprintf(pPath,
		"%s\r\n",
		filepath);
	::GlobalUnlock(hPath);
	
	pDataSource->CacheGlobalData(CF_TEXT, hPath);

	return pDataSource;
}

Code:
void CColumnLevelView::OnLButtonDown(UINT nFlags, CPoint point)
{
	COleDataSource *pDataSource = PutData();
	pDataSource->SetClipboard();
	CFileExplorerDoc *pDoc = (CFileExplorerDoc*)GetDocument();
	ASSERT_VALID(pDoc);

	pDataSource->DoDragDrop(DROPEFFECT_COPY);

	delete pDataSource;

	CView::OnLButtonDown(nFlags, point);
}

und natürlcih hab ich auch in der MESSAGE_MAP folgendes getan:
Code:
//{{AFX_MSG_MAP(CColumnLevelView)
	ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
//}}AFX_MSG_MAP

Und die OnEditPaste, OnUpdateEditPaste, OnEditCopy, OnUpdateEditCopy deklariert...

Vielen Dank für jede Hilfe, die mich ein Schritt in die richtige Richtung bringt...
Grüße Rave
 
Zuletzt bearbeitet:
Hat sich wohl erstmal erledigt. Hab gesehen, dass mir auch die SHFileOperation() genügt. Werde es nun so versuchen.
 
Zurück