如何将鼠标光标设置为在GtkDrawingArea上交叉发?

在GTK3中,当我将鼠标光标hover在GtkWidget上时如何设置鼠标光标,在这种情况下是GtkDrawingArea

首先,您必须告诉GtkDrawingArea小部件使用后备窗口 ,以便接收事件:

 gtk_widget_set_has_window (GTK_WIDGET (darea), TRUE); 

然后你必须告诉它你想订阅哪些事件 ; 在这种情况下,您需要交叉事件,以便接收进入和离开小部件的指针的通知:

 int crossing_mask = GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK; gtk_widget_add_events (GTK_WIDGET (darea), crossing_mask); 

此时,您可以连接到GtkWidget::enter-notify-eventGtkWidget::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 +使用与CSS相同的游标名称; 您需要使用其中一个名称创建一个游标实例 ,然后将其与绘图区域小部件使用的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);