2

描画用のGTK#アプリケーションでCairoを使用しています。別のウィンドウが描画されたコンテンツの一部をカバーすると、描画されたコンテンツのオーバーラップした部分が失われます。それを永続的にする方法はありますか?

コンテンツを描画するための簡単な方法は次のとおりです。

void UpdateConnectionLines ()
{
    GdkWindow myWindow = GetGdkWindow();
    myWindow.Clear ();
    using (Context g = Gdk.CairoHelper.Create (myWindow))
    {
        g.Save ();
        g.MoveTo (0, 20);
        g.LineTo (100, 20);
        g.Restore ();
        g.Color = new Color (0, 0, 0);
        g.LineWidth = 1;
        g.Stroke();
    }
}
4

2 に答える 2

3

フォームに直接描画している場合は、フォームのペイントイベントで描画する必要があります。これにより、フォームがペイントされるたびに(つまり、別のウィンドウがフォームを覆って移動したとき、サイズが変更されたときなど)、フォームが確実に存在するようになります。 。)

于 2011-02-13T14:57:12.090 に答える
-1

John Koernerの答えを評価して、すべてのGTK#ウィジェットで機能する解決策を見つけました。私はジェネリックWidgetEvent ExposeEvent(ありがとう、ptomato)を使用して再描画します。

イベントハンドラーに次のコマンドを追加します

this.ExposeEvent += new global::Gtk.ExposeEventHandler (this.Handle_ExposeEvent);

次に、ハンドラーは私のメソッドを呼び出すだけです。

protected virtual void Handle_ExposeEvent (object o, Gtk.ExposeEventArgs args)
{
    UpdateConnectionLines();
}

編集:

実際、私はRTF Mを正しく持っていません。これは、次のように明示的に述べているためです。

コンテキストを作成して使用するのに最適な場所は、特定のウィジェットのExposeEventです。通常、このタスクにはGtk.DrawingAreaを使用する必要があります。Exposeイベントメソッドの実装例:

于 2011-02-13T15:56:51.297 に答える