Hi All,

Have been working with Jez to implement the methods and properties to
allow drag n drop for the listview control in icon mode.

I can't find any examples of how the code is implemented (except a few
VB examples). Attached is an Win32::GUI example of where I am up to so
far.

Note: to run the example, you will need to check-out the latest
Win32::GUI source code from Sourceforge and recompile v1.0 as we have
added a couple of bits to the code base. Sorry no PPM yet.

Once recompiled the example should run as is, i.e. all the icons and
images, etc are embedded using BitMapInline

The example shows a number of functions including the right-click
event... try it over both an icon and over the white canvas surface of
the listview control.

There are a number of problems at the moment:

1. There seems to be a problem with the Win32::GUI::ImageList::DragEnter
($lvwChart,$xE, $yE); function, as it does not appear to impact the
start point of the dragged image, with whatever values of X and Y that
you pass in.

2. Single icon drags work fine, however the mechanics of multiple items
being dragged creates problems with the X Y drop points. To see this,
select two or three items, dragndrop them somewhere else, repeat 2 or 3
times and the spread effect increases each time.

Still its a start. Feel free to pull it apart and correct anything that
I've got completely wrong...

Chris Wearn

Code below

 # ============================

> # Listview Large Icon example
> # ============================
> 
> use Win32::GUI;
> use Win32::GUI::BitmapInline ();
> 
> $DEBUG        = 1;
> 
> my $drag=0;
> 
> &load_images(); # BitmapInline Images
> 
> #====================================
> # GUI CONTROL CONSTRUCTS
> #====================================
> 
> $imlChart = new Win32::GUI::ImageList(32,32,1|0x0018,2,10);
> $imlChart->Add($bmpMobile,$bmpMobileMask);
> $imlChart->Add($bmpPhone,$bmpPhoneMask);
> $imlChart->Add($curDrag,0);
> 
> 
> $mnuChartLvwPopupMenu1 = new Win32::GUI::Menu(
> #====================================
>       "lvwpopupmenu1"                 => "lvwpopupmenu1",
>       "> Select All"                  => "mnuPopupSelectAll",
>       "> Deselect All"                => "mnuPopupDeselectAll",
>       " > Help        F1"                     => "mnuPopupHelp",
>       " > -"                          => 0,
>       " > Close"                      => "mnuPopupClose",
> );
> 
> $mnuChartLvwPopupMenu2 = new Win32::GUI::Menu(
> #====================================
>       "lvwpopupmenu2"                 => "lvwpopupmenu2",
>       "> Edit Label"                  => "mnuPopupEditLabel",
>       "> Change Icon"                 => "mnuPopupChangeIcon",
>       " > Help        F1"                     => "mnuPopupHelp",
>       " > -"                          => 0,
>       " > Close"                      => "mnuPopupClose",
> );
> 
> $winMain = new Win32::GUI::Window(
> #====================================
>       -name   => "winMain",
>       -title          => "Listview Control",
>       -pos            => [100,100],
>       -size           => [500,500],
>       -dialogui       => 1,
> );
> 
> $lvwChart = $winMain->AddListView(
> #====================================
>       -name           => "lvwChart",
>       -parent         =>  $winMain,
>       -text                   => " ",
>       -left                   => 5,
>       -top                    => 30,
>       -width          => 480,
>       -height         => 420,
>       -autovscroll    => 1,
>       -autohscroll    => 1,
>       -hottrack               => 1,
>       -editlabel              => 1,
>       -visible                => 1,
>       -nocolumnheader => 1,
>       -imagelist              => $imlChart,
> );
> $lvwChart->View(0); # Set View to LargeIcon
> $lvwChart->SetHoverTime(3600);
> #$lvwChart->SetHotCursor($curDrop);
> 
> # View Properties
> # 0 - lvwIcon
> # 1 - lvwSmallIcon
> # 2 - lvwList
> # 3 - lvwReport
> 
> $lvwChart->InsertItem(
> #=========  ITEM 1  =================
>       -image  => 0,
>       -text           => [ "Mobile 1" ]
> );
> $lvwChart->ItemPosition(0,100,200);
> 
> $lvwChart->InsertItem(
> #=========  ITEM 2  =================
>       -image  => 0,
>       -text           => [ "Mobile 2" ]
> );
> $lvwChart->ItemPosition(1,100,100);
> 
> $lvwChart->InsertItem(
> #=========  ITEM 3  =================
>       -image  => 0,
>       -text           => [ "Mobile 3" ]
> );
> $lvwChart->ItemPosition(2,150,120);
> 
> #====================================
> # MAIN
> #====================================
> 
> $winMain->Show();
> $winMain->Enable();
> Win32::GUI::Dialog();
> 
> sub winMain_Terminate {
>       return -1;
> }
> 
> #====================================
> # EVENTS
> #====================================
> 
> sub lvwChart_BeginDrag {
> #====================================
>       my ($selCount, $item, $x, $y, $xA, $yA, $xC, $yC, $xN, $yN, $xO, $yO,  
> $Dx, $Dy, $x1, $y1) = 0;
>       
>       # These variables have to have global scope, to make them available to 
> other sub-routines.
>       ($index, $xH, $yH, $hDragImageList) = 0;
>       
>       # Ensure array is initialised as empty.
>       $#selItems = -1;
>       
>       # The array @selItems contains a numerical list of all the selected 
> items.
>       # This could be a single icon or many, if a marque was dragged over 
> several items. 
>       # 'SelectedItems' always loads the array numerically (i.e. items 3, 4, 
> 5, 8, 10),
>       # however we may not have actually clicked on the first item (item 3), 
> and may have
>       # clicked on item 8 which is at the bottom right and want to drag from 
> that one.
>       # Hence the HitTest (in start of foreach loop) to determine which item 
> you want
>       # to start the drag from or creation of the 'Entry' point( DragEnter ).
>       
>       # How many items have been selected
>       $selCount = $lvwChart->GetSelectedCount();
>       print "There are $selCount items selected.\n" if $DEBUG;
>       
>       # Load the selected items into array
>       @selItems = $lvwChart->SelectedItems();
>       print "Item Array contains these index's: @selItems\n\n" if $DEBUG;
>       
>       # Set the cursor type
>       Win32::GUI::SetCursor($curDrag);
>       
>       # Where is cursor on client window referenced to screen x y coordinates
>       ($x, $y) = Win32::GUI::GetCursorPos();
>       print "1a. Screen Cursor at: \t\t  x=$x   y=$y\n" if $DEBUG;
> 
>       # (C)onvert to Client window coordinates
>       ($xC, $yC) = Win32::GUI::ScreenToClient($lvwChart, $x, $y);
>       print "1b. Client Cursor at: \t\t  x=$xC   y=$yC\n" if $DEBUG;
> 
>       # What item is under the cursor at that location
>       ($item) = $lvwChart->HitTest($xC, $yC);
>       print "1c. Item under cursor: $item\n" if $DEBUG;
> 
>       # What are the (A)ctual the x y coordinates of this item (we may have 
> clicked it's right hand edge)
>       ($xA, $yA) = $lvwChart->GetItemPosition($item);
>       print "1d. Entry Items actual location:  x=$xA   y=$yA\n" if $DEBUG;
>       
>       # Calculate the (H)otspot for the item clicked on. This point is the 
> difference
>       # between the actual x y  of the item and the point where the cursor is 
> positioned 
>       # over the item
>       $xH = ($xC - $xA);
>       $yH = ($yC - $yA);
>       print "1e. Reference Hot spot: \t  x=$xH \t  y=$yH\n\n" if $DEBUG;
>       
>       # Empty temporary values
>       ($item, $x, $y, $xC, $yC) = 0;
>       
>       my $blnFirst = 1;
>       
>       foreach $index (@selItems) {
>               # First item is our reference from where the temporary drag 
> image starts getting
>               # created from, so we have to process this item first, then 
> reference all the others 
>               # from it (if dragging multiple items).
>               if ($blnFirst) {
>                       # Determine the position of the reference item.
>                       my ($x, $y) = $lvwChart->GetItemPosition($index);
>                       print "2a. Reference Item: $index at \t x=$x \t y=$y\n" 
> if $DEBUG;
>                       
>                       # Create a temporary drag image of this item. A handle 
> ($hDragImageList) is 
>                       # returned by this process, from which to reference our 
> drag image.
>                       $hDragImageList = 
> Win32::GUI::ListView::CreateDragImage($lvwChart, $index, $x, $y);
>                       
>                       # Store these points to calculate the (O)ffset for the 
> next item.
>                       $xO = $x;
>                       $yO = $y;
>                       
>                       # Store these points as the (E)ntry point for the drag.
>                       $xE = ($x - $xA);
>                       $yE = ($y - $yA);
>                       print "2b. Entry point for Drag: \t  x=$xE \t  y=$yE\n" 
> if $DEBUG;
>                       
>                       # Empty temporary values
>                       ($blnFirst, $x, $y, $xA, $yA) = 0;
>               }
>               else {
>                       # Determine the position of the next nItem(s).
>                       my ($xN, $yN) = $lvwChart->GetItemPosition($index);
>                       print "3a. Current Item: $index  at \t x=$xN \t 
> y=$yN\n" if $DEBUG;
>                       
>                       # Create a temporary drag image of this item
>                       my $hOneImageList = 
> Win32::GUI::ListView::CreateDragImage($lvwChart, $index, $xN, $yN);
>                       
>                       # Determine the offset from the previous item.
>                       $Dx = ($xN - $xO);
>                       $Dy = ($yN - $yO);
>                       print "3b. The Delta offset is \t Dx=$Dx \t Dy=$Dy\n";
>                       
>                       # Update the offset with this items x y coordinates, for
>                       # the reference of the next item in this loop
>                       $xO = $xN;
>                       $yO = $yN;
>                       
>                       # Merge this temporary drag image with the previous to 
> make a composite
>                       my $hTempImageList = 
> Win32::GUI::ImageList::Merge($hDragImageList, 0, 0, $Dx, $Dy, $hOneImageList);
>                       
>                       # Destroy both the Initial drag image and the 
> intermediate
>                       Win32::GUI::ImageList::Destroy($hDragImageList);
>                       Win32::GUI::ImageList::Destroy($hOneImageList);
>                       
>                       # Update the Initial drag image with our new composite 
> one
>                       $hDragImageList = $hTempImageList;
>                       
>                       # Empty temporary values
>                       ($Dx, $Dy, $xN, $yN) = 0;
>               }
>       
>       }
>       
>       # Call this function to begin dragging an image.
>       # Pass-in nImage ptHotspot
>       # nImage        = the zero-based index of the image (from imagelist)
>       # ptHotspot     = coordinates are relative to the upper left corner of 
> the image
>       Win32::GUI::ImageList::BeginDrag($hDragImageList, 0,$xH,$yH);
>       
>       
>       # Call this function to lock the window from updates and
>       # display the file drag image at the positon specified by the point
>       # Pass-in pWndLock point
>       # pWndLock      = the windows handle
>       # point = the x y coords of the item you wish to commence the drag from.
>       Win32::GUI::ImageList::DragEnter($lvwChart,$xE, $yE);
>       print "5.  DragEnter \t\t\t  x=$xE   y=$yE\n" if $DEBUG;
>       
>       $drag=1;
>       
>       print "\t==== NOW Dragging ====\n\n";
>       
>       # Start the mouse capture on the control widget
>       Win32::GUI::SetCapture($lvwChart);
>               
>       return 1;
> }
> 
> sub lvwChart_MouseMove {
> #====================================
>       my ($x,$y) = @_;
>       
>       if ($drag) {
>               # as mouse moves, constant x y coords (referenced to
>               # your client widget (ListView Ctrl). Attaches drag
>               # image to the x y point.
>               Win32::GUI::ImageList::DragMove($x,$y);
>       }
>       return 1;
> }
> 
> sub lvwChart_MouseUp {
> #====================================
>       if ($drag) {
>       
>               my ($index, $x, $y, $x1, $y1, $xC, $yC, $xN, $yN, $xO, $yO) = 0;
>       
>               # End the drag and drop process
>               $drag=0;
>               
>               # Call this function to unlock the window, hide the drag image
>               # and allow the window to be updated
>               Win32::GUI::ImageList::DragLeave($lvwChart);
>               
>               # Call this function to end the drag operation
>               Win32::GUI::ImageList::EndDrag();
>               
>               # Destroy Drag Imagelist;
>               Win32::GUI::ImageList::Destroy($hDragImageList);
>               
>               # Stop capturing the mouse movement
>               Win32::GUI::ReleaseCapture($lvwChart);
>               
>               my $blnFirst = 1;
>               
>               foreach $index (@selItems) {
>                       if ($blnFirst) {
>                               # What was the First(1) items position before 
> the drag.
>                               my ($x1, $y1) = 
> $lvwChart->GetItemPosition($index);
>                               print "N3. First Items original pos. \t x=$x1 
> y=$y1\n";
>                               
>                               # Where is it now.
>                               my ($x, $y) = Win32::GUI::GetCursorPos();
>                               print "1a. GetCursorPos\t\t x=$x \t y=$y\n" if 
> $DEBUG;
>                               
>                               # (C)onvert to clients coordinates.
>                               ($xC, $yC) = 
> Win32::GUI::ScreenToClient($lvwChart, $x, $y);
>                               print "1b. ScreenToClient\t\t x=$xC \t 
> y=$yC\nn" if $DEBUG;
>                               
>                               # Calculate the (O)ffset from original to drop 
> position.
>                               # All other items will have moved this same 
> offset.
>                               $xO = ($xC - $x1 );
>                               $yO = ($yC - $y1 );
>                               
>                               # Resposition the first item at the x y coords 
> (minus the (H)otspot cursor
>                               # offset on the image itself).
>                               $xC = ($xC - $xH);
>                               $yC = ($yC - $yH);
>                               $lvwChart->ItemPosition($index, $xC, $yC);
>                               
>                               ($blnFirst, $x, $y, $xC, $yC, $x1, $y1) = 0;
>                       }
>                       else {
>                               # What was the nItem position before the drag 
>                               my ($xN, $yN) = 
> $lvwChart->GetItemPosition($index);
>                               print "N3. Current Item $index pos. \t x=$xN 
> y=$yN\n";
>                               
>                               # Apply drag offset to this items coordinates.
>                               my $x = ($xO - $xN);
>                               my $y = ($yO - $yN);
>                               
>                               # Offset for Cursor Hotspot
>                               $x = ($x - $xH);
>                               $y = ($y - $yH);
>                               
>                               # Resposition the item at the x y coords.
>                               $lvwChart->ItemPosition($index, $x, $y);
>                               
>                               ($x, $y, $xN, $yN) = 0;
>                       }
>               }
>       }
>       
>       return 1;
> }
> 
> # Respond to the right click event
> #====================================
> sub lvwChart_RightClick {
>       my $index = "";
>       my ($x, $y, $xC, $yC) = 0;
>       
>       ($x, $y) = Win32::GUI::GetCursorPos();
>       ($xC, $yC) = Win32::GUI::ScreenToClient($lvwChart, $x, $y);
>     
>       $index = Win32::GUI::ListView::HitTest($lvwChart, $xC, $yC);
>       print "Got RIGHT click on Item $index at $xC $yC\n" if $DEBUG;
>       
>       if ($index == -1) {
>               # Provide general menu for changing properties of ListView
>               
> $winMain->TrackPopupMenu($mnuChartLvwPopupMenu1->{lvwpopupmenu1}, $x, $y);
>       }
>       else {
>               # Popup menu at the cursor for the item cursor is above
>               
> $winMain->TrackPopupMenu($mnuChartLvwPopupMenu2->{lvwpopupmenu2}, $x, $y);
>       }
>       
>       return 1;
> }
> 
> sub mnuPopupChangeIcon_Click {
> #====================================
>       my $index               = "";
>       my $itemImage   = "";
>       my %item                = ();
>       my ($x, $y, $xC, $yC) = 0;
> 
>       ($x, $y) = Win32::GUI::GetCursorPos();
>       ($xC, $yC) = Win32::GUI::ScreenToClient($lvwChart, $x, $y);
>     
>       $index = Win32::GUI::ListView::HitTest($lvwChart, $xC, $yC);
>       
>       # Retrieve the Label for item selected
>       %item = $lvwChart->ItemInfo($index);
>       $itemImage = $item{-image};
>       
>       print "Got Popup Menu CHANGE ICON command for Item $index, Current 
> Image: $itemImage\n" if $DEBUG;
>       
>       if ($itemImage == 0) {
>               $lvwChart->ChangeItem(
>                               -item           => $index,
>                               -image  => 1
>                       );
>       }
>       elsif ($itemImage == 1) {
>               $lvwChart->ChangeItem(
>                               -item           => $index,
>                               -image  => 0
>                       );
>       }
>       $lvwChart->Update($index);
>       $lvwChart->Deselect($index);
>       
>       return 1;
> }
> 
> sub mnuPopupEditLabel_Click {
> #====================================
>       my $index = "";
>       my ($x, $y, $xC, $yC) = 0;
>       
>       ($x, $y) = Win32::GUI::GetCursorPos();
>       ($xC, $yC) = Win32::GUI::ScreenToClient($lvwChart, $x, $y);
>     
>       $index = Win32::GUI::ListView::HitTest($lvwChart, $xC, $yC);
>       print "Got Popup Menu EDIT LABEL command for Item $index\n" if $DEBUG;
>       
>       $lvwChart->EditLabel($index);
> }
> 
> sub lvwChart_BeginLabelEdit {
> #====================================
>       return 1;
> }
> 
> sub lvwChart_EndLabelEdit {
> #====================================
>       my($index,$text) = @_;
>       
>       $lvwChart->SetItemText($index,$text);
>       
>       return 1;
> }
> 
> sub mnuPopupSelectAll_Click {
> #====================================
>       $lvwChart->SelectAll();
> }
> 
> sub mnuPopupDeselectAll_Click {
> #====================================
>       $lvwChart->DeselectAll();
> }
> 
> sub mnuPopupClose_Click {
> #====================================
>       &winMain_Terminate();
> }
> 
> sub load_images {
> #====================================
> $bmpMobile = new Win32::GUI::BitmapInline( q(
> Qk02DAAAAAAAADYAAAAoAAAAIAAAACAAAAABABgAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAwMDExMTLCwsNzMzGRkZDAwMAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUlJSioqK
> m5ubwqur9NLS0rOzoouLZ1lZIiAgBgYGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh4eHoaGhg4OD7tXV8dPT9NLS99DQ+s7O
> /c3NpomJCQkJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAACQkJiYmJo6OjhYWFvK6uMzMzh3l5lIKC37y8+s7O/c3NExMTAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMi4uL
> pqamh4eHxbm5cXFxamRkVFRUY1tbMzMz1bGxGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMpKSkqampioqKw7q6YFxcj4WFfnZ2
> saCgZGBgx6ioGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAADAwMrq6urKysi4uLwLy8aGhoaWVlTExMbWZmV1FR0LS0GRkZAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwM
> sbGxrq6ujo6Ovr29SUhIjIaGWlhYraKiTU1NwqurGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMtLS0sbGxkJCQu7u7c3NzX11d
> Q0NDd3FxVlJSy7a2GRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAADAwMtra2tLS0kpKStbW1aGhokZCQf35+qqSkTU1Nva2tGRkZAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> FhYWurq6tra2sLCwsbGxXl5eXl5ePj4+gHx8a2dnxri4GRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRkZvLy8urq6ubm5s7OzeHh4
> goKCXFxcdXV1TU1NubCwGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0v7+/vLy8ubm5eIt+NnlMX4Vrc3x2fX19fn19trGxGRkZ
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAPj4+wcHBv7+/urq6c5l/O9RuOtNtS+R+U+ODVsh8aIRwGRkZAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj4+xMTEwcHBurq6cZd8
> RN13OtNtPtdxS+R+Vu+JaI91GRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/x8fHxMTEurq6cLyFTueBP9hyNc5oPtdxS+R+ZIpx
> GRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAQEBAysrKx8fHu7u7bbqAVu+JS+R+MstjNc5oPtdxX4VsGRkZAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAzMzMysrKu7u7
> abZ6YPmTVu+JQttxMMlgNc5oWoFnGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUFBz8/PzMzMu7u7cbB5c/+gYPmTVu+JLcZWMMlg
> V31jGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAQkJC0tLSz8/Pu7u7bpxvUM9gTuNzTeZ4Nc5dKMFQXIJnGRkZAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQkJC1NTU0tLS
> u7u7hYWFampqZmZmdXV1V31eUXhamaKbGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ0ND2NjY1NTUu7u7enp6eHh4ZmZmhoaGenp6
> cXFxmpqaGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAREREsbGxhYWFvLy8dHR0fHx8g4ODi4uLkpKSmpqaoqKiGRkZAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOTk53Nzc
> 2tratra2bW1tdHR0fHx8g4ODi4uLkpKSh4eHFhYWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWdnZ2WVlZPT09QEBASkpKVFRUWFhY
> XFxcYGBgUVFRCQkJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAwMDMjIyPT09IBMTbT4+GRkZExMTFhYWDAwMDAwMAwMDAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> GRkZOjo6IBMTczk5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcUlJSPjU1c0hIAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAJiYmhoaGe3h4YlxcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAHBwcUlJSPjU1QyoqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgYEAkJFgsLAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> ) );
> 
> $bmpMobileMask = new Win32::GUI::BitmapInline( q(
> Qk2+AAAAAAAAAD4AAAAoAAAAIAAAACAAAAABAAEAAAAAAIAAAAAjCwAAIwsAAAIAAAACAAAAAAAA
> AP///wD//////+A////gB///4AP//8AD///AA///wAP//8AD///AA///wAP//8AD///AA///wAP/
> /8AD///AA///wAP//8AD///AA///wAP//8AD///AA///wAP//8AD///AA///wAP//8AD///AB///
> 4f///+H////h////4f////H//w==
> ) );
> 
> $bmpPhone = new Win32::GUI::BitmapInline( q(
> Qk02DAAAAAAAADYAAAAoAAAAIAAAACAAAAABABgAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAA////
> ////////////////////////////////////////////////////////////////////////////
> ////////////////////////////////////////////////////////////////////////////
> ////////////////8/Pzy8vLy8vL1tbW+fn5////////////////////////////////////////
> ////////////////////////////////////////////////////////////8/Pzy8vLp6etTU1/
> TU1tYWF0ubm61tbW+fn5////////////////////////////////////////////////////////
> ////////////////////////////8/Pzy8vLrKyxVlaIR0ecCwvVCwuMHBx7Tk5ybGx8vLy91tbW
> +fn5////////////////////////////////////////////////////////////////////8/Pz
> y8vLp6etTU2FOzugAAD/AAD/AADjAACRAACEAACEEBB+RERsYWF0ubm61tbW+fn5////////////
> ////////////////////////////////////////8/Pzy8vLrKyxVlaIR0ecCwvtCAjxAAD/AAD/
> AADjAACRAACEAACEAgKDCQmAHBx7Tk5ybGx8vLy91tbW+fn5////////////////////////////
> ////////8/Pzy8vLp6etTU2FOzugAAD/AAD/AAD/AAD/AAD/DAz8KyvcBgaQAACEAACEAACEAACE
> AACEAACEEBB+RERsYWF0ubm61tbW+fn5////////////////////////y8vLrKyxVlaIR0ecCwvt
> CAjxAAD/AAD/AAD/DAz8ODj1XV3vsLDHGRmNAACEAACEAACEAACEAACEAACEAgKDCQmAHBx7Tk5y
> bGx8vLy91tbW+fn5////////////////Xl5qPj6cAAD/AAD/AAD/AAD/AAD/DAz8ODj1ZGTu///W
> 8vLYmprQFhagAACEAACEAACEAACEAACEAACEAACEAACEAACEBASCJiZ2Wlplb29vurq6y8vL1tbW
> ////////T0+BEhLiAAD/AAD/AAD/DAz8ODj1XV3v4uLa29vbxsbeoKDkFhb4AwPfAACYAACGAACE
> AACEAACEAACEAACEAACEBASCISF4VVVtTk6BTk5/VlZyVlZwbGx81tbW+fn5TU2FCwvtAAD/DAz8
> ODj1ZGTu///W8vLYxsbfmprlAAD/AAD/AAD/AAD/AADpAACjAACEAACEAACEAACEAACEAACEFRV8
> UlJuOzugCAjxAADjAACRAACEEBB+YWF0ubm6TU2FFxfrODj1XV3v4uLa29vbxsbeoKDkHBz6FRX1
> AADdAADVAAD/AAD/AAD7AADgAACYAACGAACEAACEAACEBASCISF4NzeJCAjrAQHkBATMEhKIFRV8
> EhJ9ISF6YGBsTU2FQ0Pk///W8vLYxsbfmprlAAD/AAD4AADdDQ2/ODh/KytiAADpAAD7AAD/AAD/
> AADpAACjAACEAACEAACEFRV8TU1qCwuUAADUAACmEBCTRERwTU1qQEBtJiZ2WlplYWGFR0fNxsbe
> oKDkHBz6FRX1AADdDAzBOTmRVFRxra20lZWjAACdAADMAAD/AAD/AAD7AADgAACYAACGAACEFRV8
> UVFoGRmEAAC7AADpAgLYCQmMCwuAFhZ7SEhqX19k1dXVbGyMEBDkAgL7AAD/DAznODh/V1dbyMjA
> qamvLS2Bi4ubODh/KytiAADpAAD7AAD/AAD/AADpAACjAACEFRV8Xl5kPj6JAAD/AAD/AADjAACR
> AACEAACEFRV8V1dm+fn5xsbHWlqRGxvWAAD/JSX1qanSioq7PT2HhISVPj6DYGBpra20lZWjAACd
> AADMAAD/AAD/AAD7AADgAACYFRV/T09pEhKYAAD/AAD/AADpAACjAACEAACEFRV8V1dm////////
> 1tbWbGyLEBDkAgL7AAD/DAznODh/V1dbyMjAqamvLS2Bi4ubODh/KytiAADpAAD7AAD/AAD/AADp
> FRWcTU1qCwuaAAD/AAD/DAz8MjLhODiWKyuSFRV8V1dm////////+fn5xsbHWlqRGxvWAAD/JSX1
> qanSioq7PT2HhISVPj6DYGBpqam9g4O/AAC+AAD1AAD/AAD4AADgFRW9TU1qCwuaAAD/DAz8UVHx
> nZ3iqanVkJDHQUGKXl5o////////////////1tbWbGyLEBDkAgL7AAD/DAznODh/V1dbxsbJmprN
> AAC0AAD0AAD/BAT3EBDkAgLfAACEFRV8TU1qCwuaAAD/ODj1xsbfHBz6AAD/MDDvv7+nfHx6////
> ////////////7e3toKCjSEiLFxfYAAD/JSX1qanSiorBHBy5FRXvAAD0BAT1FRXcIyPFUFCQLy/N
> AACEFRV8TU1wCwutDAz8UVHxmprlFRX7BAT3LS3Fjo6M09PT////////////8/Pzra2seXl+VFR4
> VlZyEBDkAgL7AAD/AAD/AAD4AADmBATiHx/DTU1qUVFohYV8wcG6MDCQJSV7OzuKFRXsV1fwioro
> AAD/BAT3LCy/gICO////////////////////0dHRhIR8sLC9NjakaWlHNzeQFRXZAAD/AAD/AADm
> AACdExOLPDx5CwuAGRmBbGyRxcWzo6OjT099QECoUlLmioroJSX4BAT3JyfGgICO2dnZ////////
> ////////////y8vLfX12rq6lTU2FOzuEEBB+ODiGEBDkDg74KyvcBgaQFRV8QUFzAACfAACzEBDk
> UFCQdHSBYGCixsbfmprlBAT3ExPgLCy/gICO////////////////////////////y8vLbm5rcXGa
> CwvtCAjbAgKXFRWCNzeQR0fQvLzLQ0OXISF+NTWcAADxDAzxOjrxW1vhsrLSi4vcISHyKCjcKirD
> Y2OJgICO2dnZ////////////////////////////1tbWhYWAqam9Kyv3Bgb9AADpAACjEBB+Y2N/
> 3Ny8vLyvSEieOjrpODj1V1fwxsbfmprlBAT3ExPgLCy/a2t8iIiI6enp////////////////////
> ////////////////+fn5xMTEj4+NoaHMOjrxAAD7DAzeOjqVVFSQlpaJg4OdWVnjnp7jqanjj4/g
> MTHXKyvYKirDY2OJgICO09PT6enp/Pz8////////////////////////////////////////////
> 1tbWhYWAoaG4EBDkLS3zxsbfxsbfxsbfxsbfn5/eKSncFRXcLCy/dHR0dHR0iIiI6enp////////
> ////////////////////////////////////////////////////+fn5xMTEgoKEWlqRJibOMTHX
> MTHXMTHXMTHXPz+/ZmaIa2uBgICO5OTk5OTk6enp/Pz8////////////////////////////////
> ////////////////////////////////////////1tbWfX19dHR0dHR0dHR0dHR0iIiI6enp////
> ////////////////////////////////////////////////////////////////////////////
> ////////////////+fn55ubm5OTk5OTk5OTk5OTk6enp/Pz8////////////////////////////
> ////////////////////////////////////////////////////////////////////////////
> ////////////////////////////////////////////////////////////////////////////
> ////////////////////////////////////////////////////////////////////////////
> ////////////////////////////////////////////////////////////////
> ) );
> 
> $bmpPhoneMask = new Win32::GUI::BitmapInline( q(
> Qk2+AAAAAAAAAD4AAAAoAAAAIAAAACAAAAABAAEAAAAAAIAAAAATCwAAEwsAAAIAAAACAAAAAAAA
> AP///wD///////P////A////AD///AAH//AAA//AAAB/AAAAHwAAAAMAAAABAAAAAAAAAAAAAAAA
> AAAAAAAAAACAAAAAwAAAAOAAAADwAAAA+AAAAPAAAAPgAAAD4AAAD+AAAB/gAAB/8AAA//gAB//8
> AD///wH//////////////////w==
> ) );
> 
> 
> $curDrag = newCursor Win32::GUI::BitmapInline( q(
> AAACAAEAICAAABAACAAwAQAAFgAAACgAAAAgAAAAQAAAAAEAAQAAAAAAAAEAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAA////AAAACqoAABVVAAAIAgAAEAEAAAgCAAAQgQAACMIAABWVAAAJqgAAAwAAAEMA
> AABmAAAAfgAAAH4AAAB/wAAAf4AAAH8AAAB+AAAAfBAAAHgoAABwbAAAYIIAAEBsAAAAKAAAABAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///gAP//4AD//+f8///n/P//53z//+Yc///mHP//
> 4CD//2QA//84f///GH///wD///8A////AA///wAf//8AP///AH///wD///8B7///A8f//weD//8P
> Af//H4P//z/H////7/////////////////////////////////////8=
> ) );
> 
> } # end sub




Reply via email to