Drag and Drop in Autoscrolling control: drag image smearing

I wanted to implement drag and drop and autoscrolling (when the cursor is
over a hot zone near the top or the bottom edge) in a TCustomListBox
descendant (a Raize Components TRzCheckList descendant, to be more accurate).

Thanks to a post in this NG from Jim Wowchuk, I could do most of the work
until I ran into a snag: my ListBox provides a drag image, and this image
seems to be considered part of the canvas so when the list is scrolled, a
'ghost' of the cursor and the drag image gets smeared over the ListBox (note:
in Jim's solution, the hot zones are outside the control; in mine, they are

Co-workers here tried this in a TreeView (which can also provides a drag
image) and had the same problem.  After much trial and error, here is the

  VDragImages: TImageList;


{ Put this where you would scroll the control ( ListBox, TreeView, etc. ) }
VDragImages := nil;
VDragImages := {The source of the drag}.GetDragImages;
if Assigned( VDragImages ) then VDragImages.HideDragImage;
  {your TControl}.Perform( WM_VSCROLL, SB_LINEUP, 0 );
  { or {your TControl}.Perform( WM_VSCROLL, SB_LINEDOWN, 0 ) }
  { or any appropriate way to scroll the control, }
  { such as TListBox.TopIndex }
  if Assigned( VDragImages ) then VDragImages.ShowDragImage;


If you want more details, you can reach me at
Sebastien_Chouin...@abcdef.baan.com.  Be sure to remove the 'abcdef.' part
from the address before sending.


    Sebastien Chouinard
    Software Engineer
    Baan Supply Chain Solutions

-----== Posted via Deja News, The Leader in Internet Discussion ==-----
http://www.dejanews.com/   Now offering spam-free web-based newsreading