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

发布于 2024-10-17 11:11:18 字数 471 浏览 4 评论 0原文

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

I am using Cairo in a GTK# application for drawing. When another window covers part of the drawn content, the overlapped part of the drawn content is lost. Is there a way to make it permanent?

Here is my simplified method for drawing the content:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

听风念你 2024-10-24 11:11:19

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

If you are drawing directly on the form, then you need to do it in the Form's paint event, to ensure it is there every time the form get's painted (i.e. when another window covers it and then moves, when it is resized, ...)

云仙小弟 2024-10-24 11:11:19

通过评估 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 正确,因为它明确指出:

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

Evaluating John Koerner's answer, I have found a solution, that works for every GTK# widget. I use the generic WidgetEvent ExposeEvent (thanks, ptomato) and redraw.

I append my event handler with

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

and then the handler just calls my method:

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

EDIT:

Actually, I have not RTFM correctly, as it explicitely states:

The best place to create and use the
Context is the ExposeEvent for the
given widget. Usually you'll want to
use the Gtk.DrawingArea for this task.
An example implementation of the
Expose event method:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文