1
在GTK3中,當鼠標懸停在一個GtkWidget上時,如何將鼠標光標設置爲十字線,本例中爲GtkDrawingArea?如何設置鼠標光標穿過GtkDrawingArea?
在GTK3中,當鼠標懸停在一個GtkWidget上時,如何將鼠標光標設置爲十字線,本例中爲GtkDrawingArea?如何設置鼠標光標穿過GtkDrawingArea?
首先,你必須告訴GtkDrawingArea
小部件use a backing window,爲了接收事件:
gtk_widget_set_has_window (GTK_WIDGET (darea), TRUE);
然後你必須告訴它which events you wish to subscribe to;在這種情況下,你想要的交叉事件,以便接收指針進入的通知,並留下小部件:
int crossing_mask = GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK;
gtk_widget_add_events (GTK_WIDGET (darea), crossing_mask);
在這一點上,你可以連接到GtkWidget::enter-notify-event
和GtkWidget::leave-notify-event
信號:
g_signal_connect (darea, "enter-notify-event", G_CALLBACK (on_crossing), NULL);
g_signal_connect (darea, "leave-notify-event", G_CALLBACK (on_crossing), NULL);
如果需要,您可以使用兩個獨立的信號處理程序,但除非您在其中執行一些複雜的操作,否則代碼將幾乎完全相同。
的on_crossing()
處理程序將是這個樣子:
static gboolean
on_crossing (GtkWidget *darea, GdkEventCrossing *event)
{
switch (gdk_event_get_event_type (event))
{
case GDK_ENTER_NOTIFY:
// Do something on enter
break;
case GDK_LEAVE_NOTIFY:
// Do something on leave
break;
}
}
現在你必須指定光標根據事件類型使用。 GTK +使用相同的光標名稱as CSS does;你需要使用創建a cursor instance,然後將其關聯到由繪圖區域小部件使用的GdkWindow
:
// Get the display server connection
GdkDisplay *display = gtk_widget_get_display (darea);
GdkCursor *cursor;
switch (gdk_event_get_event_type (event))
{
case GDK_ENTER_NOTIFY:
cursor = gdk_cursor_new_from_name (display, "crosshair");
break;
case GDK_ENTER_NOTIFY:
cursor = gdk_cursor_new_from_name (display, "default");
break;
}
// Assign the cursor to the window
gdk_window_set_cursor (gtk_widget_get_window (darea), cursor);
// Release the reference on the cursor
g_object_unref (cursor);
感謝您詳細的解答!請查看我的後續問題:https://stackoverflow.com/questions/43723638/how-do-i-change-the-mouse-cursor-over-a-gtkdrawingarea-in-gtk3 – PintoDoido
['' gtk_widget_set_has_window()'](https://developer.gnome.org/gtk3/stable/GtkWidget.html#gtk-widget-set-has-window)說:「這個函數只應該被widget實現調用,而且它們應該在他們的init()函數中調用它。「 ....不會是'eventbox_box'作爲'drawing_area'的容器足夠嗎? – Gerhardh
是的,您也可以使用GtkEventBox,然後在其中添加GtkDrawingArea;或者你可以繼承GtkDrawingArea並在你自己的新類型的實例初始化函數中調用gtk_widget_set_has_window()。有更多的方法可以用現有的API來做到這一點。 – ebassi