#!ruby # -*- mode: ruby; coding: utf-8 -*- # Last updated: <2016/01/16 21:41:52 +0900> # # 画像を読み込んで表示してみるテスト # スクロールバーを追加してみる require_relative 'lib/dxrubyws' require_relative 'lib/standardgui' module WS # 画像選択ウインドウクラス class ImageSelectWindow < WSWindow # コンストラクタ。初期化処理 def initialize(*args) super # ボタンを生成して登録 x, y, w, h = 4, 4, 120, 24 @btn = WSButton.new(x, y, w, h, "画像読み込み") client.add_control(@btn) @btn.add_handler(:click, self.method(:on_click)) # タイトルバー上の閉じるボタンを無効化 self.window_title.close_button = false # ESCキーで閉じないようにする @key_handler.delete(K_ESCAPE) # 次のウインドウ発生位置 @x_pos = self.x @y_pos = self.y + self.height end # ボタンを押した時の処理 def on_click(obj, tx, ty) # ファイル選択ダイアログを開いてみる filters = [ ["画像ファイル(*.png;*.jpg;*.bmp)", "*.png;*.jpg;*.bmp"], ["すべてのファイル(*.*)", "*.*"] ] filepath = Window.openFilename(filters, "画像ファイルを選択") create_image_window(filepath) if filepath end # 画像を表示するウインドウを生成して画面に追加 def create_image_window(filepath) img = Image.load(filepath) w, h = img.width, img.height bsname = File.basename(filepath) wdw = WS::ImageWithScrollBarWindow.new(@x_pos, @y_pos, 320, 240, bsname) wdw.set_image(img) WS.desktop.add_control(wdw) @x_pos += 32 @y_pos += 32 end end # 画像を表示するだけのウインドウクラス class ImageWithScrollBarWindow < WSWindow attr_accessor :image def initialize(*args) super @v_pos = 0 @h_pos = 0 @image = Image.new(512, 512) w, h = self.width, self.height # 縦スクロールバー vsb = WSVScrollBar.new(w - 20, 0, 16, h) client.add_control(vsb, :vsb) vsb.total_size = 512 + 16 # 全体サイズ vsb.shift_qty = 32 # ボタンを押した時に動く量 vsb.view_size = client.height # 表示範囲 # スライダーを動かした時の処理 vsb.add_handler(:slide) { |obj, pos| @v_pos = pos } # 横スクロールバー hsb = WSHScrollBar.new(0, h - 20, w - 16, 16) client.add_control(hsb, :hsb) hsb.total_size = 512 + 16 # 全体サイズ hsb.shift_qty = 32 # ボタンを押した時に動く量 hsb.view_size = client.width # 表示範囲 # スライダーを動かした時の処理 hsb.add_handler(:slide) { |obj, pos| @h_pos = pos } # 画像 wsimg = WSImage.new(0, 0, 512, 512) wsimg.image = RenderTarget.new(512, 512) client.add_control(wsimg, :wsimg) # リサイズされた時の処理 wsimg.add_handler(:resize) do wsimg.image.resize(wsimg.width, wsimg.height) hsb.view_size = client.width vsb.view_size = client.height end # マウスホイール入力時の処理 wsimg.add_handler(:mouse_wheel_up) { vsb.slide(-32 * 3) } wsimg.add_handler(:mouse_wheel_down) { vsb.slide(32 * 3) } # オートレイアウトで画像表示部やスクロールバーを調整してもらう client.layout(:vbox) do # 縦方向に並べる layout(:hbox) do # 横方向に並べる add wsimg, true, true # 横サイズも縦サイズも可変 add vsb, false, true # 横サイズは固定、縦サイズは可変 end add hsb, true, false # 横サイズは可変、縦サイズは固定 end end # 画像を設定 def set_image(img) @image = img # スクロールバーに与える全体サイズ値を更新 client.hsb.total_size = img.width + 16 client.vsb.total_size = img.height + 16 end # renderをオーバーライドすれば描画されるが、 # drawをオーバーライドすると描画されない def render client.wsimg.image.draw(-@h_pos, -@v_pos, @image) super end end end Window.width, Window.height = 1024, 600 wdw = WS::ImageSelectWindow.new(8, 8, 200, 56, "ImageSelectWindow") WS.desktop.add_control(wdw) Window.loop do WS.update end