使用 Gtk3 和 Cairo 绘制到 GdkWindow 根窗口

Posted

技术标签:

【中文标题】使用 Gtk3 和 Cairo 绘制到 GdkWindow 根窗口【英文标题】:Draw to GdkWindow root window with Gtk3 and Cairo 【发布时间】:2021-06-30 13:44:57 【问题描述】:

我希望能够使用 Cairo 使用 Gtk3 直接绘制到根窗口。我在这样的全屏窗口上绘制了旧的 Gtk2 代码:

GdkWindow* drawable; 
GdkGC* gc;

drawable = gdk_screen_get_root_window (gdk_screen_get_default());

gc = gdk_gc_new (drawable);
gdk_gc_set_subwindow (gc, GDK_INCLUDE_INFERIORS);

...

do_draw(drawable, gc);

我用 Gtk3 试过这个,

GdkWindow* drawable; 

drawable = gdk_screen_get_root_window (gdk_screen_get_default());

cairo_surface_t *source_surface = gdk_window_create_similar_surface (drawable, CAIRO_CONTENT_COLOR_ALPHA, gdk_window_get_width(drawable), gdk_window_get_height(drawable) );
cairo_t *cairo = cairo_create(source_surface);
cairo_set_source_surface(cairo, source_surface, 0, 0);

....
do_draw(cairo);

代码似乎运行良好,但屏幕上没有任何内容。有没有办法用 Gtk3 和 Cairo 做类似的事情?

【问题讨论】:

【参考方案1】:

gdk_window_create_similar_surface 创建一个与已经给定的表面“相似”的新表面。但它仍然是一个新的表面。

您正在寻找 gdk_cairo_create(),我认为(已弃用)。


与您的问题无关,但以下代码应该做什么?为什么要准备将表面复制到自身?我认为这在开罗实际上是不允许的。

cairo_t *cairo = cairo_create(source_surface);
cairo_set_source_surface(cairo, source_surface, 0, 0);

【讨论】:

是的,我正在寻找 gdk_cairo_create 的替代选项,现在已弃用,所以在阅读了这篇文章 drawing-in-gtk 后我决定使用 gdk_window_create_similar_surface

以上是关于使用 Gtk3 和 Cairo 绘制到 GdkWindow 根窗口的主要内容,如果未能解决你的问题,请参考以下文章

将 cairo 与 gtk3 一起使用

Gtk3 和 cairo g_timeout_add 不起作用

使用 Cairo 的 Ruby Gtk3 内存泄漏

如何在Haskell gtk2hs中将Cairo绘图渲染到打印机

如何在 Gtk 下创建 cairo-gl 曲面

Gtk3和开罗动画抽搐