c# - Draw horizontal line in ListView to show dropping place -
when in foobar2000 drag-and-drop files playlist, listview shows place of dropping tracks:
i'm looking way implement feature. drawn graphics library, or have implemented method show horizontal line on listview?
at least listview control, there limited built-in support provided way of insertionmark property, works in icon view, small icon view, , tile view. doesn't work when items sorted or when groups turned on, , requires comctrl32.dll version 6 (thus meaning windows xp or later, visual styles enabled).
if want more general solution, can draw line in dragover event:
to avoid flicker remember last index:
int previtem = -1; the event uses hittest determine item under cursor..:
private void listview1_dragover(object sender, drageventargs e) { point mloc = listview1.pointtoclient(cursor.position); var hitt = listview1.hittest(mloc); if (hitt.item == null) return; int idx = hitt.item.index; if (idx == previtem) return; listview2.refresh(); using (graphics g = listview1.creategraphics()) { rectangle rect = listview1.getitemrect(idx); g.drawline(pens.red, rect.left, rect.top, rect.right, rect.top); } previtem = idx; } if want use listbox, code pretty same:
private void listbox1_dragover(object sender, drageventargs e) { point mloc = listbox1.pointtoclient(cursor.position); int idx = listbox1.indexfrompoint(mloc); if (idx < 0) return; if (idx == previtem) return; listbox1.refresh(); using (graphics g = listbox1.creategraphics()) { rectangle rect = listbox1.getitemrectangle(idx); g.drawline(pens.red, rect.left, rect.top, rect.right, rect.top); } previtem = idx; } also refresh clear line in dragleave event , in dragdrop event!
note 1 of rare situations when want use control.creategraphics because drawing meant non-persistent! graphics should drawn e.graphics object in paint event!


Comments
Post a Comment