Thread Tk und Win32::GUI -> Tray, diverse Probleme
(4 answers)
Opened by GoodFella at 2007-09-04 19:19
Nach langem Probieren habe ich nun eine vollständig funktionierende Version, die z.B. auch Icon-Animation zulassen würde, wäre eigentlich perfekt für ein Wiki ^^
Ich habe Win32::GUI::Dialog weggelassen und schon ging einiges, was vorher Probleme gemacht hatte. Wegen 2: <Unmap> feuert 1,2 oder 3 Mal je nach Aktion, da erschien es mir sinnvoll, das etwas umzuschreiben. Die Idee mit dem verschwindenden und wieder auftauchenden Icon habe ich allerdings beerdigt, hat nach Stunden immer noch nicht funktioniert. (Man könnte das Icon allerdings gegen ein 1x1 Pixel-Icon austauschen..) Eine Sache macht mir allerdings noch Kopfzerbrechen: Klickt man mehrfach und schnell hintereinander mit der rechten und linken Maustaste auf das Icon, lässt sich kein Kontextmenü mehr öffnen, nachdem es den Focus verloren hatte. Ausserdem treten sporadisch "Perl.exe hat ein Problem festgestellt und muss beendet werden" Fehlermeldungen auf.. ist allerdings eine Weile her dass ich die letzte gesehen habe, kann also schon aus dem Code eliminiert sein. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 use Win32::GUI; use Tk; use strict; use warnings; # Win32::GUI my $main_win32 = new Win32::GUI::DialogBox( -width => 0, -height => 0, -name => 'TrayWindow' ); my $icon_nr = 0; my @icon = (new Win32::GUI::Icon( 'test.ico' ), new Win32::GUI::Icon( 'test2.ico' )); new Win32::GUI::NotifyIcon( $main_win32, -name => "Notify", -id => 255, -icon => $icon[$icon_nr], -tip => "mails and more Auftragsmanagement", -onClick => sub { &toggle_main; }, -onRightClick => sub { &context_menu; } ); #Tk my $main = MainWindow->new; my $btn_close = $main->Button( -text => ' Beenden ', -command => sub { &clean_exit } )->pack(); my $btn_switch_icon = $main->Button( -text => ' Icon ändern ', -command => sub { &toggle_icon } )->pack(); #Minimieren- und X-Button ins Tray leiten $main->protocol( 'WM_DELETE_WINDOW' => sub { $main->withdraw; } ); $main->bind( "<Unmap>", sub { $main->withdraw if ($main->state eq 'iconic'); } ); MainLoop; #Rechtsklickmenü aufrufen sub context_menu { my $popup = $main->Menu( Name => 'popupMenu', -tearoff => 0 ); $popup->command( -label => 'm.a.m.A. Beenden', -command => sub { &clean_exit } ); $popup->Popup( -popover => 'cursor', -popanchor => 'nw' ); return 1; } #Hauptfenster verstecken / anzeigen sub toggle_main { if ($main->state eq 'withdrawn') { $main->deiconify; $main->raise; $main->focus; } else { $main->withdraw; } } #Icon verändern sub toggle_icon { $icon_nr = !$icon_nr; Win32::GUI::NotifyIcon::Modify( $main_win32, -id => 255, -icon => $icon[$icon_nr], -tip => ' verändertes Icon ' ); } #TrayIcon erntfernen und Beenden sub clean_exit { $main_win32->Notify->Delete( -id => 255 ); CORE::exit; } [EDIT] Eine Sache ist mir gerade aufgefallen: Toplevel Widgets sind vom withdraw des MainWindow nicht betroffen.. wie kann ich die (ausser manuell einzeln) automatisch mitverschwinden lassen?[/EDIT] |