在GTK中窗口重叠时丢失的绘制内容#

时间:2011-02-13 12:58:30

标签: c# gtk# cairo

我在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();
    }
}

2 个答案:

答案 0 :(得分:3)

如果您直接在表单上绘图,那么您需要在Form的绘制事件中进行绘制,以确保每次绘制表单时都存在(即当另一个窗口覆盖它然后移动时,当它调整大小时) ,...)

答案 1 :(得分:-1)

评估John Koerner的答案,我找到了一个适用于每个GTK#小部件的解决方案。我使用 generic 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,因为它明确指出:

  

创建和使用的最佳位置   Context是ExposeEvent的   给定小部件。通常你会想要   使用Gtk.DrawingArea执行此任务。   一个示例实现   公开事件方法: