From: Steven V. <ste...@gm...> - 2008-04-30 15:13:06
|
I have been having some trouble getting my scroll bars to work well. I have been modifying an example I found on Rob May's weblog (http://blog.robmay.me.uk/search/label/perl-win32-gui). Sample code is included below. The problems I am having are: 1) The ScrollRange() call does not seem to be doing anything - I can scroll well beyond the range specified. 2) SB_PAGE(UP|DOWN) events are not working at all I am rather new to Win32::GUI and would appreciate any help. Thanks __CODE__ #!/usr/bin/perl use strict; use warnings; use Win32::GUI 1.05 qw( SB_VERT SB_LINEUP SB_LINEDOWN SB_PAGEUP SB_PAGEDOWN SB_THUMBTRACK SB_THUMBPOSITION ); my $window = Win32::GUI::DialogBox->new( -name => "scroll_test", -text => "Scroll Test", -size => [400, 400], -vscroll => 1, -onScroll => \&process_scroll, ); my $v_pos = 5; for ( 0..100 ) { $window->AddLabel( -name => "label-$_", -text => "Label " . ($_ + 1), -pos => [5, $v_pos], -size => [100, 30], ); $v_pos += 35; } $window->ScrollRange(SB_VERT, 0, 35 * 100); $window->Show(); Win32::GUI::Dialog(); sub process_scroll { my ( $self, $bar, $op, $pos ) = @_; my $prev_pos = $self->ScrollPos($bar); my $new_pos = $prev_pos; my $use_rel = 0; my $rel_move = 0; if ( $op == SB_LINEUP ) { # or SB_LINELEFT $new_pos -= 35; $rel_move -= 35; $use_rel = 1; } elsif ( $op == SB_LINEDOWN ) { # or SB_LINERIGHT $new_pos += 35; $rel_move += 35; $use_rel = 1; } elsif ( $op == SB_PAGEUP ) { # or SB_PAGELEFT $new_pos -= $self->ScrollPage($bar); } elsif ( $op == SB_PAGEDOWN ) { # or SB_PAGERIGHT $new_pos += $self->ScrollPage($bar); } elsif ( $op == SB_THUMBTRACK ) { $new_pos = $pos; } elsif ( $op == SB_THUMBPOSITION ) { $new_pos = $pos; } $self->ScrollPos( $bar, $new_pos ); if ( $bar == SB_VERT ) { for my $key ( %$self ) { next unless ref($self->{$key}) eq "Win32::GUI::Label"; $self->{$key}->Top( -$new_pos ); # doesn't work my $cur = $self->{$key}->Top(); #$self->{$key}->Top($cur - $rel_move); # works better, but only # for SB_LINE(UP|DOWN) } } 1; } |
From: Robert M. <ro...@th...> - 2008-05-01 22:01:45
|
2008/4/30 Steven Vasilogianis <ste...@gm...>: > I have been having some trouble getting my scroll bars to work well. I > have been modifying an example I found on Rob May's weblog > (http://blog.robmay.me.uk/search/label/perl-win32-gui). > > Sample code is included below. The problems I am having are: > > 1) The ScrollRange() call does not seem to be doing anything - I can > scroll well beyond the range specified. I don't think you can really. > 2) SB_PAGE(UP|DOWN) events are not working at all Because you never set the page size. > I am rather new to Win32::GUI and would appreciate any help. Here's a minimally adapted version of your code that works for me. There are easier ways to do this, and you really need to see the next few examples in the series of scrollbar articles - I wrote the code at the same time as the first 7 articles, but haven't had time to turn them into full articles yet. I will post to this list when I do. Regards, Rob. #!perl -w use strict; use warnings; use Win32::GUI 1.05 qw( SB_VERT SB_LINEUP SB_LINEDOWN SB_PAGEUP SB_PAGEDOWN SB_THUMBTRACK SB_THUMBPOSITION ); my $window = Win32::GUI::DialogBox->new( -name => "scroll_test", -text => "Scroll Test", -size => [400, 400], -vscroll => 1, -onScroll => \&process_scroll, ); my $v_pos = 5; for ( 1..100 ) { $window->AddLabel( -name => "label$_", -text => "Label $_", -pos => [5, $v_pos], -size => [100, 30], ); $v_pos += 35; } $window->ScrollRange(SB_VERT, 0, 5 + (35 * 99) + $window->label1->Height()); $window->ScrollPage(SB_VERT, $window->ScaleHeight()); $window->Show(); Win32::GUI::Dialog(); sub process_scroll { my ( $self, $bar, $op, $pos ) = @_; my $prev_pos = $self->ScrollPos($bar); my $new_pos = $prev_pos; if ( $op == SB_LINEUP ) { # or SB_LINELEFT $new_pos -= 35; } elsif ( $op == SB_LINEDOWN ) { # or SB_LINERIGHT $new_pos += 35; } elsif ( $op == SB_PAGEUP ) { # or SB_PAGELEFT $new_pos -= $self->ScrollPage($bar); } elsif ( $op == SB_PAGEDOWN ) { # or SB_PAGERIGHT $new_pos += $self->ScrollPage($bar); } elsif ( $op == SB_THUMBTRACK ) { $new_pos = $pos; } elsif ( $op == SB_THUMBPOSITION ) { $new_pos = $pos; } $new_pos = $self->ScrollPos( $bar, $new_pos ); print "NP: $new_pos\n"; if ( $bar == SB_VERT ) { my $v_pos = 5; for ( 1..100 ) { $self->{"label$_"}->Top($v_pos - $new_pos); $v_pos += 35; } } $self->Redraw(1); 1; } __END__ |
From: <a98...@gm...> - 2010-10-01 19:33:01
|
hi rob, I wanted to use some peace of your code. the main function is ok. I want to use TextFields. Is there a possibility to move all Labels, Textfields,... of an window? When I try to work through the hash -> only the text field is moved but no prompt of it. I've enclosed my testcode. thx. juergen __CODE__ #!perl -w use strict; use warnings; my %config = ( config1 => 0, config2 => 0, config3 => "a" ); use Win32::GUI 1.05 qw( SB_VERT SB_LINEUP SB_LINEDOWN SB_PAGEUP SB_PAGEDOWN SB_THUMBTRACK SB_THUMBPOSITION ); my $window = Win32::GUI::DialogBox->new( -name => "scroll_test", -text => "Scroll Test", -size => [400, 400], -vscroll => 1, -onScroll => \&process_scroll, ); my $count = 0; foreach my $l (sort(keys %config)) { $count = $count + 1; $window->AddTextfield( -name => "$l", -text => "$config{$l}", -tip => "", -left => 35, -prompt => [ "$l:" , 150 ], -height => 20, -width => 200, -top => 25 + ($count * 20), -width => 100, -tabstop => 1, ); } $window->ScrollRange(SB_VERT, 0, 5 + (35 * 99) + $window->config1->Height()); $window->ScrollPage(SB_VERT, $window->ScaleHeight()); $window->Show(); Win32::GUI::Dialog(); sub process_scroll { my ( $self, $bar, $op, $pos ) = @_; my $prev_pos = $self->ScrollPos($bar); my $new_pos = $prev_pos; if ( $op == SB_LINEUP ) { # or SB_LINELEFT $new_pos -= 35; } elsif ( $op == SB_LINEDOWN ) { # or SB_LINERIGHT $new_pos += 35; } elsif ( $op == SB_PAGEUP ) { # or SB_PAGELEFT $new_pos -= $self->ScrollPage($bar); } elsif ( $op == SB_PAGEDOWN ) { # or SB_PAGERIGHT $new_pos += $self->ScrollPage($bar); } elsif ( $op == SB_THUMBTRACK ) { $new_pos = $pos; } elsif ( $op == SB_THUMBPOSITION ) { $new_pos = $pos; } $new_pos = $self->ScrollPos( $bar, $new_pos ); if ( $bar == SB_VERT ) { my $v_pos = 5; $v_pos += 35; foreach my $lab (sort(keys %config)) { $self->{"$lab"}->Top($v_pos - $new_pos + 15); } } $self->Redraw(1); 1; } __END__ -------- Original-Nachricht -------- > Datum: Thu, 1 May 2008 23:01:47 +0100 > Von: "Robert May" <ro...@th...> > An: "Steven Vasilogianis" <ste...@gm...> > CC: per...@li... > Betreff: Re: [perl-win32-gui-users] Scrollbars > 2008/4/30 Steven Vasilogianis <ste...@gm...>: > > I have been having some trouble getting my scroll bars to work well. I > > have been modifying an example I found on Rob May's weblog > > (http://blog.robmay.me.uk/search/label/perl-win32-gui). > > > > Sample code is included below. The problems I am having are: > > > > 1) The ScrollRange() call does not seem to be doing anything - I can > > scroll well beyond the range specified. > > I don't think you can really. > > > 2) SB_PAGE(UP|DOWN) events are not working at all > > Because you never set the page size. > > > I am rather new to Win32::GUI and would appreciate any help. > > Here's a minimally adapted version of your code that works for me. > There are easier ways to do this, and you really need to see the next > few examples in the series of scrollbar articles - I wrote the code at > the same time as the first 7 articles, but haven't had time to turn > them into full articles yet. I will post to this list when I do. > > Regards, > Rob. > > #!perl -w > use strict; > use warnings; > > use Win32::GUI 1.05 qw( > SB_VERT SB_LINEUP SB_LINEDOWN SB_PAGEUP SB_PAGEDOWN > SB_THUMBTRACK SB_THUMBPOSITION > ); > > my $window = Win32::GUI::DialogBox->new( > -name => "scroll_test", > -text => "Scroll Test", > -size => [400, 400], > -vscroll => 1, > -onScroll => \&process_scroll, > ); > > my $v_pos = 5; > for ( 1..100 ) { > $window->AddLabel( > -name => "label$_", > -text => "Label $_", > -pos => [5, $v_pos], > -size => [100, 30], > ); > > $v_pos += 35; > } > > $window->ScrollRange(SB_VERT, 0, 5 + (35 * 99) + > $window->label1->Height()); > $window->ScrollPage(SB_VERT, $window->ScaleHeight()); > > $window->Show(); > Win32::GUI::Dialog(); > > sub process_scroll { > my ( $self, $bar, $op, $pos ) = @_; > > my $prev_pos = $self->ScrollPos($bar); > my $new_pos = $prev_pos; > > if ( $op == SB_LINEUP ) { # or SB_LINELEFT > $new_pos -= 35; > } elsif ( $op == SB_LINEDOWN ) { # or SB_LINERIGHT > $new_pos += 35; > } elsif ( $op == SB_PAGEUP ) { # or SB_PAGELEFT > $new_pos -= $self->ScrollPage($bar); > } elsif ( $op == SB_PAGEDOWN ) { # or SB_PAGERIGHT > $new_pos += $self->ScrollPage($bar); > } elsif ( $op == SB_THUMBTRACK ) { > $new_pos = $pos; > } elsif ( $op == SB_THUMBPOSITION ) { > $new_pos = $pos; > } > > $new_pos = $self->ScrollPos( $bar, $new_pos ); > print "NP: $new_pos\n"; > > if ( $bar == SB_VERT ) { > my $v_pos = 5; > for ( 1..100 ) { > $self->{"label$_"}->Top($v_pos - $new_pos); > > $v_pos += 35; > } > } > $self->Redraw(1); > > 1; > } > __END__ > > ------------------------------------------------------------------------- > This SF.net email is sponsored by the 2008 JavaOne(SM) Conference > Don't miss this year's exciting event. There's still time to save $100. > Use priority code J8TL2D2. > http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone > _______________________________________________ > Perl-Win32-GUI-Users mailing list > Per...@li... > https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users > http://perl-win32-gui.sourceforge.net/ > -- Neu: GMX De-Mail - Einfach wie E-Mail, sicher wie ein Brief! Jetzt De-Mail-Adresse reservieren: http://portal.gmx.net/de/go/demail |