Top / Programming / Ruby / Ruby GUIライブラリ / FXRuby / FXRubyでメモ帳作成(4)メニューバーを表示する(2)

FXRubyでメモ帳作成(4)

FXRubyでメモ帳を作成します。

メニューバーを表示する(2)

メモ帳の作成とは関係ないが、メニューバーの機能を引き続き解説する。

次のようなメニューを作成する。

表示
├ツールバー
│├標準のボタン
│├アドレスバー
│└リンク
├ステータスバー
├大きいアイコン
├小さいアイコン
├一覧
└詳細

サブメニューを作成する

サブメニューの作成には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

memo画面キャプチャ

更新履歴