2017-12-22 26 views
0

私はGtkScrolledWindowとGtkLayoutを組み合わせたGTK + 2プログラムを持っています。それはうまく動作します。しかし、私はGtkLayoutにGtkEventオブジェクトを置くと、正しく表示されませんでした。なぜ誰が知っていますか?ありがとう。スクロールしたウィンドウレイアウトにGtkEventBoxを追加するにはどうすればよいですか?

#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

答えて

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

関連する問題