3

GTK+ v2.24 でクロスプラットフォーム プログラムを作成していますが、多くの作業を行った後、問題が発生しました。これは私がやろうとしていることです:
1) GtkEntry で Enter キーを押すと、イベントが発生します (「アクティブ化」シグナルで実行されます)。
2) シンプルなメッセージでボタンなしのダイアログを表示します。
3) ダイアログを 1 秒後にフェードアウト効果で非表示にします。

注: ダイアログが表示されてフェード アウトする間、メインのトップ レベル ウィンドウは引き続き動作するはずです (ビデオ フィードが実行されているため)。

私はインターネット全体を検索しましたが、役に立ちませんでした。ここら辺の天才たちが助けてくれることを願っていた。ありがとうございました!

編集: 私はすでにこの質問を見つけましたが、GTK# に関するもので、GTK+ に変換できません。

4

2 に答える 2

2

私は自分の質問に答えていますが(したがって、@ user4815162342 の質問を受け入れていません)、彼が間違っているという意味ではありません。スキルと時間が不足しているため、それを理解できませんでした(実際に@ user4815162342のアドバイスから結果を得ました!)。
1) GTK_WINDOW_POPUP
でポップアップ ウィンドウを作成します。
2) ポップアップの位置を中央に設定し、背景色と不透明度のレベルとサイズを変更します。
3) ラベルを作成し、それを CONTAINER(popup) に追加します。
4)ポップアップをタイムアウトに接続しましたgtk_timeout_add(timeInMS, fadeOutCallback, popup);
5)次のようなコールバックを作成します:

int MyClass::fadeOutCallback(gpointer caller)  
{  
    gtk_window_set_opacity(GTK_WINDOW(caller), gtk_window_get_opacity(GTK_WINDOW(caller)) - 0.03);  //The 0.03 makes the rate at fading out

    if(gtk_window_get_opacity(GTK_WINDOW(caller)) == 0) //When the popup is completly opaque
    {
        gtk_widget_hide(GTK_WIDGET(caller));
        gtk_widget_destroy(GTK_WIDGET(caller));
        return false; //stop the timer
    }
    return true; //Keeps on calling the callback until the timer reaches timeInMS
}

私がやりたいことを行うためのもっと良い方法があるかもしれませんが、これはバックグラウンドビデオフィードが再生されていても魅力的です. これが誰にも役立つことを願っています。(そして、あなたの入力@ user4815162342に再び感謝します!)。

于 2013-04-30T08:57:45.927 に答える
2

リンクされた回答について詳しく説明します。いくつかの基本:

  • gtk_widget_get_snapshotライブ ウィジェットをウィジェットのコンテンツを含む画像に変換します。この写真は、フェードアウトするものです。

  • Cairoは、透明度を含むさまざまな描画プリミティブを実装するグラフィック API です。Cairo はすべての GTK 描画にも使用されるため、すべての GTK アプリケーションは既に cairo に依存しており、cairo は GTK に簡単に接続できます。

フェードアウト アニメーションは、次の 3 つのステップで実行できます。

  1. で最上位ウィンドウをポップアップし、GTK_WINDOW_POPUPその中にコンテンツを挿入し、メインループをスピンして描画します。gtk_widget_get_snapshotウィジェットの画像を取得して保存するために使用します。

  2. GtkDrawingAreaダイアログの内容を表示するウィジェットを削除し、横に設定した画像を継承して表示するカスタム ウィジェットに置き換えます。

  3. cairo を使用して一度に 1 ステップずつピックスマップを徐々にフェードアウトさせるタイムアウト関数をスケジュールし、そのたびに描画領域をダーティとしてマークすることで、ますますフェードしたピックスマップが再描画されるようにします。メイン ループに戻り、アニメーションを再生します。

2 番目が経過したら、最上位ウィンドウを破棄します。

于 2013-04-27T19:15:51.590 に答える