[ruby-gnome2-doc-cvs] [Hiki] create - gtk2-tut-manualmenu

Back to archive index

ruby-****@sourc***** ruby-****@sourc*****
2003年 9月 9日 (火) 15:42:11 JST


-------------------------
REMOTE_ADDR = 163.135.10.34
REMOTE_HOST = 
        URL = http://ruby-gnome2.sourceforge.jp/ja/?gtk2-tut-manualmenu
-------------------------
= 手作業でのメニュー作成 
真の教育の伝統にしたがい,まずは困難な方法から見ていこう.:) 

メニューバーやサブメニューの作成に関わるウィジェットは3つある:

:メニューアイテム
  ユーザーが選択するもの.例) "Save" など.
:メニュー
  メニューアイテムのコンテナ.
:メニューバー
  個々のメニューのコンテナ.

メニューアイテムウィジェットは,2つの異なる使い方をされるために少々解りにくい.
メニューにパックされるものと,メニューバーにパックされ選択されたときにメニューをアクティブにするものである.

それではメニューとメニューバーを作成する方法を見てみよう.
まず新規にメニューバーを作成する:

  Gtk::MenuBar.new

ボタンなどのウィジェット同様,メニューバーをGtk::Container#addを用いてウィンドウにパックしたり,Gtk::Box#packを使ってボックスにパックすることができる.

  Gtk::Menu.new

こちらは新規にメニューを作成する.メニューは(Gtk::Widget#showを用いて)実際に表示されるのではなく,単にメニューアイテムのコンテナとなるだけである.
以下にある例を見ればよく理解できるだろう.

メニュー(やメニューバー)にパックするメニューアイテムを作成するには:

  Gtk::MenuItem.new(label = nil)

Gtk::MenuItemは表示されるメニューアイテムを作成するのに用いられる.
引数labelは((<ボタン|gtk2-tut-button>))の引数labelと同様 '_' で下線による装飾ができ,先頭の下線付き文字はアクセラレータとして解釈される.

Gtk::Menu.new で作成される「メニュー」とGtk::MenuItem.nerwで作成される「メニューアイテム」をきちんと区別するように.
メニューアイテムは動作が関連付けられているボタンそのものであり,一方,メニューはメニューアイテムを保持するコンテナである.

メニューアイテムを作成したら次にそれをメニューにパックしなければならない.
これはGtk::MenuShell#appendを用いて行われる((-Gtk::MenuはGtk::MenuShellを継承している.-)).
ユーザーがアイテムを選択したのを捉えるには,いつもと同じやり方でactivateシグナルに接続する必要がある.
例えばOpen,SaveそれにQuitを備えた標準的なFileメニューを作成したい場合,コードは次のようになる.

  file_menu = Gtk::Menu.new
  
  # メニューアイテムを作成する
  open_item = Gtk::MenuItem.new("_Open")
  save_item = Gtk::MenuItem.new("_Save")
  quit_item = Gtk::MenuItem.new("_Quit")
  
  # それらをメニューに加える
  file_menu.append(open_item)
  file_menu.append(save_item)
  file_menu.append(quit_item)
  
  # activate シグナルにコールバックブロックをアタッチする
  open_item.signal_connect("activate") { ... }
  save_item.signal_connect("activate") { ... }
  quit_item.signal_connect("activate") {Gtk.main_quit}

さて,これでメニューが準備できたので,次はメニューバーとFileメニューのためのメニューアイテムを作成する必要がある.コードは次のようなものになる:

  menu_bar = Gtk::MenuBar.new
  window.add(menu_bar)

  file_item = Gtk::MenuItem.new("_File")

次にメニューとfile_itemを関連付けよう.関連付けるにはGtk::MenuItem#set_submenuを用いる.

  file_item.submenu = file_menu

最後にメニューをメニューバーに加えよう.Gtk::MenuBar#appendを用いる.

  menu_bar.append(file_item)

ヘルプメニューなどはしばしばメニューバー上で右寄せされているが,これはメニューアイテムをメニューバーにappendする前にGtk::MenuItem#set_right_justifiedで(今回の例ではfile_itemに対して)右寄せを指定すればよい.

メニューをアタッチしたメニューバーを作成する手順をまとめると:

* Gtk::Menu.newを用いて新規にメニューを作成する.
* メニュー上に配置したいアイテム毎にGtk::MenuItem.newを使う.
* Gtk::MenuShell#appendを用いてメニュー上にこれらのメニューアイテムを配置する.
* Gtk::MenuItem.newを用いてメニューアイテムを作成する.これはメニューのルートになるもので,Gtk::MenuItem.newの引数に指定した文字列はメニューバー上に表示される.
* Gtk::MenuItem#set_submenuを用いてメニューを(上のステップで作成した)ルートメニューアイテムにアタッチする.
* Gtk::MenuBar.newを使い新規にメニューバーを作成する.このステップは1つのメニューバー上に一連のメニューを作成する場合は一度だけ行えばよい.
* Gtk::MenuBar#appendを用いてルートメニューをメニューバー上に配置する.

ポップアップメニューを作成する場合もほとんど同様である.
違いはメニューがメニューバーによって「自動的に」表示されるのでなく,例えばGdk::EventButton等を拾ってGtk::Menu#popupを明示的に呼び出すことで表示される点である.

例えば,ボタンを押すとメニューが表示されるようにするには次のようにする.

  button.signal_connect("event") do |w, e|
     if (Gdk::Event::BUTTON_PRESS == e.event_type)
        menu.popup(nil, nil, e.button, e.time)
        true   # このイベントの処理は完了したので true を返す
     else
        false
     end
  end






ruby-gnome2-cvs メーリングリストの案内
Back to archive index