在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
中创建的内部表面,不会意外消失。
使用 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
中创建的内部表面,不会意外消失。