다음 이전 차례

14. 이벤트박스 widget

어떤 GTK widget들은 그들만의 X윈도를 가지지 않고 단지 그들의 parent윈도에 그려질 뿐이다. 이로 인해 그들은 이벤트를 받을 수 없고 또 부정확한 크기로 변했을 때 클립되지 않기 때문에 어지럽게 덧칠되어 버릴 수도 있다. 이런 widget에 대해 좀더 많은 것을 기대하려면 바로 이 EventBox를 이용할 수 있다.

얼핏 보기에, EventBox widget은 전혀 쓸모없을 수도 있다. 이것은 스크린에 아무것도 그리지 않으며 이벤트에도 응답하지 않는다. 하지만 이것은 자신의 child widget으로 X윈도를 제공하는 한 함수를 지원한다. 이것은 많은 GTK widget들이 관련된 X윈도를 가지지 않는다는 점에서 중요하다. X윈도를 가지지 않는 것은 메모리를 절약하고 퍼포먼스를 증대하지만, 또한 몇가지 약점도 있다. X윈도가 없는 widget은 이벤트를 받을 수 없고, 그리고 그의 항목들에 대한 클리핑도 하지 않는다. EventBox라는 이름은 이벤트를 다루는 함수라는 의미도 있지만, widget들이 클리핑될 수도 있다는 것을 의미하기도 한다. (그리고 더 있다.. 아래의 예제를 보자.)

새로운 EventBox widget을 만들기 위해서 이것을 이용한다.

GtkWidget* gtk_event_box_new (void);

이 EventBox에는 child widget이 더해질 수 있다.

gtk_container_add (GTK_CONTAINER(event_box), widget);

이번의 예제는 한 EventBox의 두가지 쓰임새를 다 보여준다. 즉 작은 박스로 클리핑된 라벨이 있고, 이것에 대고 마우스를 클릭하면 프로그램이 끝나게 된다.

#include <gtk/gtk.h>

int
main (int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *event_box;
    GtkWidget *label;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title (GTK_WINDOW (window), "Event Box");

    gtk_signal_connect (GTK_OBJECT (window), "destroy",
              GTK_SIGNAL_FUNC (gtk_exit), NULL);

    gtk_container_border_width (GTK_CONTAINER (window), 10);

    /* EventBox를 하나 만들고 그것을 toplevel 윈도에 더해준다. */

    event_box = gtk_event_box_new ();
    gtk_container_add (GTK_CONTAINER(window), event_box);
    gtk_widget_show (event_box);

    /* 긴 라벨을 만든다. */

    label = gtk_label_new ("Click here to quit, quit, quit, quit, quit");
    gtk_container_add (GTK_CONTAINER (event_box), label);
    gtk_widget_show (label);

    /* 이것을 작게 클리핑한다. */
    gtk_widget_set_usize (label, 110, 20);

    /* 이것에 동작(action)을 연결시켜 준다. */
    gtk_widget_set_events (event_box, GDK_BUTTON_PRESS_MASK);
    gtk_signal_connect (GTK_OBJECT(event_box), "button_press_event",
              GTK_SIGNAL_FUNC (gtk_exit), NULL);

    /* 어떤 X 윈도를 위해 한 가지 더 필요한 게 있다... */

    gtk_widget_realize (event_box);
    gdk_window_set_cursor (event_box->window, gdk_cursor_new (GDK_HAND1));

    gtk_widget_show (window);

    gtk_main ();

    return 0;
}


다음 이전 차례