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

标签 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

最佳答案

我发现这里不必使用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_get_hadjustment(layout), gtk_layout_get_vadjustment(layout));
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

关于c - 如何在滚动窗口布局中添加 GtkEventBox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47935229/

相关文章:

javascript - JQuery click() 事件监听器不工作

我可以为鼠标按钮设置全局 GTK 加速器吗?

事件监听器中的 jQuery 绑定(bind)事件

c - Webkit GTK : Exposing HTTP headers

c - 添加一个 child 到 GtkVBox

c - Winsock 错误 1013 - 权限被拒绝

c - 回调函数的可变参数

c - 用 C (DPDA) 编译确定性下推自动机时出错

c - 如何获取C盘操作系统信息

javascript - TinyMCE:事件初始化后如何绑定(bind)