From: Veli-Pekka <vt...@ma...> - 2007-09-06 17:56:32
|
Hi list, I think I might have found a bug in the event handling of Radio Buttons, or else have just somehow misunderstood how their event handling works. EIther way, I'd appreciate any comments and clarifications. Issue: if I create two radio buttons in a dialog, set them up in the tab order, and then use the arrows to select one of the buttons, the onClick event is fired twice when the arrows are used to select another radio button. In contrast, if I use the mouse or click the button programmatically, the event is fired only once. I would have expected the latter behavior in keyboard usage, too. What causes the refiring of the onClick event? version info: This is perl, v5.8.8 built for MSWin32-x86-multi-thread Documentation for Win32::GUI v1.05 created 05 Nov 2006 Sample code: use strict; use warnings; use Win32::GUI qw||; use Win32::GUI::GridLayout; my($width, $height) = qw|4 4|; my $win = Win32::GUI::DialogBox->new ( -name => 'win', -size => [40 * $width, 40 * $height], -text => 'radios' -onTerminate => sub { -1 }, ); my $grid = Win32::GUI::GridLayout->apply ( $win, $width, $height, 0, 0 ); my @buttons; for my $i (1 .. $width) { # Ad some radio buttons. my $radio = Win32::GUI::RadioButton->new ( $win, -name => "b$i", -tabstop => 1 , -text => $i, -onClick => sub { print "Click ", (shift)->UserData() . "\n"; 1 } ); $radio->UserData($i); $grid->add($radio, $i, $height / 2); push @buttons, $radio; } # for my $first = $buttons[0]; $first->SetFocus(); $first->Click(); $grid->recalc(); $win->Show(); Win32::GUI::Dialog(); -- With kind regards Veli-Pekka Tätilä (vt...@ma...) Accessibility, game music, synthesizers and programming: http://www.student.oulu.fi/~vtatila |
From: Robert M. <rob...@us...> - 2007-11-10 10:49:44
|
On 06/09/2007, Veli-Pekka T=E4til=E4 <vt...@ma...> wrote: > Hi list, > I think I might have found a bug in the event handling of Radio Buttons, > or else have just somehow misunderstood how their event handling works. > EIther way, I'd appreciate any comments and clarifications. > > Issue: > > if I create two radio buttons in a dialog, set them up in the tab order, > and then use the arrows to select one of the buttons, the onClick event > is fired twice when the arrows are used to select another radio button. > In contrast, if I use the mouse or click the button programmatically, > the event is fired only once. I would have expected the latter behavior > in keyboard usage, too. What causes the refiring of the onClick event? I, too, was surprised by this behaviour, but it appears to be 'standard' windows behaviour for radio buttons. I can't really explain it, but will describe what I see using Spy++: Using the mouse: - Mouse down sets the focus to the button and set the highlight state. - Mouse up unsets the highlight state and send a BN_CLICKED message to the parent Using the keyboard: - key down causes IsDialogMessage to move the focus to the new button (which generates a BN_CLICKED message) - key up causes IsDialogMessage to send a BN_CLICK message to the button, which in turn causes the button to send itself WM_LBUTTONDOWN and WM_LBUTTONUP messages (which generates the sequence of events for the mouse click, which in turn generates the second BN_CLICKED message) As I say, I don't really understand the complexity of the message generation, but I am convinced that this is a windows thing and not a Win32::GUI bug. Your click handler needs to cope with multiple clicks anyway, as I can set there and click the same button again and again .... Regards, Rob. > > version info: > > This is perl, v5.8.8 built for MSWin32-x86-multi-thread > Documentation for Win32::GUI v1.05 created 05 Nov 2006 > > Sample code: > > use strict; use warnings; > use Win32::GUI qw||; use Win32::GUI::GridLayout; > > my($width, $height) =3D qw|4 4|; > my $win =3D Win32::GUI::DialogBox->new > ( > -name =3D> 'win', -size =3D> [40 * $width, 40 * $height], > -text =3D> 'radios' -onTerminate =3D> sub { -1 }, > ); > > my $grid =3D Win32::GUI::GridLayout->apply > ( > $win, $width, $height, > 0, 0 > ); > > my @buttons; > for my $i (1 .. $width) > { # Ad some radio buttons. > my $radio =3D Win32::GUI::RadioButton->new > ( > $win, -name =3D> "b$i", -tabstop =3D> 1 , -text =3D> $i, > -onClick =3D> sub > { > print "Click ", (shift)->UserData() . "\n"; > 1 > } > ); > $radio->UserData($i); > $grid->add($radio, $i, $height / 2); > push @buttons, $radio; > } # for > my $first =3D $buttons[0]; > $first->SetFocus(); > $first->Click(); > $grid->recalc(); > $win->Show(); > Win32::GUI::Dialog(); > > -- > With kind regards Veli-Pekka T=E4til=E4 (vt...@ma...) > Accessibility, game music, synthesizers and programming: > http://www.student.oulu.fi/~vtatila > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Splunk Inc. > Still grepping through log files to find problems? Stop. > Now Search log events and configuration files using AJAX and a browser. > Download your FREE copy of Splunk now >> http://get.splunk.com/ > _______________________________________________ > Perl-Win32-GUI-Users mailing list > Per...@li... > https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users > http://perl-win32-gui.sourceforge.net/ > --=20 Please update your address book with my new email address: ro...@th... |
From: <a98...@gm...> - 2007-11-22 13:08:27
|
Hi, is it possible to make a "menu" like "button1" and "button2" or a click event like "click here to do something" on a balloon? how can I realize this? thx for help juergen -- Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kann`s mit allen: http://www.gmx.net/de/go/multimessenger |
From: <a98...@gm...> - 2007-11-22 13:05:08
|
Hi, I've a small application with a configuration window. this window is created with a for-loop and some textfields with "prompt" for the values. this window is shown with an Animate(). but the prompts aren't shown until i focus it with tabstopps or the mouse. what's my problem? thx for help. juergen [snip] sub configuration { configuration_window(); # create the window my $count = 0; my $padding = 10; $cfg_window->AddGroupbox( -name => "CFGX", -title => "Configuration", -left => 25, -top => 10, -width => 400, -group => 1, ); foreach my $xx (sort(keys %config)) { $count = $count + 1; print "$xx = $config{$xx}\n"; $cfg_window->AddTextfield( -name => "${xx}_name", -text => "$config{$xx}", -tip => "$config_tooltips{$xx}", -left => 35, -prompt => [ "$xx:" , 150 ], -height => 20, -width => 200, -top => 25 + ($count * 20), -width => $cfg_window->CFGX->Width() - (2 * 20), -tabstop => 1, ); } $cfg_window->CFGX->Height(350); $cfg_window->CFGX->Width(550); $cfg_window->{archive_destination_name}->SetFocus(); do_animation($cfg_window); $cfg_window->SetRedraw(1); get_configuration(); } [/snip] -- Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kann`s mit allen: http://www.gmx.net/de/go/multimessenger |
From: Robert M. <rob...@us...> - 2007-12-09 08:40:20
|
On 22/11/2007, a98...@gm... <a98...@gm...> wrote: > Hi, > I've a small application with a configuration window. > this window is created with a for-loop and some textfields with "prompt" = for the values. > this window is shown with an Animate(). > but the prompts aren't shown until i focus it with tabstopps or the mouse= . > what's my problem? > > thx for help. > juergen Juergen, As the example you have posted is a snippet and not a complete script that I can look at then I can't tell what your problem is. I expect that in your do_animation() you only deal with the textfield, and not with the associated label, but without seeing more code I can't really tell. If you were to post a short but complete example showing your problem, then I'm happy to have another look. Regards, Rob. > > [snip] > sub configuration > { > configuration_window(); # create the window > my $count =3D 0; > my $padding =3D 10; > > $cfg_window->AddGroupbox( > -name =3D> "CFGX", > -title =3D> "Configuration", > -left =3D> 25, > -top =3D> 10, > -width =3D> 400, > -group =3D> 1, > ); > > foreach my $xx (sort(keys %config)) > { > $count =3D $count + 1; > print "$xx =3D $config{$xx}\n"; > $cfg_window->AddTextfield( > -name =3D> "${xx}_name", > -text =3D> "$config{$xx}", > -tip =3D> "$config_tooltips{$xx}", > -left =3D> 35, > -prompt =3D> [ "$xx:" , 150 ], > -height =3D> 20, > -width =3D> 200, > -top =3D> 25 + ($count * 20), > -width =3D> $cfg_window->CFGX->Width() - (2 * 20), > -tabstop =3D> 1, > ); > } > > $cfg_window->CFGX->Height(350); > $cfg_window->CFGX->Width(550); > > $cfg_window->{archive_destination_name}->SetFocus(); > do_animation($cfg_window); > $cfg_window->SetRedraw(1); > get_configuration(); > } > [/snip] > > -- > Psssst! Schon vom neuen GMX MultiMessenger geh=F6rt? > Der kann`s mit allen: http://www.gmx.net/de/go/multimessenger > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2005. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > Perl-Win32-GUI-Users mailing list > Per...@li... > https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users > http://perl-win32-gui.sourceforge.net/ > --=20 Please update your address book with my new email address: ro...@th... |
From: <a98...@gm...> - 2007-12-12 17:15:11
|
hi rob, thanks for your support. I've created a small working example of my script. juergen [snip] #!.\perl.exe # use strict; no strict qw(subs); ############################## # GUI use Win32::GUI 1.05 qw( CW_USEDEFAULT WM_HOTKEY VK_J IDI_DEFAULTICON MB_OK MB_ICONHAND ES_WANTRETURN WS_CLIPCHILDREN WS_EX_TOPMOST WM_HSCROLL WM_VSCROLL SB_CTL SB_HORZ SB_VERT SB_TOP SB_BOTTOM SB_LINEUP SB_LINEDOWN SB_PAGEUP SB_PAGEDOWN SB_LEFT SB_RIGHT SB_LINELEFT SB_LINERIGHT SB_PAGELEFT SB_PAGERIGHT SB_THUMBTRACK SB_THUMBPOSITION SB_ENDSCROLL ); use Win32::GUI::Constants (); use Win32::API(); use Win32::Sound; use Win32::ChangeNotify; use Win32::GUI::SplashScreen(); # my $main; my $cfg_window; my %cfg = ( iconfile => undef, icon_file => undef, ); my %config = ( playsound => 0, showsplash => 0, monitor_dir => join( "", Win32::GetFullPathName( '.' ) ), monitor_subdirs => False, timeout_value => 30, archive_destination_name => XXX, ); my %config_tooltips = ( playsound => "start startsound [0]|1", showsplash => "show splash screen on startup [0]|1", monitor_dir => "Path to monitoring directory", monitor_subdirs => "Should subdirectories be monitored? [False]|True", timeout_value => "timeout value in seconds [30]", ); #---------------------------- sub do_animation { my $window = $_[0]; print "do_animation: $window\n"; $window->Animate( -show => !$window->IsVisible(), -activate => 1, -animation => "blend", -direction => "rl", -time => 400, ); $window->BringWindowToTop(); $window->DoEvents(); $window->Update(); } # -------------------- sub configuration { configuration_window(); # create the window my $count = 0; my $padding = 10; $cfg_window->AddGroupbox( -name => "CFGX", -title => "Configuration", -left => 25, -top => 10, -width => 400, -group => 1, ); foreach my $xx (sort(keys %config)) { $count = $count + 1; print "$xx = $config{$xx}\n"; $cfg_window->AddTextfield( -name => "${xx}_name", -text => "$config{$xx}", -tip => "$config_tooltips{$xx}", -left => 35, -prompt => [ "$xx:" , 150 ], -height => 20, -width => 200, -top => 25 + ($count * 20), -width => $cfg_window->CFGX->Width() - (2 * 20), -tabstop => 1, ); } $cfg_window->CFGX->Height(350); $cfg_window->CFGX->Width(550); # $cfg_window->{archive_destination_name}->SetFocus(); do_animation($cfg_window); $cfg_window->SetRedraw(1); } # ------------------- sub configuration_window { $cfg_window=Win32::GUI::Window->new( -name => "configwin", -title => "$cfg{name} - Configuration", -left => CW_USEDEFAULT, -size => [ 600, 450 ], -parent => $main, -vscroll => 1, -hscroll => 1, -helpbutton => 0, -dialogui => 1, -resizable => 1, -onTerminate => sub { do_animation($cfg_window); 0; }, ); my $ncw = $cfg_window->ScaleWidth(); my $nch = 20; $cfg_window->AddButton( -name => "CFGOK", -text => "OK", -pos => [ 30, $nch ], ); $cfg_window->AddButton( -name => "CFGCANCEL", -text => "CANCEL", -pos => [ 70, $nch ], ); } # ---------------- sub create_MainWindow { $main = Win32::GUI::Window->new( -name => 'Main', -left => CW_USEDEFAULT, -addstyle => WS_CLIPCHILDREN, -width => 100, -height => 100, -text => "main".$cfg{title_string}, -menu => $cfg{mainmenu}, -vscroll => 1, -hscroll => 1, -size => [800,550], -helpbutton => 0, -maximizebox => 0, -resizable => 1, -background => {0x00FF00}, -foreground => {0x33AABB}, -dialogui => 1, # -accel => $cfg{accelerator}, -noflicker => 1, # -onMinimize => \&toggle_show_state, -eventmodel => both, ); } # ---------------- create_MainWindow(); $main->AddButton( -visible => 1, -cancel => 1, -onClick => configuration(), ); $main->Show(); Win32::GUI::Dialog(); [/snip] -------- Original-Nachricht -------- > Datum: Sun, 9 Dec 2007 08:40:23 +0000 > Von: "Robert May" <rob...@us...> > An: "a98...@gm..." <a98...@gm...> > CC: per...@li... > Betreff: Re: [perl-win32-gui-users] why are the prompts of my textfields not shown? > On 22/11/2007, a98...@gm... <a98...@gm...> wrote: > > Hi, > > I've a small application with a configuration window. > > this window is created with a for-loop and some textfields with "prompt" > for the values. > > this window is shown with an Animate(). > > but the prompts aren't shown until i focus it with tabstopps or the > mouse. > > what's my problem? > > > > thx for help. > > juergen > > Juergen, > > As the example you have posted is a snippet and not a complete script > that I can look at then I can't tell what your problem is. I expect > that in your do_animation() you only deal with the textfield, and not > with the associated label, but without seeing more code I can't really > tell. If you were to post a short but complete example showing your > problem, then I'm happy to have another look. > > Regards, > Rob. > > > > [snip] > > sub configuration > > { > > configuration_window(); # create the window > > my $count = 0; > > my $padding = 10; > > > > $cfg_window->AddGroupbox( > > -name => "CFGX", > > -title => "Configuration", > > -left => 25, > > -top => 10, > > -width => 400, > > -group => 1, > > ); > > > > foreach my $xx (sort(keys %config)) > > { > > $count = $count + 1; > > print "$xx = $config{$xx}\n"; > > $cfg_window->AddTextfield( > > -name => "${xx}_name", > > -text => "$config{$xx}", > > -tip => "$config_tooltips{$xx}", > > -left => 35, > > -prompt => [ "$xx:" , 150 ], > > -height => 20, > > -width => 200, > > -top => 25 + ($count * 20), > > -width => $cfg_window->CFGX->Width() - (2 * 20), > > -tabstop => 1, > > ); > > } > > > > $cfg_window->CFGX->Height(350); > > $cfg_window->CFGX->Width(550); > > > > $cfg_window->{archive_destination_name}->SetFocus(); > > do_animation($cfg_window); > > $cfg_window->SetRedraw(1); > > get_configuration(); > > } > > [/snip] > > > > -- > > Psssst! Schon vom neuen GMX MultiMessenger gehört? > > Der kann`s mit allen: http://www.gmx.net/de/go/multimessenger > > > > > ------------------------------------------------------------------------- > > This SF.net email is sponsored by: Microsoft > > Defy all challenges. Microsoft(R) Visual Studio 2005. > > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > > _______________________________________________ > > Perl-Win32-GUI-Users mailing list > > Per...@li... > > https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users > > http://perl-win32-gui.sourceforge.net/ > > > > > -- > Please update your address book with my new email address: > ro...@th... -- Der GMX SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen! Ideal für Modem und ISDN: http://www.gmx.net/de/go/smartsurfer |
From: Robert M. <rob...@us...> - 2008-01-27 13:59:49
|
On 12/12/2007, a98...@gm... <a98...@gm...> wrote: > hi rob, > thanks for your support. > > I've created a small working example of my script. Sorry I took so long to get round to looking at this. I cut your script down to be *short* and something that I could run without having to install lots of other modules. My script attached below. I see the problem. It is only a problem with 'blend' - 'slide' and 'center' work fine. I don't have time to work out exactly why this is (but suspect it's a non-trivial interaction with the way AnimateWindow() works and way DefWindowProc handles the WM_PRINT message). I've included a simple work-around in my script - uncomment the extra line in my animate() function. How that's useful. Rob. #!perl.exe -w use strict; use warnings; use Win32::GUI 1.05 qw( CW_USEDEFAULT ); my $mw = Win32::GUI::Window->new( -title => "Configuration", -left => CW_USEDEFAULT, -size => [ 600, 450 ], ); $mw->AddTextfield( -prompt => [ "Prompt: " , 50 ], -text => "Default Setting", -pos => [10,10], -size => [150, 20], ); #$mw->Show(); animate($mw); Win32::GUI::Dialog(); $mw->Hide(); exit(0); sub animate { my ($self) = @_; $self->Animate( -show => 1, -activate => 1, -animation => "blend", -direction => "rl", -time => 400, ); # Add next line to fix problem with 'blend' mode #$self->InvalidateRect(0); return; } __END__ |