FxRuby part2
接上一篇:FxRuby初体验Part1
本书的入门例子是个相册管理的桌面应用,名曰Picture Book。这个例子书中用了5 Chapter(2-6)来讲,基本讲到了常用的Gui组件。
不废话现在来看看代码,下面是第一个版本的Picture Book App:
#photo.rb
class Photo
attr_reader :path
def initialize(path)
@path = path
end
end
#album.rb
class Album
attr_reader :title
def initialize(title)
@title = title
@photos = []
end
def add_photo(photo)
@photos << photo
end
def each_photo
@photos.each { |photo| yield photo }
end
end
#album_list.rb
class AlbumList
def initialize
@albums = []
end
def add_album(album)
@albums << album
end
def remove_album(album)
@albums.delete(album)
end
def each_album
@albums.each { |album| yield album }
end
end
#photo_view.rb
class PhotoView < FXImageFrame
def initialize(p, photo)
super(p, nil)
load_image(photo.path)
end
def load_image(path)
File.open(path, "rb" ) do |io|
self.image = FXJPGImage.new(app, io.read)
end
end
end
#picturebook.rb
require 'fox16'
include Fox
require 'photo'
require 'photo_view'
class PictureBook < FXMainWindow
def initialize(app)
super(app, "Picture Book" , :width => 600, :height => 400)
photo = Photo.new("shoe.jpg" )
photo_view = PhotoView.new(self, photo)
end
def create
super
show(PLACEMENT_SCREEN)
end
end
if __FILE__ == $0
FXApp.new do |app|
PictureBook.new(app)
app.create
app.run
end
end
这是个V0.1的版本。不过你从中看出这个应用写得很MVC。
Model部分就是Photo,Album,AlbumList三个,Controller部分(当然它还没有细化)就是PictureBook,View部分就是PhotoView。就是如此清晰的结构,我想如果是正在学着什么MFC的可怜人儿们看到了之后会把那本什么深入浅出MFC扔了吧。
对比那个HelloWorld,这堆代码除了多了几个普通的Ruby Class(扮演Model的那几个)外,就是多了一个继承自FXImageFrame的PhotoView,还有在FXMainWindow的构造方法中多了对PhotoView的实例化,实例化时将其自身挂钩到PictureBook(构造方法的第一个参数)。之后在App实例化后会实例化MainWindow,接着实例化MainWindow包含的组件,比如PhotoView这个FxImageFrame。PhotoView中对图片的包装是这样的,它先读入Photo的路径,然后用FxImage组件对图片进行包装,然后保存为自己的一个实例变量image中。
PictureBook的第一个版本就是这样。
接着下一篇讲下个版本和下下篇讲下下个版本,然后就介绍完了。
- Previous: FxRuby part1
- Next: FxRuby Part3