From: Jez W. <je...@je...> - 2004-02-28 13:35:45
|
Thanks to Peter Eisengrein and Leonard Jacobsen for giving me the = pointers to build this example. The code below creates a window with a richtext control. The richtext = can be populated with strings separated by commas. When the menu button = is clicked, a popup menu is shown, with a sub menu containing all the = strings in the richtext control. When the sub menu items are selected a = message is displayed in the status bar. Problems. As been discussed on this list before: * Memory leaks when using menus in this way (about 4K everytime the = menu is recreated, or more depending on the number of items in the = menu). This can be minimised by only recreating the menu when you = actually need to. * Using Menus and the NEM in the same window. Comments, thoughts? Cheers, jez. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D use Win32::GUI; use strict; my $menu; #The menu my @colors; #A list of the colors in the popup #create the main window my $mainwindow =3D new Win32::GUI::Window( -title =3D> "Win32::GUI::Rebar test", -left =3D> 100, -top =3D> 100, -width =3D> 600, -height =3D> 200, -name =3D> "Window", =20 ); $mainwindow->AddStatusBar( -name =3D> "Status", ); $mainwindow->AddRichEdit ( -name =3D> 'ColorRE', -pos =3D> [2, 2], -size =3D> [320, 40], -multiline =3D> 1, -addstyle =3D> 2097152, -addstyle =3D> 4096, ); =20 $mainwindow->ColorRE->Text('Red,Green,Blue,Yellow,Orange,Brown'); =20 $mainwindow->AddButton ( -name =3D> 'Menu', -pos =3D> [70, 50], -size =3D> [60, 20], -text =3D> 'Menu', -tip =3D> 'Show Menu', ); $mainwindow->Show; Win32::GUI::Dialog; sub Window_Resize { $mainwindow->Status->Resize(0,0); } sub Menu_Click { CreateMenu(); $mainwindow->TrackPopupMenu($menu->{PopUpMenu}, = Win32::GUI::GetCursorPos()); } sub GenericColorClick { my $item=3Dshift; $mainwindow->Status->Text('Item clicked '.$item.' '.$colors[$item]); } sub CreateMenu { #Get the colors from the richedit control @colors=3Dsplit(',',$mainwindow->ColorRE->Text); my @items; my $subname; my $count; #loop round all colors, create a new sub to handle the event foreach my $col (@colors) { $subname =3D "Colour$count".'_Click'; eval ("sub $subname { GenericColorClick ($count);}"); die "error in eval $@ " if $@; push @items,">> $col"; push @items,"Colour$count"; $count++; } $menu =3D new Win32::GUI::Menu(=20 "" =3D> 'PopUpMenu',=20 "> &Hide" =3D> "Edit",=20 "> &Minimize" =3D> "Edit",=20 "> -" =3D> 0,=20 "> Colors" =3D> "Edit",=20 @items, "> Cars" =3D> "Edit1",=20 ">> Aston Martin" =3D> "Edit",=20 "> -" =3D> 0,=20 "> &Quit" =3D> "Exit",=20 ); }; |