Thread Tk-Canvas -> Objekt begrenzt verschieben
(1 answers)
Opened by Kean at 2011-01-11 16:23
Ich habe ein kleines Script in dem ich ein Canvas erzeuge und in diesem Canvas ein Bild und ein Rechteck.
Jetzt hätte ich gerne, dass das Rechteck (welches immer kleiner ist wie das Bild) sich nur innerhalb des Bildes UND des Canvas (also dem sichtbaren Bereich) bewegen kann. Hier mein bisheriger Code: 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 use strict; use warnings; use Tk; use Tk::Canvas; use Tk::CursorControl; require Tk::PNG; my ( $X, $Y, $dx, $dy, $BNr ); my $schiebeauswahl = ""; my $mw = MainWindow->new(); my $cControl = $mw->CursorControl; my $canvas = $mw->Canvas(-width => 640, -height => 480, -background => "#c0c0c0")->grid(-row=>1, -column=>0, -columnspan=>10 ); my $image_in = $canvas->Photo( -file => 'background.png', -format => 'png' ); my $picture = $canvas->createImage(0,0,-image => $image_in, -anchor => "nw", -tags => "picture"); my $rahmen = $canvas->createRectangle(2, 2, 168, 202, -width => 2, -outline => "#0f0", -tags => "rectangle"); $canvas->Tk::bind( '<ButtonPress-1>', sub { $schiebeauswahl = 'rectangle'; $BNr = 1; startmove(); } ); $canvas->Tk::bind( '<ButtonRelease-1>', sub { $schiebeauswahl = 'rectangle'; $BNr = 1; endmove(); } ); $canvas->Tk::bind( '<ButtonPress-3>', sub { $schiebeauswahl = 'picture'; $BNr = 3; startmove(); } ); $canvas->Tk::bind( '<ButtonRelease-3>', sub { $schiebeauswahl = 'picture'; $BNr = 3; endmove(); } ); MainLoop; sub startmove { return unless ( $canvas->gettags('current') ); my $ev = $canvas->XEvent; ( $X, $Y ) = ( $ev->x, $ev->y ); $canvas->Tk::bind( '<B'.$BNr.'-Motion>', \&moveit ); $canvas->raise( 'rectangle', 'all' ); } sub moveit { my $ev = $canvas->XEvent; my ( $cx, $cy ) = ( $ev->x, $ev->y ); ( $dx, $dy ) = ( $cx - $X, $cy - $Y ); $canvas->move( $schiebeauswahl, $dx, $dy ); ( $X, $Y ) = ( $cx, $cy ); } sub endmove { return unless ( $canvas->gettags('current') ); my $ev = $canvas->XEvent; my ( $cx, $cy ) = ( $ev->x, $ev->y ); ( $dx, $dy ) = ( $cx - $X, $cy - $Y ); $canvas->move( $schiebeauswahl, $dx, $dy ); undef($X); undef($Y); $canvas->Tk::bind( '<B'.$BNr.'-Motion>', '' ); } Ich denke ich muss das irgendwie in die moveit Routine einbauen, hab aber leider keine idee wie. Kann mir da vielleicht jemand einen Tipp geben? |