From: Hidetoshi NAGAI Date: 2007-05-23T00:54:56+09:00 Subject: [ruby-list:43557] Re: Ruby/Tk:ドラッグによる範囲選択 永井@知能.九工大です. From: 山崎雄介 Subject: [ruby-list:43554] Ruby/Tk:ドラッグによる範囲選択 Date: Tue, 22 May 2007 14:25:17 +0900 Message-ID: <20070522132847.31F1.Y-YAMASAKI@saeilo.co.jp> > Ruby/Tkのウィジェットを並べて表を作っています。 > Excelのようなマウスのドラッグによる範囲選択を実現したいのですが、 > バインドでつまづいています。 TkTable 拡張を利用すべきではないかという気もしますが, 標準の Tk の範囲で行うなら Grid ジオメトリマネージャの location コマンドを用いると良さそうです. 起点 (drag 開始位置) の [colum, row] と 終点 (button release 位置の [colum, row] とがわかれば, 後は何とでもできますよね? というわけで,次のような戦略ではいかがでしょう? 土台となる frame widget 上での座標を求め, それにより [colum, row] を得ています. ------------------------------------------------------ require 'tk' cols = 4 rows = 6 f = TkFrame.new.pack btag = TkBindTag.new mark_loc = [0,0] btag.bind('1', '%W %x %y'){|w, x, y| # drag 範囲の起点 mark_loc = f.grid_location(w.winfo_x + x, w.winfo_y + y) } btag.bind('B1-Motion', '%W %x %y'){|w, x, y| # drag 範囲の終点 p [mark_loc, f.grid_location(w.winfo_x + x, w.winfo_y + y)] } ary = (0..(rows-1)).collect{|row| (0..(cols-1)).collect{|col| TkEntry.new(f){|w| w.bindtags_unshift(btag)} } } ary.each{|row| Tk.grid(*row)} Tk.mainloop ------------------------------------------------------ -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp