Thread Tk-Canvas -> Objekt begrenzt verschieben (1 answers)
Opened by Kean at 2011-01-11 16:23

Kean
 2011-01-11 16:23
#144502 #144502
User since
2004-08-18
463 Artikel
BenutzerIn

user image
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?

View full thread Tk-Canvas -> Objekt begrenzt verschieben