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