wingui.rbに機能追加した

winguiRuby改め、wingui.rb。
ちょっとした思い付きで、ウィンドウを新規作成するだけではなく、ウィンドウハンドルを渡してサブクラス化する機能を追加してみた。
これが思った以上にうまく動き、予想外に面白い効果を得ることができた。
具体的には以下のようなコードが書ける。

#! ruby -Ks
require 'dxruby'
require 'wingui'

class Form1 < Form
  def init
    m1 = Menu.new
    m1.addMenuItem("open", "開く(&O)")
    m1.addMenuItem("close", "閉じる(&C)")
    m = Menu.new
    m.addMenuItem("file", "ファイル(&F)", m1)
    addMenu("menu1", m)
  end

  def form1_Update
    Window.update
  end

  def menu1_open_Click
    LIBC::messageBox(self.hWnd, "開くおした", "open clicked", 0)
  end

  def menu1_close_Click
    self.close
  end
end

Window.width = 320
Window.height = 240
Window.create
form = Form1.new(Window.hWnd) # DXRubyのウィンドウをサブクラス化

Window.bgcolor = [192, 192, 192]
image = Image.new(30, 30).line(15, 0, 15, 29, [0, 0, 0])
angle = 0

loop do
  break if Input.update
  angle += 5
  Window.drawRot(Window.width - 40, Window.height - 40, image, angle)
  Window.sync
  Window.update
end

上半分はFormクラスでウィンドウの定義。
下半分はDXRubyで右下で線をくるくる回す。
実行結果はこんな感じ。

DXRubyとwingui.rbの連携である。
wingui.rbでフォームのクラスを作成し、DXRubyで作ったウィンドウをサブクラス化する。
メッセージループはDXRubyが持っているが、それで呼ばれるウィンドウプロシージャはwingui.rbがフックしていて、メニューなどのクリックを拾ってイベントを発生させることができる。
この例ではDXRubyの普通のプログラムに1行、サブクラス化するコードを追加するだけで、DXRubyのアプリケーションにメニューが付き、選択されたときのメソッドが動くようになる。
逆に、Windowsアプリっぽくイベントドリブンで作って、描画のみをDXRubyで行うという作り方もおそらくできる。
こっちのほうはWM_PAINTまわりの動きやDXRubyの描画の仕組みが理解できていないと描画がうまくいかなったりするから、手軽に作れるような機能が必要かもしれない。


もう少し柔軟に便利に使えるようにするにはwingui.rbにもDXRubyにも修正が必要だが、とりあえずDXRubyをツール開発に使うという、前から考えていて頓挫したネタに新たな風を吹き込むことにはなるだろう。


機能追加したwingui.rbとサンプルはこちら。
http://dxruby.sourceforge.jp/files/wingui.zip