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,因为它明确指出:

创建和使用 Context 的最佳位置是给定小部件的 ExposeEvent。通常你会想要使用 Gtk.DrawingArea 来完成这个任务。Expose 事件方法的示例实现:

于 2011-02-13T15:56:51.297 回答