Chapter 13. Xと関連のないウィジット

Table of Contents

ウィジットのなかにはX-Windowと結びつけられていないものがあり、それらはXのイベントを受け取ることができません。これはXイベントシグナルのセクションで説明したシグナルが発行されない、ということを意味しています。もしもこのようなウィジットでイベントの捕獲を行いたいのであれば、特別なコンテナであるGtk::EventBoxが使えます。これについてはEventBoxのセクションで説明します。

以下がXのイベントを受け取らないウィジットのリストです:

Gtk::Alignment
Gtk::Arrow
Gtk::Bin
Gtk::Box
Gtk::Button
Gtk::CheckButton
Gtk::Fixed
Gtk::Image
Gtk::Item
Gtk::Label
Gtk::MenuItem
Gtk::Notebook
Gtk::Paned
Gtk::Pixmap
Gtk::RadioButton
Gtk::Range
Gtk::ScrolledWindow
Gtk::Separator
Gtk::Table
Gtk::Toolbar
Gtk::AspectFrame
Gtk::Frame
Gtk::VBox
Gtk::HBox
Gtk::VSeparator
Gtk::HSeparator

これらのウィジットは主に飾りや配置のために使われます。ですからイベントを捕獲する必要のある場合はあまり多くありません。これらがX-Windowと関連を持たないのはパフォーマンスを上げるためです。

イベントボックス

TODO: Why don't they have X Windows - explain clipping. gtkmmのウィジットにはいくつかX Windowと関連づけられていないものがあります(それらは親ウィンドウの上に描画されます)。この場合、ウィジットはイベントを受け取ることができません。さらに、それらは誤ってサイズが変更された場合、クリッピング処理もされません。ユーザーは醜く上書きされたものを見ることになります。このようなウィジットでの処理を必要とする場合、EventBoxを使うのがよいでしょう。このEventBoxという名はイベントハンドリングを強調していますが、クリッピング処理に使うこともできます(さらにこれら以外にも使えます。コード例を参照してください)。

Gtk::EventBoxのコンストラクタは:

Gtk::EventBox();

EventBoxに子ウィジットを加えるには:

event_box.add(child_widget);

Reference

以下のコード例ではEventBoxの両方の使い方を示しています。ラベルを小さな矩形にクリッピングするように生成し、マウスクリックでプログラムが終了するように設定しています。ウィンドウのサイズを変更すればラベルの占める大きさが変わることがわかります。

Figure 13.1. EventBox

EventBox

Source Code

File: examplewindow.h

#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H

#include <gtkmm.h>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:
  //Signal handlers:
  virtual bool on_eventbox_button_press(GdkEventButton* event);

  //Child widgets:
  Gtk::EventBox m_EventBox;
  Gtk::Label m_Label;
};

#endif //GTKMM_EXAMPLEWINDOW_H

File: main.cc

#include <gtkmm/main.h>
#include "examplewindow.h"

int main(int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);

  ExampleWindow window;
  //Shows the window and returns when it is closed.
  Gtk::Main::run(window);

  return 0;
}

File: examplewindow.cc

#include "examplewindow.h"

ExampleWindow::ExampleWindow()
: m_Label("Click here to quit, quit, quit, quit, quit")
{
  set_title ("EventBox");
  set_border_width(10);

  add(m_EventBox);

  m_EventBox.add(m_Label);

  //Clip the label short:
  m_Label.set_size_request(110, 20);

  //And bind an action to it:
  m_EventBox.set_events(Gdk::BUTTON_PRESS_MASK);
  m_EventBox.signal_button_press_event().connect(
    sigc::mem_fun(*this, &ExampleWindow::on_eventbox_button_press) );

  m_EventBox.set_tooltip_text("Click me!");

  show_all_children();
}

ExampleWindow::~ExampleWindow()
{
}

bool ExampleWindow::on_eventbox_button_press(GdkEventButton*)
{
  hide();
  return true;
}