Drag & Drop ListView

C++ und WTL

Handler LVN_BEGINRDRAG: Dragging flag setzen, drag image erzeugen, SetCapture() aufrufen, um WM_MOUSEMOVE zu empfangen.

Handler WM_MOUSEMOVE: Dragging flag prüfen, drag image verschieben.

Handler WM_LBUTTONUP: Dragging flag prüfen, dragging flag zurücksetzen, drag image löschen, dragging beenden, Aktion (Item verschieben oder ähnliches) ausführen.

class MyView : public ...
{
	BEGIN_MSG_MAP_EX(MyView)
		...
		NOTIFY_HANDLER_EX(IDC_LIST,  LVN_BEGINRDRAG, OnDrag)
		MSG_WM_MOUSEMOVE(OnMouseMove)
		MSG_WM_LBUTTONUP(OnLButtonUp)
	END_MSG_MAP()

	bool m_dragging;
	int drag_item, drop_item;
	CImageList *m_dragImage;
	CListViewCtrl m_list;

	LRESULT OnDrag(NMHDR* phdr)
	{	
		m_dragging = true;

		NMLISTVIEW * ptv = reinterpret_cast<NMLISTVIEW*>(phdr);

		drag_item = ptv->iItem;
		drop_item = -1; 
		POINT pt = {0};
		m_dragImage = &m_list.CreateDragImage(drag, &pt);
		m_dragImage->BeginDrag(0,0,0);

		::ClientToScreen(m_ctrPositions.m_hWnd, &pt);
		m_dragImage->DragEnter(NULL,pt);

		SetCapture();
		return 0;
	}
	void OnMouseMove(UINT nFlags, CPoint point)
	{
		if (m_dragging){
			POINT pt = point;
			ClientToScreen(&pt);
			CImageList::DragMove(pt);
		}
	}
	void OnLButtonUp(UINT nFlags, CPoint point)
	{
		if (m_dragging){
			m_dragging = false;
			CImageList::DragLeave(*this);
			CImageList::EndDrag();
			ReleaseCapture();
			// move the dragged item
		}
	}	
};

Diskussion

Sende ein Kommentar, Frage, Korrekturen, Beschimpfungen...

Name:

Nachricht:


doxapp c++
Zur Übersicht
home