>From Gui.pm:
sub new {
    shift;
    my($k, $v);
    my $flag = 0;
    my $key = 0;
    my %accels = @_;
    while( ($k, $v) = each %accels) {
        $flag = 0;
        if($k =~ s/shift[-\+]//i)                { $flag |= 0x0004; }
        if($k =~ s/(ctrl|control)[-\+]//i)       { $flag |= 0x0008; }
        if($k =~ s/alt[-\+]//i)                  { $flag |= 0x0010; }

           if($k =~ /^space$/i)                  { $flag |= 0x0001; $key = 
0x20; } # VK_SPACE
        elsif($k =~ /^left$/i)                   { $flag |= 0x0001; $key = 
0x25; } # VK_LEFT
        elsif($k =~ /^right$/i)                  { $flag |= 0x0001; $key = 
0x27; } # VK_RIGHT
        elsif($k =~ /^up$/i)                     { $flag |= 0x0001; $key = 
0x26; } # VK_UP
        elsif($k =~ /^down$/i)                   { $flag |= 0x0001; $key = 
0x28; } # VK_DOWN
        elsif($k =~ /^ins$/i)                    { $flag |= 0x0001; $key = 
0x2D; } # VK_INSERT
        elsif($k =~ /^del$/i)                    { $flag |= 0x0001; $key = 
0x2E; } # VK_DELETE      
        elsif($k =~ /^f1$/i)                     { $flag |= 0x0001; $key = 
0x70; } # VK_F1
        elsif($k =~ /^f2$/i)                     { $flag |= 0x0001; $key = 
0x71; } # VK_F2
        elsif($k =~ /^f3$/i)                     { $flag |= 0x0001; $key = 
0x72; } # VK_F3
        elsif($k =~ /^f4$/i)                     { $flag |= 0x0001; $key = 
0x73; } # VK_F4
        elsif($k =~ /^f5$/i)                     { $flag |= 0x0001; $key = 
0x74; } # VK_F5
        elsif($k =~ /^f6$/i)                     { $flag |= 0x0001; $key = 
0x75; } # VK_F6
        elsif($k =~ /^f7$/i)                     { $flag |= 0x0001; $key = 
0x76; } # VK_F7
        elsif($k =~ /^f8$/i)                     { $flag |= 0x0001; $key = 
0x77; } # VK_F8
        elsif($k =~ /^f9$/i)                     { $flag |= 0x0001; $key = 
0x78; } # VK_F9
        elsif($k =~ /^f10$/i)                    { $flag |= 0x0001; $key = 
0x79; } # VK_F10
        elsif($k =~ /^f11$/i)                    { $flag |= 0x0001; $key = 
0x7A; } # VK_F11
        elsif($k =~ /^f12$/i)                    { $flag |= 0x0001; $key = 
0x7B; } # VK_F12
        elsif($k =~ /^esc$/i)                    { $flag |= 0x0001; $key = 
0x1B; } # VK_ESCAPE
        elsif($k =~ /^backspace$/i)              { $flag |= 0x0001; $key = 
0x08; } # VK_BACK
        elsif($k =~ /^tab$/i)                    { $flag |= 0x0001; $key = 
0x09; } # VK_TAB
        elsif($k =~ /^return$/i)                 { $flag |= 0x0001; $key = 
0x0D; } # VK_RETURN
        elsif($k =~ /^end$/i)                    { $flag |= 0x0001; $key = 
0x23; } # VK_END
        elsif($k =~ /^home$/i)                   { $flag |= 0x0001; $key = 
0x24; } # VK_HOME
        elsif($k =~ /^(pgup|pageup)$/i)          { $flag |= 0x0001; $key = 
0x21; } # VK_PRIOR
        elsif($k =~ /^(pgdn|pagedn|pagedown)$/i) { $flag |= 0x0001; $key = 
0x22; } # VK_NEXT
        elsif($k =~ /^[0-9a-zA-Z]$/)             { $flag |= 0x0001; $key = 
ord(uc($k)); } # ASCII

        push(@acc, $id); 
        push(@acc, $key);
        push(@acc, $flag);
        $self->{$Win32::GUI::AcceleratorCounter++} = $v;
        
    }
    if($Win32::GUI::AcceleratorTable) {
        Win32::GUI::DestroyAcceleratorTable($Win32::GUI::AcceleratorTable);
    }
    my $handle = Win32::GUI::CreateAcceleratorTable( @acc );
    if($handle) {
        $self->{-handle} = $handle;
        return 1;                     
    } else {
        return 0;
    }
}


Script: x.pl
use Win32::GUI;
$Window = new Win32::GUI::Window (
        -name   => "Window",
        -topmost => 1,
        -left   => 300,
        -dialogui => 1,
        -top    => 400,
        -width  => 205,
        -height => 235,
        -maxsize  => [205,235],
        -minsize  => [205,235],
        -text   => "something",
        -maximizebox => 0,
        -minimizebox =>1,
        -helpbutton => 0,
        -resizable =>0,
        -accel => $A,
);

$CBdropdown = $Window->AddCombobox(
        -tabstop => 1,
        -default =>1,
    -sort => 1,
    -name   => Dropdown,
    -left   => 10,
    -top    => 15,
    -width  => 180,
    -height => 300,
    -scroll  => 1,
    -addstyle  => WS_VISIBLE | 0x0003 | WS_VSCROLL,


);
my @a = qw[ One Two Three Four Five Six Seven Eight Nine Ten];
foreach my $a(){
        $CBdropdown->InsertItem($a)
}

Running this script before modifiying gui.pm results in:
when pressing "t", the combo box will alternate between "Two", "Threee, and 
"Ten"
If you Hold the ctrl while pressing "t", it will cycle the combo box, proving 
that the accelerator table is not intercepting the events. 


Now, if you just bless and return $self, (or $self,$class) you now get the 
DESTROY event upon Window_Terminate AND the window seems to trap the ctrl-t 
combonation, which I can assume since the combobox does not cycle.

I dont know how the message queue thing works, but perhaps this is a start.  
Maybe someone with xs experience can take a look at it to see if any other 
progress can be made on it.  It appears that @acc is pushed in the form ($id, 
$key, $flag) (key is the key pressed such as 'k', flag is the modifier key such 
as 'alt', 'ctrl',  but $id is defined nowhere, and is not even in the lexical 
scope of the sub.  I would expect this to be wrong, but not sure.

Or maybe we are close enough to a new Win32::GUI release that it does not make 
a difference?


I changed : 
if($handle) {
        $self->{-handle} = $handle;
        return 1;    
}

to :
if($handle) {
        $self->{-handle} = $handle;
        bless($self);            
        return $self;                   
}

so that an object is return instead of a true/false.  I can only assume that 
the -accel needs an object and not a true/false value.

If anyone makes any headway, let the group know.

Joe






> -----Original Message-----
> From: Peter Eisengrein [mailto:[EMAIL PROTECTED]
> Sent: Monday, January 14, 2002 10:34 AM
> To: 'Nathan Meyers'; perl-win32-gui-users@lists.sourceforge.net
> Subject: RE: [perl-win32-gui-users] Keyboard accelerators possible?
> 
> 
> It does exist as method Win32::GUI::AcceleratorTable . I've 
> never been able
> to make it work, but perhaps someone else can lend a hand. 
> 
> From the .pm...
> # Example:
> #     $A = new Win32::GUI::AcceleratorTable(
> #         "Ctrl-X"       => "Close",
> #         "Shift-N"      => "New",
> #         "Ctrl-Alt-Del" => "Reboot",
> #     );
> 
> 
> 
> > -----Original Message-----
> > From: Nathan Meyers [mailto:[EMAIL PROTECTED]
> > Sent: Monday, January 14, 2002 01:48
> > To: perl-win32-gui-users@lists.sourceforge.net
> > Subject: [perl-win32-gui-users] Keyboard accelerators possible?
> > 
> > 
> > Hello,
> > 
> > I'm new to Win32::GUI and trying to solve a problem; I can't find a
> > thing about it in the mail archives.
> > 
> > Is it possible to define keyboard accelerators for menu items 
> > - not the
> > mnemonics used in conjunction with the Alt key, but the Ctrl 
> > characters
> > that dispatch to menu callbacks (commonly done in GUI applications)?
> > 
> > Nathan Meyers
> > [EMAIL PROTECTED]
> > 
> > _______________________________________________
> > Perl-Win32-GUI-Users mailing list
> > Perl-Win32-GUI-Users@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users
> > 
> 
> _______________________________________________
> Perl-Win32-GUI-Users mailing list
> Perl-Win32-GUI-Users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users
> 

Reply via email to