From: Robert M. <rob...@us...> - 2005-10-05 22:20:59
|
Update of /cvsroot/perl-win32-gui/Win32-GUI/docs/GUI/Tutorial In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30555/docs/GUI/Tutorial Modified Files: Part1.pod Part3.pod Part4.pod Part5.pod Part9.pod Log Message: Bug fixes, update tutorial, add tutorial samples Index: Part9.pod =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/docs/GUI/Tutorial/Part9.pod,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Part9.pod 26 Jun 2005 16:41:01 -0000 1.1 --- Part9.pod 5 Oct 2005 22:20:49 -0000 1.2 *************** *** 17,29 **** =item * ! Enter the command "perl MyApp.plx" from a Windows console window. =item * ! Enter the command "perl MyApp.plx" in the Windows "Run" box. =item * ! Double click on the file "MyApp.plx" (assuming you have .plx files associated with the perl.exe application). --- 17,29 ---- =item * ! Enter the command "perl MyApp.pl" from a Windows console window. =item * ! Enter the command "perl MyApp.pl" in the Windows "Run" box. =item * ! Double click on the file "MyApp.pl" (assuming you have .pl files associated with the perl.exe application). *************** *** 46,51 **** editbin /subsystem:windows perlw.exe ! There is also an all-perl way to achieve the same result on Jenda's site: ! L<http://jenda.krynicky.cz/perl/GUIscripts.html> If you can't (or don't want to) create a perlw.exe, then a compromise is to hide --- 46,52 ---- editbin /subsystem:windows perlw.exe ! ActiveState Perl comes with an executable called wperl.exe (you'll find it ! n the same place as your perl.exe). This is an executable with exactly ! this change already made to it. If you can't (or don't want to) create a perlw.exe, then a compromise is to hide *************** *** 59,62 **** --- 60,67 ---- Win32::GUI::Hide($DOS); + Note that C<GetPerlWindow()> returns a windows handle, not a C<Win32::GUI::Window> + object, so we have to use the static call to C<Win32::GUI::Hide()> as discussed + in part 1 of the tutorial. + Do this as early as possible. Obviously, if we hide the console, we must show it when we finish (otherwise, someone who runs your program from a command Index: Part4.pod =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/docs/GUI/Tutorial/Part4.pod,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Part4.pod 26 Jun 2005 16:41:01 -0000 1.1 --- Part4.pod 5 Oct 2005 22:20:49 -0000 1.2 *************** *** 151,165 **** =item * ! There is a small bug in this program. The tray icon does not disappear ! immediately when the program terminates. Instead, it remains in the system ! tray until you point the mouse cursor at it, when it disappears. This is a bug ! in Win32::GUI - when you close your program, you should explicitly remove any ! system tray icons you still have displayed. Referring to the example above, ! you should place this line after the Win32::GUI::Dialog() call: $main->NI->Delete(-id => 1); - Hopefully, this will be fixed in a later version. - =back --- 151,159 ---- =item * ! If you want to remove the tray icon before the end of your program ! you can use this line: $main->NI->Delete(-id => 1); =back Index: Part3.pod =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/docs/GUI/Tutorial/Part3.pod,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Part3.pod 26 Jun 2005 16:41:01 -0000 1.1 --- Part3.pod 5 Oct 2005 22:20:49 -0000 1.2 *************** *** 59,70 **** To make the return key work as expected, you need to give one of your dialog's ! buttons the C<< -default => 1 >> option. When the return key is pressed, it is translated into a click event on the default button. The default button is ! also highlighted differently from the other buttons (it has a dark border). ! B<Note:> There is a related option, C<< -ok => 1 >>, which has a similar ! effect as C<-default>. However, the two seem to conflict in their effects. I ! would recommend that if your default button has the caption C<"OK">, you ! should set both the C<-ok> and C<-default> options. Otherwise, stick with just ! C<-default>. =back --- 59,69 ---- To make the return key work as expected, you need to give one of your dialog's ! buttons the C<< -ok => 1 >> option. When the return key is pressed, it is translated into a click event on the default button. The default button is ! also usually highlighted differently from the other buttons ! (it has a dark border), this is achieved by the C<< -default => 1 >> option, ! It is normal to give this button a caption C<"OK"> and make its click ! handler close the window, setting any changes made, but again, this is up to ! you. =back *************** *** 96,99 **** --- 95,103 ---- the name of the constructor you use to create your application's main window. + Recent versions of Win32::GUI have a C<-dialogui> option that controls the + special keyboard handling. Setting this option to C<1> on a basic Window add the + special key handling to the window; setting it to C<0> on a DialogBox removes + the special key handling. + In the L<next part|Win32::GUI::Tutorial::Part4>, we will cover some further ways in which you can increase your application's functionality. Index: Part1.pod =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/docs/GUI/Tutorial/Part1.pod,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Part1.pod 26 Jun 2005 16:41:00 -0000 1.1 --- Part1.pod 5 Oct 2005 22:20:49 -0000 1.2 *************** *** 115,119 **** } ! Put that in a file (say, hello.plx) and run it using C<perl hello.plx>. =for html <br /><center><img src="part1-1.gif" /></center> --- 115,119 ---- } ! Put that in a file (say, hello.pl) and run it using C<perl hello.pl>. =for html <br /><center><img src="part1-1.gif" /></center> *************** *** 302,327 **** sub Main_Resize { ! my $w = $main->Width(); ! my $h = $main->Height(); my $lw = $label->Width(); my $lh = $label->Height(); ! if ($lw > $w) { ! $main->Width($lw) + $ncw; # Remember the non-client width! } else { ! $label->Left(($w - $lw) / 2); } ! if ($lh > $h) { ! $main->Height($lh) + $nch; # Remember the non-client height! } else { ! $label->Top(($h - $lh) / 2); } } - This does not work in build 340 of Win32::GUI, as there is a bug in the Left() - and Top() methods for client windows (such as the label used here). Hopefully, - this bug will be fixed in the next version. - Note that co-ordinates are calculated from the top left of the enclosing window. --- 302,323 ---- sub Main_Resize { ! my $mw = $main->ScaleWidth(); ! my $mh = $main->ScaleHeight(); my $lw = $label->Width(); my $lh = $label->Height(); ! if ($lw > $mw) { ! $main->Width($lw + $ncw); # Remember the non-client width! } else { ! $label->Left(($mw - $lw) / 2); } ! if ($lh > $mh) { ! $main->Height($lh + $nch); # Remember the non-client height! } else { ! $label->Top(($mh - $lh) / 2); } } Note that co-ordinates are calculated from the top left of the enclosing window. *************** *** 385,388 **** --- 381,385 ---- $main->Change(-minsize => [$w, $h]); + $main->Resize($w, $h); $main->Move($x, $y); $main->Show(); *************** *** 395,404 **** sub Main_Resize { ! my $w = $main->ScaleWidth(); ! my $h = $main->ScaleHeight(); my $lw = $label->Width(); my $lh = $label->Height(); ! $label->Left(int(($w - $lw) / 2)); ! $label->Top(int(($h - $lh) / 2)); } --- 392,402 ---- sub Main_Resize { ! my $mw = $main->ScaleWidth(); ! my $mh = $main->ScaleHeight(); my $lw = $label->Width(); my $lh = $label->Height(); ! ! $label->Left(int(($mw - $lw) / 2)); ! $label->Top(int(($mh - $lh) / 2)); } Index: Part5.pod =================================================================== RCS file: /cvsroot/perl-win32-gui/Win32-GUI/docs/GUI/Tutorial/Part5.pod,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Part5.pod 26 Jun 2005 16:41:01 -0000 1.1 --- Part5.pod 5 Oct 2005 22:20:49 -0000 1.2 *************** *** 141,155 **** If you choose to close the second window with the Close (little X) ! button on the upper right corner, you'll notice that the window ! disappear, and that it does not show anymore when you press the ! button on the main window! What's happening here is that we requested a C<W2_Terminate> action, and since we didn't provide an event for this, Win32::GUI proceeds with the default behaviour for the close button, which is to destroy ! the window. The result is that you can't show $W2 anymore, because ! it does not exists anymore as a valid window (although it still exists ! as a Perl object). To let our window survive the close action, we need ! to provide a customary C<Terminate> event: sub W2_Terminate { --- 141,152 ---- If you choose to close the second window with the Close (little X) ! button on the upper right corner, you'll notice that all the windows ! disappear. What's happening here is that we requested a C<W2_Terminate> action, and since we didn't provide an event for this, Win32::GUI proceeds with the default behaviour for the close button, which is to destroy ! the window, and exit the windows message loop. To let our window survive ! the close action, we need to provide a customary C<Terminate> event: sub W2_Terminate { *************** *** 162,169 **** that we can show it again using the button in C<$W1>. ! =head2 Simulating "modal" windows ! ! [ This section is out of date. Win32::GUI has native support ! for modal windows. See the DoModal() method in the main documention.] Here is another very common functionality you may want to implement: --- 159,163 ---- that we can show it again using the button in C<$W1>. ! =head2 "modal" windows Here is another very common functionality you may want to implement: *************** *** 173,198 **** program unless you have disposed of it. ! Win32::GUI does not have direct support for modal windows, but you can ! simulate the behaviour with this trick: ! sub W1_Activate { ! if($W2->IsVisible) { ! $W2->SetForegroundWindow(); ! return 0; ! } ! return 1; } ! The meaning should be obvious enough: if the popup window is shown, ! trying to activate the main window automatically reports you to the ! popup window; otherwise, the main window becomes the active one as ! normal. Of course, if you have more than one popup window, you should ! add code for everyone of them: ! sub W1_Activate { ! if($W2->IsVisible) { $W2->SetForegroundWindow(); return 0; } ! if($W3->IsVisible) { $W3->SetForegroundWindow(); return 0; } ! # ... and so on ! return 1; } --- 167,234 ---- program unless you have disposed of it. ! So, the behaviour of a modal window is to diable interaction with the ! window used to launch it (know as its parent window). To achieve this ! we first have to tell the window who its parent is. We do this when we ! create W2, using the C<-parent> option: ! $W2 = new Win32::GUI::Window( ! ... ! -parent => $W1, ! ); ! ! Now, when we want to display the W2 we use the C<DoModal()> method: this ! disables W2's parent window (W1), and starts a new message loop to ! process events for W2. When we are done with W2, we return C<-1> from an ! event handler, which causes C<DoModal()> to return, but in this case does ! not cause any of the windows to be destroyed. Here's the full code: ! ! use Win32::GUI; ! ! my $W1 = Win32::GUI::Window->new( ! -name => "W1", ! -title => "First Window", ! -pos => [ 100, 100 ], ! -size => [ 300, 200 ], ! ); ! ! $W1->AddButton( ! -name => "Button1", ! -text => "Open popup window", ! -pos => [ 10, 10 ], ! ); ! ! my $W2 = Win32::GUI::Window->new( ! -name => "W2", ! -title => "Second Window", ! -pos => [ 150, 150 ], ! -size => [ 300, 200 ], ! -parent => $W1, ! ); ! ! $W2->AddButton( ! -name => "Button2", ! -text => "Close this window", ! -pos => [ 10, 10 ], ! ); ! ! $W1->Show(); ! Win32::GUI::Dialog(); ! exit(0); ! ! sub W1_Terminate { ! return -1; } ! sub Button1_Click { ! $W2->DoModal(); ! return 0; ! } ! sub W2_Terminate { ! return -1; ! } ! ! sub Button2_Click { ! return -1; } |