使用 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 根窗口的主要内容,如果未能解决你的问题,请参考以下文章
Gtk3 和 cairo g_timeout_add 不起作用