如何在其绘制信号处理程序中获取 GtkDrawingArea 的无效区域

Tit*_*now 2 gtk cairo pygobject pycairo gtk3

GtkDrawingArea 的参考手册中,它说

\n\n
\n

当绘图区域第一次出现在屏幕上时,或者当它被另一个窗口覆盖然后又被覆盖时,通常会传递绘图信号。您还可以通过添加到绘图区域\xe2\x80\x99s窗口的​​\xe2\x80\x9cdamage区域\xe2\x80\x9d来强制暴露事件;gtk_widget_queue_draw_area()并且gdk_window_invalidate_rect()都是同样好的方法来做到这一点。然后,您\xe2\x80\x99将获得无效区域的绘制信号。

\n
\n\n

那么我怎样才能在绘制信号的处理程序中获取无效区域呢?\n它是剪辑区域吗?

\n

and*_*abs 5

信号本身的文档draw对此进行了回答:

信号处理程序将获得一个cr剪辑区域,该区域已设置为小部件的脏区域,即需要重新绘制的区域。想要完全避免重绘自身的复杂小部件可以使用 获取剪辑区域的完整范围gdk_cairo_get_clip_rectangle(),或者可以使用 获取脏区域的更细粒度的表示cairo_copy_clip_rectangle_list()

gdk_cairo_get_clip_rectangle()是使用整数而不是浮点坐标的包装器cairo_clip_extents(),因此如果您想要浮点坐标,也可以使用后一个函数。