ruler.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # ruler.tcl --
  2. #
  3. # This demonstration script creates a canvas widget that displays a ruler
  4. # with tab stops that can be set, moved, and deleted.
  5. #
  6. # RCS: @(#) $Id: ruler.tcl,v 1.3 2001/06/14 10:56:58 dkf Exp $
  7. if {![info exists widgetDemo]} {
  8.     error "This script should be run from the "widget" demo."
  9. }
  10. # rulerMkTab --
  11. # This procedure creates a new triangular polygon in a canvas to
  12. # represent a tab stop.
  13. #
  14. # Arguments:
  15. # c - The canvas window.
  16. # x, y - Coordinates at which to create the tab stop.
  17. proc rulerMkTab {c x y} {
  18.     upvar #0 demo_rulerInfo v
  19.     $c create polygon $x $y [expr {$x+$v(size)}] [expr {$y+$v(size)}] 
  20.     [expr {$x-$v(size)}] [expr {$y+$v(size)}]
  21. }
  22. set w .ruler
  23. global tk_library
  24. catch {destroy $w}
  25. toplevel $w
  26. wm title $w "Ruler Demonstration"
  27. wm iconname $w "ruler"
  28. positionWindow $w
  29. set c $w.c
  30. label $w.msg -font $font -wraplength 5i -justify left -text "This canvas widget shows a mock-up of a ruler.  You can create tab stops by dragging them out of the well to the right of the ruler.  You can also drag existing tab stops.  If you drag a tab stop far enough up or down so that it turns dim, it will be deleted when you release the mouse button."
  31. pack $w.msg -side top
  32. frame $w.buttons
  33. pack $w.buttons -side bottom -fill x -pady 2m
  34. button $w.buttons.dismiss -text Dismiss -command "destroy $w"
  35. button $w.buttons.code -text "See Code" -command "showCode $w"
  36. pack $w.buttons.dismiss $w.buttons.code -side left -expand 1
  37. canvas $c -width 14.8c -height 2.5c
  38. pack $w.c -side top -fill x
  39. set demo_rulerInfo(grid) .25c
  40. set demo_rulerInfo(left) [winfo fpixels $c 1c]
  41. set demo_rulerInfo(right) [winfo fpixels $c 13c]
  42. set demo_rulerInfo(top) [winfo fpixels $c 1c]
  43. set demo_rulerInfo(bottom) [winfo fpixels $c 1.5c]
  44. set demo_rulerInfo(size) [winfo fpixels $c .2c]
  45. set demo_rulerInfo(normalStyle) "-fill black"
  46. if {[winfo depth $c] > 1} {
  47.     set demo_rulerInfo(activeStyle) "-fill red -stipple {}"
  48.     set demo_rulerInfo(deleteStyle) [list -fill red 
  49.     -stipple @[file join $tk_library demos images gray25.bmp]]
  50. } else {
  51.     set demo_rulerInfo(activeStyle) "-fill black -stipple {}"
  52.     set demo_rulerInfo(deleteStyle) [list -fill black 
  53.     -stipple @[file join $tk_library demos images gray25.bmp]]
  54. }
  55. $c create line 1c 0.5c 1c 1c 13c 1c 13c 0.5c -width 1
  56. for {set i 0} {$i < 12} {incr i} {
  57.     set x [expr {$i+1}]
  58.     $c create line ${x}c 1c ${x}c 0.6c -width 1
  59.     $c create line $x.25c 1c $x.25c 0.8c -width 1
  60.     $c create line $x.5c 1c $x.5c 0.7c -width 1
  61.     $c create line $x.75c 1c $x.75c 0.8c -width 1
  62.     $c create text $x.15c .75c -text $i -anchor sw
  63. }
  64. $c addtag well withtag [$c create rect 13.2c 1c 13.8c 0.5c 
  65. -outline black -fill [lindex [$c config -bg] 4]]
  66. $c addtag well withtag [rulerMkTab $c [winfo pixels $c 13.5c] 
  67. [winfo pixels $c .65c]]
  68. $c bind well <1> "rulerNewTab $c %x %y"
  69. $c bind tab <1> "rulerSelectTab $c %x %y"
  70. bind $c <B1-Motion> "rulerMoveTab $c %x %y"
  71. bind $c <Any-ButtonRelease-1> "rulerReleaseTab $c"
  72. # rulerNewTab --
  73. # Does all the work of creating a tab stop, including creating the
  74. # triangle object and adding tags to it to give it tab behavior.
  75. #
  76. # Arguments:
  77. # c - The canvas window.
  78. # x, y - The coordinates of the tab stop.
  79. proc rulerNewTab {c x y} {
  80.     upvar #0 demo_rulerInfo v
  81.     $c addtag active withtag [rulerMkTab $c $x $y]
  82.     $c addtag tab withtag active
  83.     set v(x) $x
  84.     set v(y) $y
  85.     rulerMoveTab $c $x $y
  86. }
  87. # rulerSelectTab --
  88. # This procedure is invoked when mouse button 1 is pressed over
  89. # a tab.  It remembers information about the tab so that it can
  90. # be dragged interactively.
  91. #
  92. # Arguments:
  93. # c - The canvas widget.
  94. # x, y - The coordinates of the mouse (identifies the point by
  95. # which the tab was picked up for dragging).
  96. proc rulerSelectTab {c x y} {
  97.     upvar #0 demo_rulerInfo v
  98.     set v(x) [$c canvasx $x $v(grid)]
  99.     set v(y) [expr {$v(top)+2}]
  100.     $c addtag active withtag current
  101.     eval "$c itemconf active $v(activeStyle)"
  102.     $c raise active
  103. }
  104. # rulerMoveTab --
  105. # This procedure is invoked during mouse motion events to drag a tab.
  106. # It adjusts the position of the tab, and changes its appearance if
  107. # it is about to be dragged out of the ruler.
  108. #
  109. # Arguments:
  110. # c - The canvas widget.
  111. # x, y - The coordinates of the mouse.
  112. proc rulerMoveTab {c x y} {
  113.     upvar #0 demo_rulerInfo v
  114.     if {[$c find withtag active] == ""} {
  115. return
  116.     }
  117.     set cx [$c canvasx $x $v(grid)]
  118.     set cy [$c canvasy $y]
  119.     if {$cx < $v(left)} {
  120. set cx $v(left)
  121.     }
  122.     if {$cx > $v(right)} {
  123. set cx $v(right)
  124.     }
  125.     if {($cy >= $v(top)) && ($cy <= $v(bottom))} {
  126. set cy [expr {$v(top)+2}]
  127. eval "$c itemconf active $v(activeStyle)"
  128.     } else {
  129. set cy [expr {$cy-$v(size)-2}]
  130. eval "$c itemconf active $v(deleteStyle)"
  131.     }
  132.     $c move active [expr {$cx-$v(x)}] [expr {$cy-$v(y)}]
  133.     set v(x) $cx
  134.     set v(y) $cy
  135. }
  136. # rulerReleaseTab --
  137. # This procedure is invoked during button release events that end
  138. # a tab drag operation.  It deselects the tab and deletes the tab if
  139. # it was dragged out of the ruler.
  140. #
  141. # Arguments:
  142. # c - The canvas widget.
  143. # x, y - The coordinates of the mouse.
  144. proc rulerReleaseTab c {
  145.     upvar #0 demo_rulerInfo v
  146.     if {[$c find withtag active] == {}} {
  147. return
  148.     }
  149.     if {$v(y) != $v(top)+2} {
  150. $c delete active
  151.     } else {
  152. eval "$c itemconf active $v(normalStyle)"
  153. $c dtag active
  154.     }
  155. }