【问题标题】:Drawing in GtkTextView, then clearing在 GtkTextView 中绘图,然后清除
【发布时间】:2016-07-29 03:10:19
【问题描述】:

我只是在 GtkTextView 中以“draw”信号绘制特定内容,

在下一次发射信号时,我在 GtkTextView 中绘制不同的东西。


在下一次信号调用中,如果没有要绘制的内容,则清除之前的所有绘制,这很好。

但是当它要绘制新内容时,它会一次绘制所有以前的内容,而不仅仅是需要的内容。这不好。


我尝试了很多方法来防止这种行为,cairo_save()cairo_restore() 的所有可能组合似乎都没有这样做。

我怎样才能让它不一次画所有以前的画,而只画新的?

【问题讨论】:

  • 你为什么要搞乱 GtkTextView 的绘制信号?我不确定 GTK 是否支持。无论如何,你如何导致重绘?你打电话给developer.gnome.org/gtk3/stable/… 之类的东西吗?
  • 这是我可以编辑小部件自己的 cairo_t 的唯一方法。我连接信号并在处理程序内部进行条件检查。它的行为很奇怪,我无法理解。完全看不懂它的模式。它第一次不会绘制任何内容,必须多次发出信号才能绘制内容。 queue draw 有细微的差别,但我还是使用它。我认为,无论如何都会经常发出信号,主要是因为光标动画。 (闪烁/状态 w/e)
  • @UliSchlachter 我想让它画不同的东西,一次,每次我想要并清除以前的图纸。无论我尝试什么,它已经做了这些事情,但总是有些事情没有。
  • 如果你的想法只是画东西,那么考虑一下实际上打算这样使用的小部件,比如Gtk.DrawingArea。如果您想拥有更大的灵活性并更轻松地移动东西,请查找GooCanvas。如果您考虑制作某种文字处理器,您仍然需要一个类似画布的小部件。 Gtk.Overlay,如果您想在现有文本之上绘图,您可能会侥幸逃脱 - 我没有太多经验。
  • @jcoppens 两者都没有,因为使用“draw”信号时,您不会在小部件顶部绘制,而是在小部件本身上绘制。 GTK+3 现在完全用 Cairo 渲染,“draw”信号(以前是一个暴露事件)似乎是改变小部件绘制方式的唯一更高级别的方法。

标签: c gtk gtk3 cairo


【解决方案1】:

“draw”信号应该只用于改变 GtkTextView 的常量外观。


对于我想要的,这可能会按要求工作:

void draw_on_textview (GtkWidget* textview)
{
    cairo_t* cr = gdk_cairo_create(gtk_widget_get_window(textview));

    // Do ALL the drawing AT ONCE here..

    cairo_destroy(cr);
}

当需要删除内容时:

gtk_widget_queue_draw(textview);

但是,这仍然与适当的方法略有不同。正如@jcoppens 所说,必须使用draw_layer。所以我不认为这是一个答案,但如果没有其他人可以提供更好的方法,我可以选择使用一些可能的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多