C 如何确定Gtk+中的非矩形绘图区域;3和开罗?
显示了如何使用C 如何确定Gtk+中的非矩形绘图区域;3和开罗?,c,gtk,cairo,gtk3,inkscape,C,Gtk,Cairo,Gtk3,Inkscape,显示了如何使用GdkEventExpose.region字段为重新呈现小部件提供细粒度区域。我们已经在Inkscape中执行了类似的操作,以避免在绘图画布上渲染过多的复杂内容 但是,本指南中的示例演示了如何对旧的Gtk+2 expose_事件处理程序执行此操作 如何在新的Gtk+3绘图处理程序中执行等效操作,该处理程序接收一个“ready clipped”Cairo上下文作为参数,而不是一个GdkEventExpose 我想一种可能是在“ready clipped”cairo上下文中使用cair
GdkEventExpose.region
字段为重新呈现小部件提供细粒度区域。我们已经在Inkscape中执行了类似的操作,以避免在绘图画布上渲染过多的复杂内容
但是,本指南中的示例演示了如何对旧的Gtk+2 expose_事件处理程序执行此操作
如何在新的Gtk+3绘图处理程序中执行等效操作,该处理程序接收一个“ready clipped”Cairo上下文作为参数,而不是一个GdkEventExpose
我想一种可能是在“ready clipped”cairo上下文中使用
cairo\u copy\u clip\u rectangle\u list
,以获得组成要绘制区域的矩形列表。有没有人有使用这个的经验?这似乎是一种明智的方法吗?因为我没有多少线索,所以我决定检查源代码。GDK在窗口上发出一个GDK_EXPOSE
事件,并为此创建GdkEventExpose
实例
然后通过gtk\u widget\u send\u expose()在gtk/gtkmain.c中处理此事件:
此函数将cairo\u t
剪辑为GdkEventExpose.region
,如您在文档中所了解的
然后调用\u gtk\u widget\u draw\u internal()
就我所见,这里没有任何东西可以让你直接访问剪辑区域。在gtk\u widget\u send\u expose()
中,GdkEvent
作为用户数据添加到cairo上下文中。但是,这是不可访问的,因为所有涉及的函数和变量都是静态的。因此,您必须使用cairo\u copy\u clip\u rectangle\u list()
然而,这听起来相当低效。首先gdk\u cairo\u region
将该区域转换为对cairo\u rectangle
的多次调用,然后cairo将其从内部表示转换为cairo\u rectangle\u list\t
(如果剪辑出于某种原因不是区域,则可能会失败)。如果您认为这很慢,那么直接将一些快捷方式添加到gtk可能是有意义的。是的,您应该在小部件的::draw()信号处理程序中获得的cairo上使用cairo\u copy\u clip\u rectangle\u list()。有关示例,请参见此提交:
谢谢。。。只是刚刚发现了这个答案!我最终使用您指出的方法实现了它:)