我試圖在我的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));
上面顯示的結果。
你可以把它縮減到一個最小的可編譯的例子嗎? (我的直覺告訴我,你已經得到了什麼結構是不兼容的,但我不認爲這是你看到的錯誤。) – tabstop
嘗試去除關鍵字「struct」。我猜GdkDrawable已經是一個typedef。 –
你不能只將東西投射到他們不喜歡的東西上(GtkWidget不是GdkDrawable)。你想要的GdkDrawable可能是'view-> drawing_area-> window',但爲什麼不做我在原始答案中做的:'widget-> window'(假設公開處理程序的第一個參數稱爲widget)? ......現在我想到了:'gtk_widget_get_window(widget)'是最好的方法。 – jku