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 } } };
Sende ein Kommentar, Frage, Korrekturen, Beschimpfungen...
doxapp c++ Zur Übersicht home