不可见GtkEventBox vs光标更改
在我的应用程序中,有时我需要在进程进行时禁用大多数按钮和事件框(当然“取消”按钮除外)。每个事件框包含一个可单击的标签。为了让用户理解这些标签是可点击的,我在文本上画了下划线,并在光标悬停在这些标签上时进行了更改 问题是,当我禁用事件框(使其不敏感)时,您会看到一个相当丑陋的工件: 因此,我搜索并找到了以下函数:。注意:我正在使用(不幸的是,我不得不这么做)GTK2.22,但是他们刚刚从他们的网站上删除了文档。无论如何,这个函数的文本是相同的 根据此函数,您可以使事件框创建一个仅限GDK\U输入的不可见GtkEventBox vs光标更改,gtk,gtk2,Gtk,Gtk2,在我的应用程序中,有时我需要在进程进行时禁用大多数按钮和事件框(当然“取消”按钮除外)。每个事件框包含一个可单击的标签。为了让用户理解这些标签是可点击的,我在文本上画了下划线,并在光标悬停在这些标签上时进行了更改 问题是,当我禁用事件框(使其不敏感)时,您会看到一个相当丑陋的工件: 因此,我搜索并找到了以下函数:。注意:我正在使用(不幸的是,我不得不这么做)GTK2.22,但是他们刚刚从他们的网站上删除了文档。无论如何,这个函数的文本是相同的 根据此函数,您可以使事件框创建一个仅限GDK\U输
窗口。如果我这样做,那么禁用事件框不会使它变得丑陋
但是,由于事件框现在没有可输出的窗口,因此
gdk_window_set_cursor(event_box->window, cursor);
使整个窗口的光标更改,而不仅仅是事件框
我可以看到不可见窗口和光标切换窗口之间的矛盾,但我的问题是,如果不这样,我可以让光标切换到事件框上,但在禁用事件框时看不到可见工件吗?我尝试了不同的方法,例如将事件框的背景更改为透明等,但所有这些都相当复杂
我找到的最简单的解决方案如下:
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 event
和leave notify event
信号处理程序设置为在鼠标进入或离开窗口时更改窗口光标。找不到GTK 2.22的联机文档,但有2.24:@liberforce Right。他们做了一些改变,很多链接现在都断了(以前不是这样)。但正如我所说,这个函数的文本在2.22和当前版本之间是相同的。