Math Pro 數學補給站's Archiver

weiye 發表於 2006-11-8 03:07 AM

[Ruby] 瑋岳的 wxRuby 學習筆記

[b][size=7]瑋岳的 wxRuby 學習筆記
[/size][/b]wxRuby, a cross-platform GUI Library

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

[b]1 命名規則[/b]
wxRuby 是來自 wxWidgets ,所以看懂 wxWidgets 文件是很重要的。以下簡單概述此二者的命名差異。[table=98%][tr][td]
[/td][td]wxWidgets
[/td][td]wxRuby
[/td][/tr][tr][td]類別
[/td][td]型如 [color=#ff00]wx +(開頭大寫的單字)+(開頭大寫的單字)...[/color],如 wxFrame 。
[/td][td]在引入 Wx 模組之後,類別名稱只剩 [color=#ff00](開頭大寫的單字)+(開頭大寫的單字)...[/color],如 Frame ,如果沒有引入模組名稱,則需加上 [color=#ff00]Wx::[/color],如 Wx:: Frame 方式叫用。
[/td][/tr][tr][td]方法[/td][td]型如 [color=#ff00](開頭大寫的單字)+(開頭大寫的單字)...[/color],如 AppendCheckItem 。[/td][td]型如 [color=#ff00](小寫的單字)+(底線)+(小寫的單字)+ (底線)+...[/color],如 append_ckeck_item ,如此為 Ruby 的一般變數命名風格。
[/td][/tr][tr][td]內建函數
[/td][td]同類別,如 wxMessageBox 。
[/td][td]同方法,不過去除了 wx 的字頭,如 message_box ,如果沒有引入模組名稱,如果沒有引入模組名稱,則形如 Wx:: message_box 。
[/td][/tr][tr][td]內建常數
[/td][td]同類別,如 wxDefaultPosition 。[/td][td]型如 [color=#ff00](全部大寫的單字)+(底線)+(全部大寫的單字)+ (底線)+...[/color],如 DEFAULT_POSITION ,如果沒有引入模組名稱,則形如 Wx:: DEFAULT_POSITION。
[/td][/tr][tr][td=3,1]參考資料來源:http: //dot- gray.s33.xrea.com/index.xcg?page=wxRuby%A5%CD%A5%BF
[/td][/tr][/table]Ruby 跟 C++ 先天上語法的差異:[table=98%][tr][td]
[/td][td]C++
[/td][td]Ruby
[/td][/tr][tr][td]建構元
[/td][td]方法名稱與類別同名
[/td][td]方法名稱 initialize
[/td][/tr][/table](學習忠告:Practice makes perfect.)

[b]2 最簡單的範例[/b]

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

[b]3 對框架(Frame)來玩花樣[/b]

i. 在視窗左上角加上小圖示
[list][*]Wx:: Frame 有個 set_icon 方法,可以設定視窗右上角的小圖示,不過它的參數是 Wx::Icon 型別的物件,請翻閱 wxWidgets API 參閱如何生成 Wx:: Icon 物件。[*]Wx:: RUBY_PLATFORM 可以判斷使用者平台是 "WXMSW" 或是 "WXGTK" 。[*]事件觸發模式: [color=#ff00]evt_控制項名稱( 某控制項_ID ) { |event|  該怎樣處理}[/color] ;例如 evt_radiobox(ID_ICON) {|event| on_change_icon(event)} 就把責任丟給另一個方法 on_change_icon 去處理了。[*]Wx::Panel 與 Wx::RadioBox 物件的生成方法參見 wxWidgets 文件裡面該類別的建構元囉。[*]Wx:: Frame 及其延伸類別記得最後要 show 出來才看的到,如果肯定一生成就要 show 出來,那就擺在建構元裡面也好,省的漏掉。[*]case 語法複習。[*].xpm 的圖示檔可以跨平台,可是 .ico 卻不行。[/list][table=98%][tr][td][code]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[/code][/td][/tr][/table]ii. 視窗風格
iii. 觸發事件的處理
2004/10/23, 2:15 a.m.

weiye 發表於 2006-11-8 03:13 AM

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



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

1. Ruby X wxWidgets
  [url=http://rubyxwxwidgets.wikidot.com/]http://rubyxwxwidgets.wikidot.com/[/url]

2. 快快樂樂寫 Ruby
  [url=http://blog.roodo.com/powerruby]http://blog.roodo.com/powerruby[/url]

頁: [1]

論壇程式使用 Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.