2017-12-22 9 views
0

Ich habe ein GTK + 2 Programm, das GtkScrolledWindow und GtkLayout kombiniert. Es funktioniert gut. Aber ich habe festgestellt, wenn ich ein GtkEvent-Objekt auf GtkLayout setze, wird es nicht richtig angezeigt. Jeder weiß warum? Vielen Dank.Wie kann ich GtkEventBox im Scroll-Fenster-Layout hinzufügen?

#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; 
} 



Das Bild, wenn das EventBox verwendet wird.

enter image description here

Antwort

0

Ich fand es nicht GtkEventBox hat hier zu verwenden. Das GtkLayout kann Ereignisse direkt erfassen.

Die folgenden Widgets haben ein zugeordnetes Fenster nicht. Daher sollte es mit der GtkEventBox verwendet werden, wenn Sie Ereignisse erfassen möchten.

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

Das feste Programm:

#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; 
} 

Das Ergebnis auf GtkLayout klicken:
enter image description here

Verwandte Themen