FXRubyでメモ帳を作成します。
メモ帳の作成とは関係ないが、メニューバーの機能を引き続き解説する。
次のようなメニューを作成する。
表示 ├ツールバー │├標準のボタン │├アドレスバー │└リンク ├ステータスバー ├大きいアイコン ├小さいアイコン ├一覧 └詳細
サブメニューの作成にはFXMenuCascadeを使用する。
menubar = FXMenubar.new(self) viewmenu = FXMenuPane.new(self) FXMenuTitle.new(menubar, "表示(&E)", nil, viewmenu) toolbarmenu = FXMenuPane.new(self) FXMenuCascade.new(viewmenu, "ツールバー(&T)", nil, toolbarmenu) FXMenuCommand.new(toolbarmenu, "標準のボタン(&S)") FXMenuCommand.new(toolbarmenu, "アドレスバー(&A)") FXMenuCommand.new(toolbarmenu, "リンク(&L)")
メニューにチェックマークをつけるには、Fox::FXMenuCommand#checkメソッドを使用します。
チェックマークをはずすには、Fox::FXMenuCommand#uncheckメソッドを使用します。
メニューのチェックマークの状態を知るには、Fox::FXMenuCommand#checked?
次の[ステータスバー]メニューは、クリックするとチェックマークの on / off 状態が切り替わります。
FXMenuCommand.new(viewmenu, "ステータスバー(&B)").connect(SEL_COMMAND) {|sender, selector, data|
sender.checked? ? sender.uncheck() : sender.check
}
FXMenuSeparator.new(viewmenu)
メニューにラジオチェックをつけるには、Fox::FXMenuCommand#checkRadioメソッドを使用します。
ラジオチェックをはずすには、Fox::FXMenuCommand#uncheckRadioメソッドを使用します。
メニューのラジオチェックの状態を知るには、Fox::FXMenuCommand#radioCheck?メソッドを使用します。
次のメニューは、[大きいアイコン][小さいアイコン][一覧][詳細]のメニューのうち、一つだけがチェックされます。 FXMenuSeparator.new(viewmenu)
def initialize(app) # do something ... viewmenu_radio1 = FXMenuCommand.new(viewmenu, "大きいアイコン(&G)") viewmenu_radio1.connect(SEL_COMMAND, method(:onCmdRadio)) viewmenu_radio1.connect(SEL_UPDATE, method(:onUpdRadio)) viewmenu_radio2 = FXMenuCommand.new(viewmenu, "小さいアイコン(&M)") viewmenu_radio2.connect(SEL_COMMAND, method(:onCmdRadio)) viewmenu_radio2.connect(SEL_UPDATE, method(:onUpdRadio)) viewmenu_radio3 = FXMenuCommand.new(viewmenu, "一覧(&L)") viewmenu_radio3.connect(SEL_COMMAND, method(:onCmdRadio)) viewmenu_radio3.connect(SEL_UPDATE, method(:onUpdRadio)) viewmenu_radio4 = FXMenuCommand.new(viewmenu, "詳細(&D)") viewmenu_radio4.connect(SEL_COMMAND, method(:onCmdRadio)) viewmenu_radio4.connect(SEL_UPDATE, method(:onUpdRadio)) end def onCmdRadio(sender, sel, ptr) @choice = sender.object_id return 1 end def onUpdRadio(sender, sel, ptr) (sender.object_id == @choice) ? sender.checkRadio : sender.uncheckRadio return 1 end
次のコードが、これまでに作成したソースコードになります。
#!ruby -Ks
require 'fox'
include Fox
class MemoWindow < FXMainWindow
def initialize(app)
super(app, "memo", nil, nil, DECOR_ALL, 0, 0, 400, 300)
menubar = FXMenubar.new(self)
filemenu = FXMenuPane.new(self)
FXMenuTitle.new(menubar, "ファイル(&F)", nil, filemenu)
FXMenuCommand.new(filemenu, "新規(&N)\tCtl-N").connect(SEL_COMMAND) {
puts "新規"
}
FXMenuCommand.new(filemenu, "開く(&O)\tCtl-O").connect(SEL_COMMAND) {
puts "開く"
}
FXMenuCommand.new(filemenu, "上書き保存(&S)\tCtl-S").connect(SEL_COMMAND) {
puts "上書き保存"
}
FXMenuCommand.new(filemenu, "名前を付けて保存(&A)").connect(SEL_COMMAND) {
puts "名前を付けて保存"
}
FXMenuSeparator.new(filemenu)
FXMenuCommand.new(filemenu, "終了(&X)\tCtl-X", nil, getApp(), FXApp::ID_QUIT)
editmenu = FXMenuPane.new(self)
FXMenuTitle.new(menubar, "編集(&E)", nil, editmenu)
FXMenuCommand.new(editmenu, "元に戻す(&U)\tCtl-Z").connect(SEL_COMMAND) {
puts "元に戻す"
}
FXMenuSeparator.new(editmenu)
FXMenuCommand.new(editmenu, "やり直し(&R)\tCtl-Y").connect(SEL_COMMAND) {
puts "やり直し"
}
FXMenuCommand.new(editmenu, "切り取り(&T)\tCtl-X").connect(SEL_COMMAND) {
puts "切り取り"
}
FXMenuCommand.new(editmenu, "コピー(&C)\tCtl-C").connect(SEL_COMMAND) {
puts "コピー"
}
FXMenuCommand.new(editmenu, "貼り付け(&P)\tCtl-V").connect(SEL_COMMAND) {
puts "貼り付け"
}
FXMenuCommand.new(editmenu, "削除(&L)").connect(SEL_COMMAND) {
puts "削除"
}
FXMenuCommand.new(editmenu, "すべて選択(&A)\tCtl-A").connect(SEL_COMMAND) {
puts "全て選択"
}
viewmenu = FXMenuPane.new(self)
FXMenuTitle.new(menubar, "表示(&E)", nil, viewmenu)
toolbarmenu = FXMenuPane.new(self)
FXMenuCascade.new(viewmenu, "ツールバー(&T)", nil, toolbarmenu)
FXMenuCommand.new(toolbarmenu, "標準のボタン(&S)").connect(SEL_COMMAND) {|sender, selector, data|
sender.checked? ? sender.uncheck() : sender.check
}
FXMenuCommand.new(toolbarmenu, "アドレスバー(&A)").connect(SEL_COMMAND) {|sender, selector, data|
sender.checked? ? sender.uncheck() : sender.check
}
FXMenuCommand.new(toolbarmenu, "リンク(&L)").connect(SEL_COMMAND) {|sender, selector, data|
sender.checked? ? sender.uncheck() : sender.check
}
FXMenuCommand.new(viewmenu, "ステータスバー(&B)").connect(SEL_COMMAND) {|sender, selector, data|
sender.checked? ? sender.uncheck() : sender.check
}
FXMenuSeparator.new(viewmenu)
viewmenu_radio1 = FXMenuCommand.new(viewmenu, "大きいアイコン(&G)")
viewmenu_radio1.connect(SEL_COMMAND, method(:onCmdRadio))
viewmenu_radio1.connect(SEL_UPDATE, method(:onUpdRadio))
viewmenu_radio2 = FXMenuCommand.new(viewmenu, "小さいアイコン(&M)")
viewmenu_radio2.connect(SEL_COMMAND, method(:onCmdRadio))
viewmenu_radio2.connect(SEL_UPDATE, method(:onUpdRadio))
viewmenu_radio3 = FXMenuCommand.new(viewmenu, "一覧(&L)")
viewmenu_radio3.connect(SEL_COMMAND, method(:onCmdRadio))
viewmenu_radio3.connect(SEL_UPDATE, method(:onUpdRadio))
viewmenu_radio4 = FXMenuCommand.new(viewmenu, "詳細(&D)")
viewmenu_radio4.connect(SEL_COMMAND, method(:onCmdRadio))
viewmenu_radio4.connect(SEL_UPDATE, method(:onUpdRadio))
helpmenu = FXMenuPane.new(self)
FXMenuCommand.new(helpmenu, "memoについて(&A)").connect(SEL_COMMAND) {
FXMessageBox.information(self, MBOX_OK, "memoについて",
"簡単なテキストエディター")
}
FXMenuTitle.new(menubar, "&Help", nil, helpmenu, LAYOUT_RIGHT)
end
def create
super
show(PLACEMENT_SCREEN)
end
def onCmdRadio(sender, sel, ptr)
@choice = sender.object_id
return 1
end
def onUpdRadio(sender, sel, ptr)
(sender.object_id == @choice) ? sender.checkRadio : sender.uncheckRadio
return 1
end
end
application = FXApp.new("memo", "yamamoto@gesource.jp")
MemoWindow.new(application)
application.create
application.run
