c - 在绘图回调中绘图和在绘图回调外绘图
问题描述
在https://developer.gnome.org/gtk3/stable/ch01s05.html中解释了使用 Cairo 在 Gtk3 中的自定义绘图。在
这里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);
同样地,另一个填充的红色矩形clear_surface
被调用 from configure_event_cb
,我得到一个奇怪的行为,蓝色矩形没有被画笔覆盖,但红色矩形被覆盖,如下图所示:
谁能解释这种行为,以便我可以在我正在开发的应用程序中正确地制作自定义图纸。
解决方案
因此,在clear_surface
/configure_event_cb
中,您绘制到surface
,这也是画笔绘制到的表面。由于画笔是稍后绘制的,因此它最终位于您在此处绘制的红色矩形的顶部。
在draw_cb
中,用于绘图的这个临时表面被复制到屏幕上。如果您之后在屏幕上绘制一个蓝色矩形,这个蓝色矩形最终会出现在您之前绘制的内容之上。
所以基本上:原因是这里使用了两个不同的绘图目标。一个是屏幕上的“实际东西”,它可以随时消失。另一个是在其中创建的内表面configure_event_cb
,不会意外消失。
推荐阅读
- mysql - 如何从sql中的周数和日期获取日期?
- multithreading - atomic.Load 和 atomic.Store 的意义何在
- vimeo - 如何使用 Vimeo API 获取视频文件的直接链接?
- pdf - 如何在 OctoberCMS 中使用 DynamicPDF 插件从后端编辑/更新视图中导出 PDF
- entity-framework - 如何使用具有单独服务或微服务的实体框架的单个大模型创建数据库
- python - 如何使用 for 循环创建和编写文件?
- javascript - 如何获取节点的所有父数据?
- javascript - Javascript ES6 类应该用作 React 状态吗?
- javascript - 如何使 iff 语句检测文本框中的任何文本
- xml - Spring Batch 在读取 XML 时不填充对象