シグナルハンドラの実装 〜描画領域の表示〜


描画領域のシグナルハンドラ

GTK+ リファレンスマニュアル のGtkDrawingAreaの章によると、 描画領域に描画するには、"expose_event"のハンドラを用いることがわかります。 また、GTK+ Reference Manual によると、ユーザからの入力を行うためんは、マウスとボタン押下シグナルを使うとあります。 これに相当するシグナルは、"button_press_event"(マウスボタンを押す)、 "button_release_event"(マウスボタンを離す)、 "motion_notify_event"(マウスポインタを動かす)に相当します。 尚、これらのシグナルを受け取るには、gtk_widget_add_events()を使用する 必要があります。 とりあえず、この4つのイベントを追加します。 追加の方法は、「ウインドウのクローズ」 での方法と同じです。描画領域を選択し、プロパティウインドウのシグナルタブ から追加します。追加すると図16のようになります。
図16 描画領域のシグナルハンドラ
描画領域のシグナルハンドラ
ここでコードを生成すると、シグナルハンドラが生成されます。 リファレンスマニュアルには、楕円を描画するコードがサンプルとして 載せられています。 そこで、とりあえず、on_drawingarea1_expose_event() (callbacks.c)に 実装します。

gboolean
on_drawingarea1_expose_event           (GtkWidget       *widget,
                                        GdkEventExpose  *event,
                                        gpointer         user_data)
{
  gdk_window_clear_area (widget->window,
                         event->area.x, event->area.y,
                         event->area.width, event->area.height);
  gdk_gc_set_clip_rectangle (widget->style->fg_gc[widget->state],
                             &event->area);
  gdk_draw_arc (widget->window,
                widget->style->fg_gc[widget->state],
                TRUE,
                0, 0, widget->allocation.width, widget->allocation.height,
                0, 64 * 360);
  gdk_gc_set_clip_rectangle (widget->style->fg_gc[widget->state],
                             NULL);


  return TRUE;
}
これをコンパイルすると、図17のように黒い楕円が表示されます。
図17 楕円の描画
楕円の描画
gdk_window_clear_area()は、描画領域をクリアします。 gdk_draw_arc()は、楕円の描画をします。 gdk_gc_set_clip_rectangle()が何のためにあるのかは今の時点では 分かりません。無くても描画動作としては、変化はありません。 リファレンスを見ても、クリッピングを行うとあるので、 描画するだけならば、不要かと思っています。 これが何のために存在しているのかご存知の方はお知らせください。
シグナルハンドラの実装 〜直線の描画〜
GTK/GDK/gladeによるプログラムメモ Topへ
Copyright (C) 2004 Kohta NAKASHIMA
All Rights Reserved.