2017-05-01 8 views

答えて

1

まず第一に、あなたは、イベントを受け取るために、use a backing windowGtkDrawingAreaウィジェットを伝える必要があります。

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-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); 

必要に応じて2つの別々のシグナルハンドラを使用することができますが、複雑な処理をしない限り、コードはほぼ同じになります。

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); 
+0

感謝を!私のフォローアップの質問をチェックしてください:https://stackoverflow.com/questions/43723638/how-do-i-change-the-mouse-cursor-over-a-gtkdrawingarea-in-gtk3 – PintoDoido

+0

[ gtk_widget_set_has_window() '](https://developer.gnome.org/gtk3/stable/GtkWidget.html#gtk-widget-set-has-window)は次のように述べています。「この関数はウィジェットの実装によってのみ呼び出されます。 init()関数で呼び出すことができます。 .... 'drawing_area'のためのコンテナとして' eventbox_box'は十分でしょうか? – Gerhardh

+0

はい、GtkEventBoxを使用して、その内部にGtkDrawingAreaを追加することもできます。 GtkDrawingAreaをサブクラス化し、独自の新しい型のインスタンス初期化関数の中でgtk_widget_set_has_window()を呼び出すこともできます。既存のAPIでこれを行う方法はまだまだあります。 – ebassi

関連する問題