Invisible Gtk EventBox vs游标更改

时间:2012-12-07 16:39:07

标签: gtk gtk2

在我的应用程序中,有时我需要在进程发生时禁用大多数按钮和事件框(当然除了“取消”按钮)。每个事件框都包含一个可以单击的标签。为了让用户理解这些标签是可点击的,我在文本上加了下划线,并且当光标悬停在这些标签上时,光标会发生变化。

问题是当我禁用一个事件框(使其不敏感)时,你会看到一个相当丑陋的神器:

enter image description here

所以,我搜索并找到了这个函数:gtk_event_box_set_visible_window。注意:我正在使用(不幸的是)Gtk 2.22,但他们只是从他们的网站上删除了文档。无论如何,这个函数的文本都是一样的。

根据此功能,您可以使事件框创建GDK_INPUT_ONLY窗口。如果我这样做,那么禁用事件框不会让它变得难看。

但是,由于事件框现在没有可输出窗口,

gdk_window_set_cursor(event_box->window, cursor);

使光标更改为整个窗口,而不仅仅是事件框。

我可以看到窗口上没有可见窗口和光标变化之间的矛盾,但我的问题是如何,否则,我可以将光标更改为事件框,但是当看不到可见的工件时事件框已禁用?

1 个答案:

答案 0 :(得分:0)

我尝试了不同的方法,例如将事件框的背景更改为透明等,但所有方法都非常复杂。

我找到的最简单的解决方案如下:

static GdkCursor *_normal_cursor = NULL;
static GdkCursor *_hand_cursor = NULL;

/* in main */
    _normal_cursor = gdk_window_get_cursor(widgets_to_remember->window->window);
    _hand_cursor = gdk_cursor_new(GDK_HAND2);

    /* create the event box */
    gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box), FALSE);
    gtk_widget_set_events(event_box, GDK_BUTTON_PRESS_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);

    _fix_event_box(event_box, window);
/* rest of main */

static gboolean _set_hand(GtkWidget *w, GdkEventCrossing *e, gpointer data)
{
    gdk_window_set_cursor(w->window, _hand_cursor);
    return TRUE;
}

static gboolean _set_normal(GtkWidget *w, GdkEventCrossing *e, gpointer data)
{
    gdk_window_set_cursor(w->window, _normal_cursor);
    return TRUE;
}

static void _fix_event_box(GtkWidget *eb, GtkWidget *window)
{
    g_signal_connect_swapped(eb, "enter_notify_event", G_CALLBACK(_set_hand), window);
    g_signal_connect_swapped(eb, "leave_notify_event", G_CALLBACK(_set_normal), window);
}

这基本上做的是将事件框设置为不可见,然后设置其enter-notify-eventleave-notify-event信号处理程序,以便在鼠标进入或离开窗口时更改窗口光标。