我有一个结合了GtkScrolledWindow和GtkLayout的GTK + 2程序。它工作正常。但是,我发现如果将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;
}




使用事件框时的图片。

c - 如何在滚动窗口布局中添加Gtk EventBox?-LMLPHP

最佳答案

我发现它不必在这里使用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的结果:
c - 如何在滚动窗口布局中添加Gtk EventBox?-LMLPHP

08-06 14:45