發新話題
打印

[Ruby] 瑋岳的 wxRuby 學習筆記

推到噗浪
推到臉書

[Ruby] 瑋岳的 wxRuby 學習筆記

瑋岳的 wxRuby 學習筆記
wxRuby, a cross-platform GUI Library

0 預備動作
到 wxRuby 官方網站下載 [WxRuby One Click Installer] 及參閱相關教學文件。
wxRuby 官方網站: http://wxruby.rubyforge.org/wiki/wiki.pl

1 命名規則
wxRuby 是來自 wxWidgets ,所以看懂 wxWidgets 文件是很重要的。以下簡單概述此二者的命名差異。

wxWidgets
wxRuby
類別
型如 wx +(開頭大寫的單字)+(開頭大寫的單字)...,如 wxFrame 。
在引入 Wx 模組之後,類別名稱只剩 (開頭大寫的單字)+(開頭大寫的單字)...,如 Frame ,如果沒有引入模組名稱,則需加上 Wx::,如 Wx:: Frame 方式叫用。
方法型如 (開頭大寫的單字)+(開頭大寫的單字)...,如 AppendCheckItem 。型如 (小寫的單字)+(底線)+(小寫的單字)+ (底線)+...,如 append_ckeck_item ,如此為 Ruby 的一般變數命名風格。
內建函數
同類別,如 wxMessageBox 。
同方法,不過去除了 wx 的字頭,如 message_box ,如果沒有引入模組名稱,如果沒有引入模組名稱,則形如 Wx:: message_box 。
內建常數
同類別,如 wxDefaultPosition 。型如 (全部大寫的單字)+(底線)+(全部大寫的單字)+ (底線)+...,如 DEFAULT_POSITION ,如果沒有引入模組名稱,則形如 Wx:: DEFAULT_POSITION。
參考資料來源:http: //dot- gray.s33.xrea.com/index.xcg?page=wxRuby%A5%CD%A5%BF
Ruby 跟 C++ 先天上語法的差異:

C++
Ruby
建構元
方法名稱與類別同名
方法名稱 initialize
(學習忠告:Practice makes perfect.)

2 最簡單的範例

基本步驟如下:
  • require "wxruby"
  • include Wx (非必要性)建立繼承自 App 的類別 重寫 on_init() 建立延伸自 App 的物件
  • 呼叫該物件的 main_loop() 方法
範例:
複製內容到剪貼板
代碼:
require "wxruby"
include Wx
第一行,是一定要的啦!
第二行,就可有可無啦,如果不寫的話,後面很多地方就要加上 Wx:: 。
複製內容到剪貼板
代碼:
class MyApp < App
    def on_init()
        Frame.new(nil, -1, "超迷你範例").show()
    end
end
重新改寫繼承而來的的 Wx:: App ,當然複載 on_init() 是一定要的啦。
Frame 的建構元就要參考 wxWidgets 裡面 wxFrame:: wxFrame 的 API 啦,才知道參數列要擺蝦咪碗糕囉。
複製內容到剪貼板
代碼:
MyApp.new().main_loop()
為剛剛繼承而來的 Wx:: App 產生物件,然後呼叫 main_loop() 方法讓它開始運作吧。
(學習忠告:只需20%的知識,就可以完成80%的需求。努力吧,先學會這最主要的20%。)

3 對框架(Frame)來玩花樣

i. 在視窗左上角加上小圖示
  • Wx:: Frame 有個 set_icon 方法,可以設定視窗右上角的小圖示,不過它的參數是 Wx::Icon 型別的物件,請翻閱 wxWidgets API 參閱如何生成 Wx:: Icon 物件。
  • Wx:: RUBY_PLATFORM 可以判斷使用者平台是 "WXMSW" 或是 "WXGTK" 。
  • 事件觸發模式: evt_控制項名稱( 某控制項_ID ) { |event|  該怎樣處理} ;例如 evt_radiobox(ID_ICON) {|event| on_change_icon(event)} 就把責任丟給另一個方法 on_change_icon 去處理了。
  • Wx::Panel 與 Wx::RadioBox 物件的生成方法參見 wxWidgets 文件裡面該類別的建構元囉。
  • Wx:: Frame 及其延伸類別記得最後要 show 出來才看的到,如果肯定一生成就要 show 出來,那就擺在建構元裡面也好,省的漏掉。
  • case 語法複習。
  • .xpm 的圖示檔可以跨平台,可是 .ico 卻不行。
複製內容到剪貼板
代碼:
require "wxruby"
ID_ICON = 100
class IconFrame < Wx:: Frame
    def initialize
        super(nil, -1, "改變我的圖示吧!", Wx:: DEFAULT_POSITION, Wx:: Size.new(300,200))
        panel = Wx:: Panel.new(self,-1)
        icon_names = ["wxwin", "mondrian", "ogl", "smiley"]
        icons = Wx:: RadioBox.new(panel, ID_ICON, "圖示清單(&I)", Wx:: Point.new(20,5),
                              Wx:: DEFAULT_SIZE, icon_names, 1, Wx:: RA_SPECIFY_COLS)
        
        evt_radiobox(ID_ICON) do |event|
            on_change_icon(event)
        end
        
        if Wx:: RUBY_PLATFORM == "WXMSW"
            set_icon(Wx:: Icon.new("./icons/wxwin.ico"))
        else
            set_icon(Wx:: Icon.new("./icons/wxwin16x16.xpm"))
        end
        
        show(true)
    end
        
    def on_change_icon(event)
        if Wx:: RUBY_PLATFORM == "WXMSW"
            case event.get_int
                when 0
                    set_icon(Wx:: Icon.new("./icons/wxwin.ico"))
                when 1
                    set_icon(Wx:: Icon.new("./icons/mondrian.ico"))
                when 2
                    set_icon(Wx:: Icon.new("./icons/ogl.ico"))
                when 3
                    set_icon(Wx:: Icon.new("./icons/smiley.ico"))
            end
        else
            case event.get_int
                when 0
                    set_icon(Wx:: Icon.new("./icons/wxwin16x16.xpm"))
                when 1
                    set_icon(Wx:: Icon.new("./icons/mondrian.xpm"))
                when 2
                    set_icon(Wx:: Icon.new("./icons/ogl.xpm"))
                when 3
                    set_icon(Wx:: Icon.new("./icons/smiley.xpm"))
            end
        end
    end
end
            
class MyApp < Wx:: App
    def on_init
        IconFrame.new
    end
end
MyApp.new.main_loop
ii. 視窗風格
iii. 觸發事件的處理
2004/10/23, 2:15 a.m.

TOP

2004/10/25 我入伍當兵,在那之前也不知道味蝦咪,就這樣迷上 Ruby ,還找了幾本原文書來啃,
一股傻勁就讓我寫個 wxRuby 的學習筆記,不過後來才開始寫就看到 wxRuby 官網說要用 swig 整個
改寫掉,wxRuby2 一直沒出來, Ruby 1.8 的 VM 效率也沒有很好,我想說乾脆也等 Ruby 2.0 出來
好了。就這樣,也可能是因為在外島當兵,這東西一放就放了兩年了,最近也不想去碰了,哈。
留著就當作是當兵前時代的紀念吧!



有興趣的可以瀏覽其他網站的相關資料:

1. Ruby X wxWidgets
  http://rubyxwxwidgets.wikidot.com/

2. 快快樂樂寫 Ruby
  http://blog.roodo.com/powerruby

TOP

發新話題
最近訪問的版塊