同じことをGTK+2で書いてみる #3
cairotest5.cでは背景の色を白にするために、
make_offscreen()内でイメージサーフェスを矩形で塗り潰してから、
draw_hello()へサーフェスを渡すという面倒なことを行っている。
しかし、これはもっと簡単に実現できる。
gtk_widget_modify_bg()でGtkDrawingAreaの背景色を変更すれば済む。
--- cairotest5.c # +++ cairotest6.c # @@ -13,6 +13,7 @@ GtkWidget *win; GtkWidget *da; cairo_surface_t *surf = make_offscreen(); + GdkColor WHITE[] = {{0, 65535, 65535, 65535}}; gtk_init(&argc, &argv); win = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -20,6 +21,7 @@ gtk_container_add(GTK_CONTAINER(win), da); gtk_window_resize(GTK_WINDOW(win), WIDTH, HEIGHT); gtk_window_set_title(GTK_WINDOW(win), "Hello"); + gtk_widget_modify_bg(da, GTK_STATE_NORMAL, WHITE); g_signal_connect(da, "expose-event", G_CALLBACK(on_expose), surf); g_signal_connect(win, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(win); @@ -31,11 +33,6 @@ cairo_surface_t *make_offscreen(void) { cairo_surface_t *surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT); - cairo_t *cr = cairo_create(surf); - cairo_rectangle(cr, 0, 0, WIDTH, HEIGHT); - cairo_set_source_rgb(cr, 1, 1, 1); - cairo_fill_preserve(cr); - cairo_destroy(cr); draw_hello(surf); return surf; }
make_offscreen()の中身が随分簡単になる。
色の指定は、
GdkColor white = {0, 65535, 65535, 65535}; ...snip gtk_widget_modify_bg(da, GTK_STATE_NORMAL, &white);
でもよい。というよりも、こちらの方が普通だろう。
実はcairotest5.cを書いている時に、
gtk_widget_modify_bg()で変更しようとしたのだが、
全く反映されず背景色はデフォルトから変わらなかった。
環境がWindowsだと機能しないのかと思い、
内部が白色の矩形でわざわざ塗り潰してからdraw_hello()に引き渡すという面倒な処理を書いていた。
原因は単純ミスでGtkDrawingAreaではなくGtkWindowの方の背景を一生懸命変更しようとしていただけだった。