Leser: 1
5 Einträge, 1 Seite |
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 62 63 64 65 66 67
use Win32::GUI; use Tk; use strict; use warnings; my $current_id = 1; my $is_in_tray = 0; my $unmap_trigger = 0; my $main_win32 = new Win32::GUI::DialogBox( -width => 0, -height => 0, -name => 'MainWindow' ); my $icon = new Win32::GUI::Icon( 'test.ico' ); my $main = MainWindow -> new; $main->geometry('100x100'); #$main->overrideredirect(1); $main->protocol( 'WM_DELETE_WINDOW' => [ \&minimize_to_tray ] ); $main->bind("<Unmap>",sub{ $unmap_trigger++; if ($unmap_trigger % 3 == 0) { $main->withdraw; &minimize_to_tray; } } ); my $btn_minimize = $main->Button( -text => 'Minimize', -command => [ \&minimize_to_tray ] ); my $btn_close = $main->Button( -text => 'Close', -command => [ \&clean_exit ] ); $btn_minimize->place( -x => 10, -y => 5 ); $btn_close->place( -x => 10, -y => 30 ); MainLoop; sub context_menu { my $popup = $main->Menu( Name => 'popupMenu', -tearoff => 0 ); $popup->command( -label => 'Beenden', -command => [ \&clean_exit ] ); $popup->Popup( -popover => 'cursor', -popanchor => 'nw' ); return 1; } sub raise_main { $is_in_tray = 0; $main->deiconify; $main->raise; $main->focus; return -1; } sub minimize_to_tray { $is_in_tray = 1; $main->withdraw; new Win32::GUI::NotifyIcon( $main_win32, -name => "Notify", -id => ++$current_id, -icon => $icon, -tip => "M.A.M.A.", -onClick => sub { &raise_main; }, -onRightClick => sub { &context_menu; } ); my $call = Win32::GUI::Dialog(); $main_win32->Notify->Delete( -id => $current_id ); } sub clean_exit { $main_win32->Notify->Delete( -id => $current_id ) if ($is_in_tray == 1); exit(0); }
ptk+2007-09-04 20:02:26--Zu 1: Geht es, wenn du statt exit() CORE::exit() verwendest?
Zu 2: Mir ist kein Event, der getriggert wird, wenn minimiert wird. Unter Umständen wird auch <Configure> getriggert, aber dieses Event gibt es auch beim Verschieben, Vergrößern etc. <Unmap> scheint mir erstmal gut genug.
Zu 3: Vielleicht sollte man NotifyIcon wiederverwenden? Habe aber keine Ahnung von Win32-Programmierung.
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; }
QuoteWenn es sich um transiente Toplevels handelt, dann verschwinden diese auch üblicherweise (abhängig vom Windowmanager) beim withdraw.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?
$mw->Walk(sub { $_->isa("Tk::Toplevel") and $_->withdraw })
5 Einträge, 1 Seite |