【发布时间】:2019-08-28 19:38:23
【问题描述】:
我正在尝试使用 cairo 绘制一些弧线,但 gcc 警告我 gdk_cairo_create() is deprecated. Use gdk_window_begin_draw_frame() and gdk_drawing_context_get_cairo_context() instead。
为了解决这个问题,我做了一些研究,发现对于 gdk_window_begin_draw_frame() 我需要“GdkWindow”。我一直在为我的窗口使用 GtkWidget,所以我需要将“GtkWidget”转换为“GdkWindow”,但是 gtk_widget_get_window () 返回 NULL 并导致段错误。
#include <gtk/gtk.h>
#include <cairo.h>
void main(int argc , char **argv){
gtk_init(&argc , &argv);
GtkWidget *win;
GdkWindow *gdkwin;
GdkDrawingContext *dc;
cairo_region_t *region;
cairo_t *cr;
win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
region = cairo_region_create();
gdkwin = gtk_widget_get_window(GTK_WIDGET(win));
//Here gdkwin should contain a GdkWindow but it's NULL.
gc = gdk_window_begin_draw_frame(gdkwin , (const cairo_region_t*)®ion);
...
...
这是运行时错误:
(a.out:6852): Gdk-CRITICAL **: 23:53:06.042: gdk_window_begin_draw_frame: assertion 'GDK_IS_WINDOW (window)' failed
(a.out:6852): Gdk-CRITICAL **: 23:53:06.042: gdk_drawing_context_get_cairo_context: assertion 'GDK_IS_DRAWING_CONTEXT (context)' failed
Segmentation fault
我想获取一个 cairo 对象并将其用于 cairo_arc()。
谢谢。最好的问候。
【问题讨论】:
-
为什么要绘制到
main()中的窗口?此时,您的窗口很可能还不可见,并且任何绘图(在 X11 上完成)都将丢失。我猜你得到的NULL是因为你的GtkWindow还没有GdkWindow。请看developer.gnome.org/gtk3/stable/ch01s05.html。 -
另外,根据developer.gnome.org/gtk3/stable/…,
gtk_widget_get_window返回NULL的唯一方法是小部件尚未实现。另见developer.gnome.org/gtk3/stable/GtkWidget.html#gtk-widget-show 和developer.gnome.org/gtk3/stable/…。 -
我只需要一种方法来创建一个用于绘图的 cairo 对象,并且在 gnome 网站的那个示例中似乎“cairo_create()”可以完成工作。另外我需要改变我的编码风格所以从来没有把所有这些东西放在主程序中。提前感谢@Uli Schlachter
-
直接使用 cairo 也是一种更好的做法,因为无需担心 gdk 和那些繁琐的警告 (gdk_cairo_create)。