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