【问题标题】:Drawn content lost on window overlap in GTK#在 GTK 中窗口重叠时绘制的内容丢失#
【发布时间】:2011-02-13 12:58:30
【问题描述】:

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

【问题讨论】:

    标签: c# gtk# cairo


    【解决方案1】:

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

    【讨论】:

    • 我在 GTK# 文档中找不到 Paint 事件,也没有得到 Monodevelop 中 Gtk.Window 或 Gtk.Widget 类的提示。
    • 绘制事件是 GTK 2 中的信号 expose-event 或 GTK 3 中的 draw
    【解决方案2】:

    评估 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();
    }
    

    编辑:

    实际上,我没有正确地 RTFM,因为它明确指出:

    创建和使用 上下文是 ExposeEvent 的 给定的小部件。通常你会想要 使用 Gtk.DrawingArea 来完成这个任务。 的示例实现 暴露事件方法:

    【讨论】:

    • 什么?每次有活动都要重新粉刷?为什么不在油漆处理程序中作画?
    • 你有对 GTK# 的绘制处理程序的引用吗?我在文档中找不到处理程序。
    • 它应该是WidgetExposeEvent,至少对于GTK 2。WidgetEvent 会在任何时候触发任何事件,包括暴露事件,所以这是可行的,但它真的很浪费。
    • 如果你基本上听从了约翰的建议,那你为什么不接受他的回答呢?
    猜你喜欢
    • 2020-07-28
    • 2013-01-28
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2015-08-02
    • 2012-02-12
    相关资源
    最近更新 更多