我在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();
}
}
答案 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执行此任务。 一个示例实现 公开事件方法: