# starts a selection rectangle
#
proc CanvasSelectStart {win x y} {
global Canvas
# create a rectangle at the origin:
$win create rectangle $x $y $x $y -width 1 -tags selRect
# remember origin:
set Canvas(selX) $x
set Canvas(selY) $y
}
# expands an existing selection rectangle
#
proc CanvasSelectExpand {win x y} {
global Canvas
# set the opposite corner of the selection rectangle
# to the current cursor location:
$win coords selRect $Canvas(selX) $Canvas(selY) $x $y
}
# finishes an existing selection rectangle
# and does something with all items inside the selection
#
proc CanvasSelectEnd {win x y} {
global Canvas
# adjust selection rectangle to the current position:
CanvasSelectExpand $win $x $y
# find id of selection rectangle:
set id [$win find withtag selRect]
# and give it a gray outline:
$win itemconfigure selRect -outline gray
# now delete the tag for the next selections:
$win dtag selRect
# get the ids off all overlapping items:
# (we could also get all 'enclosed' items or do other things here)
set selection [$win find overlapping $Canvas(selX) $Canvas(selY) $x $y]
# finally do something with all these items:
# (Here, I just give them a red filling, if they are not the
# selection rectangle and if they know about -fill at all ...)
foreach item $selection {
set type [$win type $item]
if {$item != $id && $type != "bitmap" && \
$type != "image" && \
$type != "window"} {
$win itemconfigure $item -fill red
}
}
}
# build a simple canvas ...
canvas .c -background white
pack .c
# ... and bind the procedures to the corresponding mouse actions:
# - Pressing the left mouse button start a selection
# - Dragging the mouse with mouse button pressed expands the selection
# - Releasing the mouse button finishes the selection
#
bind .c <ButtonPress-1> {CanvasSelectStart %W %x %y}
bind .c <B1-Motion> {CanvasSelectExpand %W %x %y}
bind .c <ButtonRelease-1> {CanvasSelectEnd %W %x %y}See also Canvas rectangle marking
TS See also Canvas lasso selection
gold added pix and some categories

