[ruby-gnome2-doc-cvs] [Hiki] update - ボタン

Back to archive index

ruby-****@lists***** ruby-****@lists*****
2003年 5月 26日 (月) 22:46:04 JST


-------------------------
REMOTE_ADDR = 210.249.193.205
REMOTE_HOST = 
        URL = http://ruby-gnome2.sourceforge.jp/?%A5%DC%A5%BF%A5%F3
-------------------------

-------------------------
= ボタン

== 基本的な使い方
  require 'gtk2'
  
  Gtk.init
  button = Gtk::Button.new("button")
  button.signal_connect("clicked") do
    p "button is clicked."
  end
  
  window = Gtk::Window.new
  window.set_default_size(100,100)
  window.add(button)
  window.show_all
  Gtk.main

--- Gtk::Button.new(label = nil)
    ボタンウィジェットを生成します。
    * label - ボタン上に表示するラベル

--- "clicked"
    ボタンクリック時のシグナルです。

== デフォルトボタンを指定する
デフォルトボタンとは、特に選択せずにもEnterキーを押すだけでそのボタンがクリックされるようなボタンのことを言います、つーか初期表示時に選択されているボタンってことかな、たぶん。
で、Ruby/GTKではウィジェットに対し、Gtk::Object#set_flags(Gtk::Widget::CAN_DEFAULT)とした上で、Gtk::Widget#grab_default()とします。
#この機能自体はGtk::Widgetの機能ですので別にGtk::Buttonでなくても使えます。
#でも、使い方が思いつかない....(^^;)
  
 require 'gtk2'
 
 Gtk.init
 
 button1 = Gtk::Button.new("button1")
 button1.signal_connect("clicked") do
   p "button1 is clicked."
 end
 button1.set_flags(Gtk::Widget::CAN_DEFAULT)
 #button1.grab_default          #(1) 
 
 button2 = Gtk::Button.new("button2")
 button2.signal_connect("clicked") do
   p "button2 is clicked."
 end
 button2.set_flags(Gtk::Widget::CAN_DEFAULT)
 
 vbox = Gtk::VBox.new
 vbox.pack_start(button1,true, true, 10)
 vbox.pack_start(button2,true, true, 10)
 
 #button1.grab_default          #(2) 
 
 window = Gtk::Window.new
 window.set_default_size(300,300)
 window.add(vbox)
 
 button1.grab_default
 
 window.show_all
 
 Gtk.main

--- Gtk::Object#flags=(flag)
--- Gtk::Object#set_flags(flag)
    オブジェクトに対しフラグをセットします。
    * flag - この場合はGtk::Widget::CAN_DEFAULTを指定します。

--- Gtk::Widget#grab_default
    デフォルトボタンに指定します。

このGtk::Widget#grab_default()の位置が要注意です。(1),(2)などに書いてもうまく表示できません。
どうやら、一番親のウインドウにウィジェットがGtk::Container#add()された後でないと反映されないようです。
#私はこれではまりました(T_T)。

== ボタンの枠(レリーフ)を操作する
ボタンの枠(レリーフ)を操作してみます。英語の発音的にはリリーフが正しい?ま、どっちでもイイや(^^;)。

 require 'gtk2'
 
 Gtk.init
 button = Gtk::Button.new("HELLO") 
 button.set_relief(Gtk::RELIEF_NONE)
 p button.relief

 window = Gtk::Window.new
 window.set_default_size(100,100)
 window.add(button)
 window.show_all
 Gtk.main

--- Gtk::Button#relief=(relief)
--- Gtk::Button#set_relief(relief)
    レリーフを指定します。
    * relief - レリーフ
      * Gtk::RELIEF_NORMAL - 通常の枠
      * Gtk::RELIEF_HALF - 半分
      * Gtk::RELIEF_NONE - なし

--- Gtk::Button#relief
    レリーフ値を返します。

== ボタンのシグナル
ボタンのシグナルを使ってみます。

 require 'gtk2'
 
 Gtk.init
 button = Gtk::Button.new("button")
 button.signal_connect("activate") do
   p "button is activate"
 end
 button.signal_connect("clicked") do
   p "button is clicked."
 end
 button.signal_connect("pressed") do
   p "button is pressed."
 end
 button.signal_connect("released") do
   p "button is released."
 end
 button.signal_connect("enter") do
   p "button is entered."
 end
 button.signal_connect("leave") do
   p "button is leaved."
 end

 window = Gtk::Window.new
 window.set_default_size(100,100)
 window.add(button)
 window.show_all
 Gtk.main

1つのボタンに以下の5つのシグナルを接続できます。
* "activate" - リターンキーを押した時
* "clicked" - クリックとはボタンを押されて(PRESSED)離された(RELEASED)時
* "pressed" - ボタンが押された時
* "released" - ボタンが離された時
* "enter" - ボタンの描画領域にマウスが入った時
* "leave" - ボタンの描画領域からマウスが離れた時

