得体の知れないもの作成中

途中で飽きてやめる可能性大ではあるが。
SoundEffectで簡単な音を作るGUIツールを作ろうと思ってプログラムをいじり始めたところ、汎用の簡易GUIフレームワークとか作れるんじゃね?みたいな感じで。

とりあえずウィンドウらしきものを作って、タイトルバーらしきものをドラッグして動かせる。
つもりだったのだが、いまのところ思いっきりバグっていて、カーソルを速く動かしたらウィンドウがついてこない。
ウィンドウの移動はウィンドウのクラスでやるならWin32APIで言うマウスのキャプチャみたいな機能が必要だし、そうでなければシステム側でやらないといけないということなのだろう。
っていうか作りかけすぎてあちこちボロボロだw
なんでこんなものをソース公開してるんだか。
いいじゃない、作りかけのソフトってこんな感じなのだ。
DXRubyだって最初は笑っちゃうほどひどいものだったんだぞ。

require 'dxruby'

class CWindow
  attr_accessor :x, :y, :width, :height, :control
  def initialize(x = 128, y = 128 , width = 128, height = 128, title = "")
    @x = x
    @y = y
    @width = width + 4
    @height = height + 4 + 16
    @image = Image.new(width, height, [255, 128, 128, 128])
    @image.boxFill(0, 0, width-2, 1, [255, 180, 180, 180])
    @image.boxFill(0, 0, 1, height-2, [255, 180, 180, 180])
    @image.boxFill(width-2, 2, width-1, height-1, [255, 80, 80, 80])
    @image.boxFill(2, height-2, width-1, height-1, [255, 80, 80, 80])
    @title = title
    @control = []
    @drag = false
  end

  def internal_onmouse(x, y)
    if Input.mousePush?(M_LBUTTON)
      if y < @y + 18
        @drag = true
        @oldx = x
        @oldy = y
      else
        onMousePushL(x, y)
      end
    end

    if @drag
      if Input.mouseDown?(M_LBUTTON)
        @x += x - @oldx
        @y += y - @oldy
        @oldx = x
        @oldy = y
      else
        @drag = false
      end
    end
  end

  def internal_update
    Window.draw(@x, @y, @image)
    Window.drawFont(@x+3, @y+3, @title, App.font)
    update
  end

  def update
  end

  def onMousePushL(x, y)
  end
end

class CApp
  attr_accessor :windows, :font
  def initialize
    @windows = []
    @font = Font.new(16)
  end

  def run
    Window.create
    loop do
      sleep(0.01)
      break if Input.update
      flag = false
      x, y = Input.mousePosX, Input.mousePosY
      @windows.reverse.each do |window|
        if x >= window.x and x < window.x + window.width and y >= window.y and y < window.y + window.height
          window.internal_onmouse(x, y)
        end
      end
      update
      Window.update
    end
  end

  def update
    @windows.each do |window|
      window.internal_update
    end
  end

  def createWindow(window)
    @windows.push(window)
  end
end


App = CApp.new
App.createWindow(CWindow.new(100, 100, 200, 200, "たいとる"))
App.run