I simplified and fixed some code in the XS part of DragDrop.
The second argument to the DropFiles event is now a proper
Win32::GUI::DragDrop object with the HDROP handle as -handle.
Unicode filenames not yet supported.
And I wonder if we should not support a higher level interface, by filling
the needed properties of this object on creation, with the files
and the mousepoint automatically.
Then none of the 4 DragDrop functions would be needed and the
event would be much simplier to use.
Now:
sub Main_DropFiles {
my $win = shift; # dropped on which window
my @files;
if (ref $_[0] eq 'Win32::GUI::DragDrop') { # GUI 1.04
#my $pos = $_[0]->DragQueryPoint();
#my $l = $_[0]->DragQueryFile(0xFFFFFFFF);
#my $f0 = $_[0]->DragQueryFile(0);
@files = $_[0]->DragQueryFiles();
# and from here on the HDROP ressource behind the $_[0] object is destroyed.
} else {
@files = Win32::GUI::DragDrop::GetDroppedFiles(shift); # Loft
}
return 0 unless @files;
.. do something with the files
}
Then:
sub Main_DropFiles {
my $win = shift; # dropped on which window
my @files;
if (ref $_[0] eq 'Win32::GUI::DragDrop') { # GUI 1.04
@files = $_[0]->DragFiles;
$pos = $_[0]->DragPos; # pos stored in the perl object
} else {
@files = Win32::GUI::DragDrop::GetDroppedFiles(shift); # Loft
}
return 0 unless @files;
.. do something with the files
}
Now I will finish all the needed support functions for CustomDraw and
make a simplier example without Win32::API.
2006/3/8, Reini Urban <[EMAIL PROTECTED]>:
> Hi
> I just finished adding DragDrop to Win32::GUI.
>
> I didn't like the Loft methods and it's Win32::API dependency,
> so it's a good GUI.xs and Window.xs integration with the "DropFiles"
> NEM and OEM events supported.
> Attached is the generated pod and patch.
>
> A Window can use the -dropfiles => 0|1 option to accept dropping files,
> or the DragAcceptFiles() method.
> The event can be registered via <name>_DropFiles or via -onDropFiles.
> Sample:
> sub Main_DropFiles {
> # check if called as method or function
> if ($_[0] =~ /Win32::GUI::(Window|DialogBox)/) {
> shift;
> }
> # now the DragDrop handle should be on the stack. (not an object yet though)
> my $files = Win32::GUI::DragDrop::DragQueryFiles(shift);
> return 0 unless @$files;
> ...
> }
>
> Some notes:
> The DragDrop handle passed to the event is no object yet.
> So only the function call is supported yet, not as method.
>
> sub win_DropFiles { $files = $_[0]->DragQueryFiles(); } # invalid!
> I didn't care to stash the handle in XS yet. It's just a long.
--
Reini Urban
http://phpwiki.org/
http://spacemovie.mur.at/ http://helsinki.at/