瑋岳的 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.