Das liegt in diesem Fall nicht an gtk, du benutzt gtk schon richtig, abgesehen
davon dass du nicht set_visible oder show beim expose-event aufrufen musst.
Hier hakt es an cairo, du benutzt fill, fill ist aber dazu da einen path zu
füllen, um einen path zu füllen musst du aber erst mal einen path definieren.
Hier mal ein simples Beispiel in C (ich habe keine Lust mit mit C++
herumzuschlagen, sollte aber klar sein wie es in C++ funktioniert):
gboolean
on_expose(GtkWidget *area, GdkEventExpose *e, gpointer data)
{
GdkWindow *win = gtk_widget_get_window(area);
cairo_t *c = gdk_cairo_create(win);
cairo_set_source_rgb(c, 0.8, 0, 0);
// definiert den pfad
cairo_rectangle(c, 10, 10, 100, 100);
cairo_fill(c);
cairo_destroy(c);
return TRUE;
}
Das zeichnet an der Position (10, 10) ein 100x100 pixel großes rotes Quadrat auf
die DrawingArea. Um die gesamte DrawingArea zu füllen musst du paint aufrufen,
das wendet den Zeichenoperator auf die gesamte DrawingArea an:
gboolean
on_expose(GtkWidget *area, GdkEventExpose *e, gpointer data)
{
GdkWindow *win = gtk_widget_get_window(area);
cairo_t *c = gdk_cairo_create(win);
cairo_set_source_rgb(c, 0.8, 0, 0);
cairo_paint(c);
cairo_destroy(c);
return TRUE;
}