== ボタンを操作するメソッド
実際にマウスでクリックしなくても、指定したボタンに対してイベントを発生させることができます。ここでは、buttonのイベントを他のボタンをクリックすることで発生させてみます。

 require 'gtk2'

 Gtk.init
 button = Gtk::Button.new("button")
 button.signal_connect("clicked") do |v|
   p "button is clicked."
 end
 button.signal_connect("pressed") do
   p "button is pressed."
 end
 button.signal_connect("released") do
   p "button is released."
 end
 button.signal_connect("enter") do
   p "button is entered."
 end
 button.signal_connect("leave") do
   p "button is leaved."
 end

 button2 = Gtk::Button.new("button2:clicked")
 button2.signal_connect("clicked") do
   p "button2"
   button.clicked
 end
 button3 = Gtk::Button.new("button3:pressed")
 button3.signal_connect("clicked") do
   p "button3"
   button.pressed
 end
 button4 = Gtk::Button.new("button4:released")
 button4.signal_connect("clicked") do
   p "button4"
   button.released
 end
 button5 = Gtk::Button.new("button5:enter")
 button5.signal_connect("clicked") do
   p "button5"
   button.enter
 end
 button6 = Gtk::Button.new("button6:leave")
 button6.signal_connect("clicked") do
   p "button6"
   button.leave
 end
 
 vbox = Gtk::VBox.new
 vbox.pack_start(button)
 vbox.pack_start(button2)
 vbox.pack_start(button3)
 vbox.pack_start(button4)
 vbox.pack_start(button5)
 vbox.pack_start(button6)
   
 window = Gtk::Window.new
 window.add(vbox)
 window.show_all
 Gtk.main

--- Gtk::Button#clicked
--- Gtk::Button#pressed
--- Gtk::Button#released
--- Gtk::Button#enter
--- Gtk::Button#leave
    それぞれ、click時、press時、release時、enter時、leave時のイベントを発生させます。

== スタイル(前景色/背景色)を指定する
前景色/背景色を指定してみます。背景色の情報は、Gtk::Buttonが、前景色(文字色)はGtk::Buttonのchild(Gtk::Label)が管理しているのでそちらに指定します。
  
  require 'gtk2'
  
  Gtk.init
  style = Gtk::Style.new
  style.set_fg(Gtk::STATE_NORMAL, 0, 65535, 0)
  style.set_bg(Gtk::STATE_NORMAL, 65535, 0, 0)
  
  style.set_fg(Gtk::STATE_ACTIVE, 0, 0, 65535)
  style.set_bg(Gtk::STATE_ACTIVE, 0, 65535, 0)
  
  style.set_fg(Gtk::STATE_PRELIGHT, 65535, 0, 0)
  style.set_bg(Gtk::STATE_PRELIGHT, 0, 0, 65535)
  
  style.set_fg(Gtk::STATE_SELECTED, 65535, 65535, 0)
  style.set_bg(Gtk::STATE_SELECTED, 0, 65535, 65535)
  
  style.set_fg(Gtk::STATE_INSENSITIVE, 65535, 65535, 65535)
  style.set_bg(Gtk::STATE_INSENSITIVE, 0, 0, 0)
  
  button = Gtk::Button.new("Hello World")
  button.set_style(style)
  button.child.set_style(style)
  
  button2 = Gtk::Button.new("Insensitive")
  button2.set_style(style)
  button2.child.set_style(style)
  button2.set_sensitive(false)
  
  window = Gtk::Window.new
  window.add(Gtk::VBox.new.add(button).add(button2))
  window.show_all
  Gtk.main

--- Gtk::Style.new
    スタイルを生成します。

--- Gtk::Style#set_fg(state, r, g, b)
--- Gtk::Style#set_bg(state, r, g, b)
    スタイルに前景色・背景色を指定します。
    * state - そのボタンが何の状態の時に色を指定するか
      * Gtk::STATE_NOMRMAL - 通常時
      * Gtk::STATE_ACTIVE - ボタンが凹んだ時
      * Gtk::STATE_PRELIGHT - マウスがウィジェット上になった時
      * Gtk::STATE_SELECTED - アイテムが選択された時(ここでは特に何も起きません)
      * Gtk::STATE_INSENSITIVE - ボタンが使用不可の状態の時
    * r, g, b - 赤・緑・青(0 - 65535)

--- Gtk::Widget#set_style(style)
    スタイルを設定します。
    * style - スタイル(Gtk::Style)

--- Gtk::Bin#child
    子供のウィジェットを返します。Gtk::Buttonの場合はGtk::Labelになります。

--- Gtk::Widget#set_sensitive(sensitive)
    ボタンの使用可・不可を設定します。
    * sensitive - true:使用可、false:使用不可

== 画像つきボタンを作る
Gtk::ButtonはGtk::Binのサブクラスです。したがって、Gtk::Buttonに1つだけ子ウィジェットを追加することができます。1つだけと言っても、それを他のコンテナウィジェットにしてしまえば後はやりたい放題です(^^;)。
そこで、ここではGtk::VBoxを使って上下に画像・ラベルを付けたボタンを作ってみます。
XPM形式のファイルは何でも良いのですが、一応、この例題で使ったものを((<r.xpm|URL:r.xpm>))に置いておきます。

  require 'gtk2'
 
  Gtk.init
  window = Gtk::Window.new
  vbox = Gtk::VBox.new
  vbox.pack_start(Gtk::Image.new("r.xpm"))
  vbox.pack_start(Gtk::Label.new("test"))
 
  button = Gtk::Button.new
  button.add(vbox)
 
  window.add(button)
  window.show_all
  Gtk.main






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