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