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