在draw callback中绘制和在draw callback之外绘制

Drawing in draw call-back and drawing outside draw call-back

使用 Cairo 在 Gtk3 中自定义绘图在 https://developer.gnome.org/gtk3/stable/ch01s05.html 中进行了说明 这里 draw_brush 在 motion-notify-event 的处理程序中随着鼠标的拖动绘制小矩形。在原始代码中没有其他绘图。假设我通过添加以下代码在 draw_cb 中绘制一个填充的蓝色矩形:

cairo_set_source_rgb(cr,0.1,0.1,0.8);
cairo_rectangle(cr,80,80,50,50);
cairo_fill(cr);

以及从 configure_event_cb 调用的 clear_surface 中的另一个填充红色矩形,我得到一个奇怪的行为,其中蓝色矩形没有被画笔覆盖,但是红色矩形被覆盖,如下图所示:

任何人都可以解释这种行为,以便我可以在我正在开发的应用程序中正确地制作自定义绘图。

因此,在 clear_surface / configure_event_cb 中,您绘制到 surface,这也是画笔绘制到的表面。由于画笔是稍后绘制的,因此它最终位于您在此处绘制的红色矩形之上。

draw_cb中,用于绘图的这个临时表面被复制到屏幕上。如果您之后在屏幕上绘制一个蓝色矩形,这个蓝色矩形最终会位于您之前绘制的矩形之上。

所以基本上:原因是这里使用了两个不同的绘图目标。一种是屏幕上的"actual stuff",它随时可能消失。另一个是在 configure_event_cb 中创建的内部表面,不会意外消失。