如何在滚动的窗口布局中添加GtkEventBox?

时间:2017-12-22 02:39:54

标签: c events gtk

我有一个GTK + 2程序,它结合了GtkScrolledWindow和GtkLayout。它工作正常。但是,我发现如果我将GtkEvent对象放到GtkLayout,它将无法正常显示。谁知道为什么?感谢。

#include <gtk/gtk.h>

int main( int   argc, char *argv[] )
{
GtkWidget *window, *button, *layout, *eventbox, *scrollwindow;

gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (window, 150, 150);

button = gtk_button_new_with_label ("button");
layout = gtk_layout_new(NULL, NULL);
gtk_layout_set_size( GTK_LAYOUT(layout), 300, 300);
scrollwindow = gtk_scrolled_window_new(GTK_LAYOUT(layout)->hadjustment, GTK_LAYOUT(layout)->vadjustment);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

gtk_layout_put( GTK_LAYOUT(layout), button, 50, 250 );

/* uncomment to use eventbox
eventbox = gtk_event_box_new();
gtk_container_add( GTK_CONTAINER(eventbox), layout);
gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW(scrollwindow), eventbox);
*/

// comment this line when use eventbox
gtk_container_add( GTK_CONTAINER(scrollwindow), layout);


gtk_container_add((GtkContainer*)window, scrollwindow);

gtk_widget_show_all(window);
gtk_main ();
return 0;
}



使用事件框的图片。

enter image description here

1 个答案:

答案 0 :(得分:0)

我发现它不必在这里使用GtkEventBox。 GtkLayout可以直接捕获事件。

以下小部件没有关联的窗口。因此,如果要捕获事件,它应该与GtkEventBox一起使用。

GtkAlignment
GtkArrow
GtkBin
GtkBox
GtkImage
GtkItem
GtkLabel
GtkPaned
GtkPixmap
GtkScrolledWindow
GtkSeparator
GtkTable
GtkViewport
GtkAspectFrame
GtkFrame
GtkVPaned
GtkHPaned
GtkVBox
GtkHBox
GtkVSeparator
GtkHSeparator

固定程序:

#include <gtk/gtk.h>

static gboolean button_press_event( GtkWidget *widget, GdkEventButton *event ) {
    if (event->button == 1 ) printf("but down  %i , %i\n", (int)event->x, (int)event->y);
    return TRUE;
}

int main( int   argc, char *argv[] )
{
GtkWidget *window, *button, *layout, *eventbox, *scrollwindow;

gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (window, 150, 150);

button = gtk_button_new_with_label ("button");
layout = gtk_layout_new(NULL, NULL);
gtk_layout_set_size( GTK_LAYOUT(layout), 300, 300);

scrollwindow = gtk_scrolled_window_new(GTK_LAYOUT(layout)->hadjustment, GTK_LAYOUT(layout)->vadjustment);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_layout_put( GTK_LAYOUT(layout), button, 50, 250 );
gtk_container_add( GTK_CONTAINER(scrollwindow), layout);
gtk_container_add(GTK_CONTAINER(window), scrollwindow);
g_signal_connect (layout, "button_press_event",  G_CALLBACK (button_press_event), NULL);

gtk_widget_set_events(layout, GDK_EXPOSURE_MASK
     | GDK_LEAVE_NOTIFY_MASK    | GDK_BUTTON_PRESS_MASK
     | GDK_POINTER_MOTION_MASK  | GDK_POINTER_MOTION_HINT_MASK);

gtk_widget_show_all(window);
gtk_main ();
return 0;
}

点击GtkLayout的结果:
enter image description here