GUI users,

i'd appreciate it if someone more knowlegable could
please have a look at the following code. i adapted it
from the example that rob sent, but i keep getting a
usage error on the hook line (in open_thumbnails),
which says that it needs to be passed (handle, msg,
codref).  you'll see that i have a commented hook
command that passes the $win object.  when i run that
line, then i get a usage error that says only to pass
the msg and the coderef.  does anyone have any idea
what's going on here?

thanks, 

-ariel.


use Win32::GUI;
use Win32::API;
use Win32::GUI::Loft::Design;

sub WM_WINDOWPOSCHANGING() {70}
sub WM_ENTERIDLE()         {289}
sub SWP_NOACTIVATE()       {16}
sub MSGF_DIALOGBOX()       {0}

my $win = Win32::GUI::Window->new(
        -name => 'win',
        -text => 'test',
        -left => 10,
        -top => 10,
        -width => 250,
        -height => 250,
);

$win->AddButton(
        -name => 'button',
        -text => 'button',
        -left => 10,
        -top => 10,
        -onClick => \&open_thumbnails,
);
 
$win->Center;
$win->Show;

Win32::GUI::Dialog();


sub open_thumbnails
{
        #$win->Hook($win, WM_ENTERIDLE, \&Idle($win));
        $win->Hook(WM_ENTERIDLE, \&Idle($win));
        my $files = Win32::GUI::GetOpenFileName(
                -owner => $win,
        );

        return $files;
}

sub Idle
{
        
        $win->UnHook(WM_ENTERIDLE); # ensure this hook
doesn't get called again

        my ($object, $wParam, $lParam, $type, $msgcode) = @_;
        return unless $type == 0;
        return unless $msgcode == WM_ENTERIDLE;

        # check the message came from a dialog box
        return unless $wParam == MSGF_DIALOGBOX;

        # check that the dialog window handle in $lParam is
for the Open File dialog:
        # here I test the window caption, but you might need
something more robust:
        return unless Win32::GUI::Text($lParam) eq "Open";

        # modify the Dialog (center it on the main window):
        my $sx = $win->Left() + ($win->Width() -
Win32::GUI::Width($lParam))/2;
        my $sy = $win->Top() + ($win->Height() -
Win32::GUI::Height($lParam))/2;
        Win32::GUI::Move($lParam, $sx, $sy);

        # Walk the child windows of the open dialog to find
the SHELLDLL_DefView window:
        my $phwnd = $lParam;
        my $mode = GW_CHILD;  # Initially find the first
child of the dialog window
        while(my $chwnd = Win32::GUI::GetWindow($phwnd,
$mode)) {
                if (Win32::GUI::GetClassName($chwnd) eq
"SHELLDLL_DefView") {
                        # set the view:
                        # from
http://msdn.microsoft.com/msdnmag/issues/04/03/CQA/
                        # 0x7029        Icons
                        # 0x702B        List
                        # 0x702C        Details
                        # 0x702D        Thumbnails
                        # 0x702E        Tiles
                        Win32::GUI::SendMessage($chwnd, WM_COMMAND, 0x702D,
0);
                        last;  # we found it
                }
                $mode = GW_HWNDNEXT; # and walk the rest of the
dialog's children
                $phwnd = $chwnd;
        }

        return;
}

1;


Reply via email to