2013年12月19日

WSCheckBox

DXRubyWSでコントロールを作ろう第二段! 今回はチェックボックスを作ってみました。

    # クリックされた場合真偽値を入れ替える
    def on_click(tx, ty)
      @data = !@data
      super
    end 

trueとfalseを入れ替えるだけなので処理の実体はこの四行だけです。
他は全部描画関係です。
説明以上!

以下ソース


# coding: utf-8

module WS
  class WSCheckBox < WSControl
    
    # 定数
    C_CBBASE  = [255,255,255]
    C_CBLINES = [80,80,80]
    C_CBLINEM = [160,160,160]
    C_CBLINEH = [240,240,240]
    C_CHECK   = [  0,  0,  0]
    
    # 公開インスタンス
    attr_accessor :caption, :fore_color, :data

    # Mix-In
    include Focusable
    include ButtonClickable
    
    def initialize(tx, ty, width, caption = "")
      super(tx, ty, width, 16)
      @image      = {}
      @data       = false
      @caption    = caption
      @fore_color = C_BLACK
      # 画像を作成する
      set_image
    end
    
    # チェックボックスの画像を設定
    def set_image
      sx = 1
      sy = 1
      ex = 14
      ey = 14
      @image[false] = Image.new(16, 16)
                     .line(sx, sy, sx, ey, C_CBLINES)
                     .line(sx, sy+1 , ex, sy+1 , C_CBLINES)
                     .line(sx, sy , ex, sy, C_CBLINES)
                     .line(sx+1, sy ,sx+1, ey, C_CBLINES)
                     .line(sx+1,ey-1,ex-1,ey-1, C_CBLINEM)
                     .line(sx, ey, ex, ey, C_CBLINEH)
                     .line(ex-1, sy+1, ex-1, ey-1, C_CBLINEM)
                     .line(ex, sy, ex, ey, C_CBLINEH)
                     .box_fill(sx+2, sy+2, ex-2, ey-2, C_CBBASE)
                     
      @image[true] = Image.new(16, 16)
                     .line(sx, sy, sx, ey, C_CBLINES)
                     .line(sx, sy+1 , ex, sy+1 , C_CBLINES)
                     .line(sx, sy , ex, sy, C_CBLINES)
                     .line(sx+1, sy ,sx+1, ey, C_CBLINES)
                     .line(sx+1,ey-1,ex-1,ey-1, C_CBLINEM)
                     .line(sx, ey, ex, ey, C_CBLINEH)
                     .line(ex-1, sy+1, ex-1, ey-1, C_CBLINEM)
                     .line(ex, sy, ex, ey, C_CBLINEH)
                     .box_fill(sx+2, sy+2, ex-2, ey-2, C_CBBASE)
                     .line(sx+3, ey-5, sx+5, ey-3, C_CHECK)
                     .line(sx+3, ey-6, sx+5, ey-4, C_CHECK)
                     .line(sx+3, ey-7, sx+5, ey-5, C_CHECK)
                     .line(sx+3, ey-8, sx+5, ey-6, C_CHECK)
                     .line(sx+6, ey-4, ex-3, ey-8, C_CHECK)
                     .line(sx+6, ey-5, ex-3, ey-9, C_CHECK)
                     .line(sx+6, ey-6, ex-3, ey-10, C_CHECK)
                     .line(sx+6, ey-7, ex-3, ey-11, C_CHECK)
    end
    
    ### イベント ###
    # クリックされた場合真偽値を入れ替える
    def on_click(tx, ty)
      @data = !@data
      super
    end 

    ### 描画 ###    
    def draw
      # コントロールの状態を参照して画像を変更
      self.image = @image[@data]
      super
      # キャプションを描画
      if @caption.length > 0
        width = @font.get_width(@caption)
        self.target.draw_font(self.x + 20 , self.y , @caption, @font, :color=>@fore_color)
      end
    end
  end
end

 


posted by 鳴海つかさ at 20:18| Comment(0) | TrackBack(0) | DXRuby
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/82817496

この記事へのトラックバック