Hi, for b) Add an event listener like this http://sdl.perl.org/SDL-Events.html#SYNOPSIS and call the tk-callback when receiving the right event. (SDL_MOUSEBUTTONUP I suppose)
Cheers, FROGGS mit freundlichen Grüßen Tobias Leich Entwicklung ICT telent GmbH - ein Unternehmen der euromicron Gruppe Rheinstraße 10B, D-14513 Teltow Tel.: +49-(0)3328 4590-512 Fax.: +49-(0)3328 4590-55 512 Mobil: +49-(0)152 579 39 064 E-Mail: tobias.le...@telent.de<mailto:tobias.le...@telent.de> Internet: www.telent.de<http://www.telent.de> telent GmbH - ein Unternehmen der euomicron Gruppe, Sitz Backnang; Registergericht: Amtsgericht Stuttgart, HRB 738199 Geschäftsführung: Dr. Stefan Kindt, Hans-Peter Fischer, Robert Blum, Alexander Thome Am 09.12.2011 22:00, schrieb Alex: Deal all! I continue my experiments with SDL. I found some old thread somewhere and now I have a button-like image that switches its appearance when I hover over it (with the mouse). Here are the questions: a) Is the code attached the recommended way to do it or should it be done in another fashion? b) I would like to add an action, when someone clicks the button. In Tk-terminology, this would be a callback. Any suggestions on how I should do this? Best regards, Alex [code] #!perl package My::SimpleButton; use strict; use warnings; use SDL; use SDLx::Rect; use Data::Dumper qw/Dumper/; =head1 =cut sub new { my ($class,@params) = @_; my $self = {}; bless($self,$class); for(qw(ID APP X Y IMG IMGHV IMGPRESSED)){ $self->{$_} = shift(@params); } $self->{HV} = 0; $self->draw($self->{IMG}); return($self); } sub draw{ my ($self, $img) = @_; my $frame_rect = SDLx::Rect->new(0, 0, $img->width(), $img->height()); my $dest_rect = SDLx::Rect->new( $self->{X}, $self->{Y}, $img->width(), $img->height(), ); $self->{APP}->blit_by($img, [0, 0, $img->width(), $img->height()], [ $self->{X}, $self->{Y}, $img->width(), $img->height(), ]); $self->{APP}->update(); return 1; } sub check{ my ($self,$mx,$my,$event) = @_; my $img = $self->{IMG}; #Hover - Effekt if( $mx > $self->{X} && $mx < ($self->{X}+ $img->width) && $my > $self->{Y} && $my < ($self->{Y}+ $img->height) ){ if( !$self->{HV} ) { $self->{HV} = 1; $self->draw($self->{IMGHV}); } } else { if($self->{HV}) { $self->{HV}=0; $self->draw($self->{IMG}); } return 0; } return; } =head1 CREDITS c.f. L<http://www.perl-community.de/bat/poard/thread/7847><http://www.perl-community.de/bat/poard/thread/7847> =cut 1; # /My::SimpleButton use SDL; use SDLx::App; use SDL::Event; use SDL::Events; use SDLx::Surface; use SDL::Color; my $app = SDLx::App->new( w => 640, h => 400, exit_on_quit => 1, ); $app->add_event_handler( \&quit_event ); $app->add_event_handler( \&mnouseover ); my $img = SDLx::Surface->load( 'images/blueOpera_1.png' ); my $img2 = SDLx::Surface->load( 'images/blueOpera_2.png' ); my $img3 = SDLx::Surface->load( 'images/redOpera_2.png' ); my $SimpleButton = My::SimpleButton->new(1, $app, 65, 25, $img, $img2, $img3); $app->run(); sub quit_event { #The callback is provided a SDL::Event to use my $event = shift; #Each event handler also returns you back the Controller call it my $controller = shift; #Stopping the controller for us will exit $app->run() for us $controller->stop if $event->type == SDL_QUIT; } # /quit_event sub mnouseover { #The callback is provided a SDL::Event to use my $event = shift; #Each event handler also returns you back the Controller call it my $controller = shift; if( $event->type == SDL_MOUSEMOTION ) { my $click = $SimpleButton->check($event->motion_x, $event->motion_y,$event); } } # /mnouseover exit(0); [/code] Scanned by MailDefender - managed email security from intY - www.maildefender.net