0

私のアプリケーションでは、プロセスの実行中にほとんどのボタンとイベントボックスを無効にする必要がある場合があります(もちろん「キャンセル」ボタンを除く)。各イベントボックスには、クリックできるラベルが含まれています。これらのラベルがクリック可能であることをユーザーに理解させるために、テキストに下線を付け、これらのラベルにカーソルを合わせるとカーソルが変化します。

問題は、イベントボックスを無効にすると(感度を低くする)、かなり醜いアーティファクトが表示されることです。

ここに画像の説明を入力してください

そこで、この関数を検索して見つけました:gtk_event_box_set_visible_window。注:私は(残念ながら)Gtk 2.22を使用していますが、Webサイトからドキュメントを削除しただけです。とにかく、この関数のテキストは同じです。

この機能により、イベントボックスにGDK_INPUT_ONLYウィンドウを作成させることができます。そうすると、イベントボックスを無効にしても、醜くなりません。

ただし、イベントボックスには出力可能なウィンドウがないため、

gdk_window_set_cursor(event_box->window, cursor);

イベントボックスだけでなく、ウィンドウ全体のカーソルを変更します。

ウィンドウが表示されないこととウィンドウ上でカーソルが切り替わるという矛盾は多少わかりますが、それ以外の場合は、イベントボックス上でカーソルを変更できますが、イベントボックスが無効になっているときにアーティファクトが表示されないのはどうしてですか?

4

1 に答える 1

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-eventとシグナル ハンドラを設定することです。leave-notify-event

于 2012-12-10T16:02:37.930 に答える