【发布时间】:2014-01-15 15:45:30
【问题描述】:
我正在尝试在我的 GTK 2.0 应用程序中实现来自问题 How to create a cairo_t on a Gtk 2 window 的建议,结果让我感到困惑。错误输出是
planes_view.c: In function ‘draw_lines_planes’:
planes_view.c:145:33: warning: passing argument 1 of ‘gdk_cairo_create’ from incompatible pointer type [enabled by default]
cr = gdk_cairo_create((struct GdkDrawable *)(view->drawing_area));
^
In file included from /usr/include/gtk-2.0/gdk/gdk.h:33:0,
from /usr/include/gtk-2.0/gtk/gtk.h:32,
from planes_view.h:35,
from planes_view.c:34:
/usr/include/gtk-2.0/gdk/gdkcairo.h:33:10: note: expected ‘struct GdkDrawable *’ but argument is of type ‘struct GdkDrawable *’
cairo_t *gdk_cairo_create (GdkDrawable *drawable);
^
请注意,这两种冲突的类型是相同的。怎么会这样?也许有两种同名的类型?即使是这样,我也需要知道如何正确地做到这一点。
违规行原本是
cr = gdk_cairo_create(view->drawing_area);
抱怨的是绘图区域的声明类型是 GtkWidget *,所以我尝试了一个普通的类型转换:
cr = gdk_cairo_create((struct GdkDrawable *)(view->drawing_area));
结果如上所示。
【问题讨论】:
-
你能把它缩减为一个最小的可编译示例吗? (我的直觉告诉我,你对结构的定义不兼容,但我认为这不是你会看到的错误。)
-
尝试删除关键字“struct”。我猜 GdkDrawable 已经是 typedef 了。
-
你不能只是把东西转换成它们不是的东西(GtkWidget 不是 GdkDrawable)。您想要的 GdkDrawable 可能是
view->drawing_area->window,但为什么不按照我在原始答案中所做的操作:widget->window(假设暴露处理程序的第一个参数称为小部件)? ...实际上现在我想起来了:gtk_widget_get_window (widget)将是最好的方法。