Hi,
I'm new to Win32 GUI and I've been trying to set up a
TreeView control with drag and drop capability.  I'd
just like 

to be able to drag one node onto another within the
program (I don't need to drag in any outside data). 
I've been 

searching and reading the posts in this list for help
but I haven't been able to get the TreeView to work
with drag 

and drop.  Here are my three main issues:

1.  I can't get the expand/collapse events to work
when I have mouse down and mouse up events for the
same TreeView. 

 What I mean is that when I create subroutines for
mouse up/down/move, my expand/collapse code will not
execute.  

When I comment out the -onMouseUp/Down/Move in the
TreeView initiation, the expand/collapse subroutines
run.

2.  When clicking on the +/- box to expand a node, the
script thinks I'm starting a drag in addition to
expanding 

the node.  Doing this corrupts the display by
partially highlighting items and creating ghost images
of the drag 

icon.  (From reading the posts and through my own
testing, it seems that clicking the +/- symbol
initiates both the 

collapse/expand event as well as the click/mouse down
event.)

3.  I'm not really sure how to drop the node on the
target.

If anyone has any ideas/thoughts, I'd greatly
appreciate them.  I'm currently using Perl 5.6.1.626
and Win32-GUI 

1.03.  The test code that I'm using is listed below.

Thanks!

#!perl -w

use Win32::GUI;

# Build the window
$winMain = new GUI::Window(
   -name    => "winMain",
   -title   => "My TreeView Test",
   -height  => 480, 
   -width   => 640,
   -left    => 100, 
   -top     => 100,
);

# Build the ImageList
$icoFolderClosed = new
GUI::Icon("tree-folder-closed.ico");
$icoFolderOpened = new
GUI::Icon("tree-folder-opened.ico");
$imlTreeView = new Win32::GUI::ImageList(16, 16, 1 |
0x0010, 2, 2);
$imlTreeView->AddIcon($icoFolderClosed);
$imlTreeView->AddIcon($icoFolderOpened);

# Build the TreeView control
$trvMain = $winMain->AddTreeView(
   -name             => "trvMain",
   -width            => 200,
   -height           => $winMain->ScaleHeight,
   -left             => 0, 
   -top              => 0,
   -lines            => 1, 
   -rootlines        => 1,
   -buttons          => 1,
   -visible          => 1,
   -imagelist        => $imlTreeView,
   #-disabledragdrop  => 0,
   -onMouseDown      => \&mouseDown,
   -onMouseMove      => \&mouseMove,
   -onMouseUp        => \&mouseUp,
);

# Add several nodes to the tree
$nodeRoot = $trvMain->InsertItem(
   -text    => "Root",
   -image   => 0,
);
$nodeSub1 = $trvMain->InsertItem(
   -parent  => $nodeRoot,
   -text    => "Sub 1",
   -image   => 0,
);
$nodeSub2 = $trvMain->InsertItem(
   -parent  => $nodeRoot,
   -text    => "Sub 2",
   -image   => 0,
);
$nodeSub3 = $trvMain->InsertItem(
   -parent  => $nodeRoot,
   -text    => "Sub 3",
   -image   => 0,
);

# Show the main window
$winMain->Show();
# Enter event mode
Win32::GUI::Dialog();

# Subs

sub trvMain_Expand {
   my $node = $_[0];
   # Change the folder image to opened
   $trvMain->SetItem($node, -image => 1);
}

sub trvMain_Collapse {
   my $node = $_[0];
   # Change the folder image to closed
   $trvMain->SetItem($node, -image => 0);
}

sub mouseDown {
   # Get incoming variables
   my($object, $x, $y) = @_;
   # Set variable to indicate we are dragging
   $dragMode = 1;
   # Get the node that was clicked for dragging
   $draggedNode = $object->HitTest($x, $y);
   $object->SelectItem($draggedNode);
   # Create the drag image
   my $imlDrag =
$object->CreateDragImage($draggedNode);
   # Begin drag
   Win32::GUI::ImageList::BeginDrag($imlDrag, 0, 0,
0);
   # Enter the drag
   Win32::GUI::ImageList::DragEnter($object, $x, $y);
   return 1;
}

sub mouseMove {
   # Get incoming variables
   my($object, $x, $y) = @_;
   # Don't do anything unless the left mouse button is
down
   return unless $dragMode;
   # Move the drag image
   Win32::GUI::ImageList::DragMove($x, $y);
   # Highlight the nearest target node
   $targetNode = $object->HitTest($x, $y);
   $object->SelectDropTarget($targetNode);
   return 1;
}

sub mouseUp {
   # Get incoming variables
   my($object, $x, $y) = @_;
   # Don't do anything unless the left mouse button is
down
   return unless $dragMode;
   # Set variable to indicate end of dragging
   $dragMode = 0;
   # Leave and end the drag operation
   Win32::GUI::ImageList::DragLeave($object);
   # Move the node
   # ?????????
   Win32::GUI::ImageList::EndDrag();
   return 1;
}

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

Reply via email to