ソフトウェア設計及び演習2016

GDK2016::exposeイベント

exposeイベント

  • 画面の再描画が必要になったとき起こるイベント
    • ウィンドウが初めて可視化されたとき,
    • 他のウィンドウの後ろにあったものが,前に来たとき,など

exposeイベントの設定

void gtk_widget_set_events (GtkWidget *widget,
                            gint events);
#define g_signal_connect(instance, detailed_signal, c_handler, data)
void gdk_cairo_set_source_pixmap (cairo_t *cr,
                                  GdkPixmap *pixmap,
                                  double pixmap_x,
                                  double pixmap_y);
ピクスマップをドローイングエリアにコピーする
  • main関数
  /* exposeイベントのコールバックを設定 */
  gtk_widget_set_events(widget, GDK_EXPOSURE_MASK);
  /* 最後の引数はコールバックの第3引数になる */
  g_signal_connect(G_OBJECT(widget), "expose_event",
                   G_CALLBACK(cb_expose_event), pixmap);
  • コールバック関数
/* exposeイベントのコールバック */
static gint
cb_expose_event(GtkWidget *widget, GdkEventExpose *event, GdkPixmap *pixmap)
{
  cairo_t *cr;

  /* ピクスマップをドローイングエリアに必要な部分だけコピー */
  /* ドローイングエリアからコンテキスト&サーフェスを作成 */
  cr = gdk_cairo_create(widget->window);

  /* ソースをピクスマップにセット */
  gdk_cairo_set_source_pixmap(cr, pixmap,
                              0.0, 0.0);
  /* 必要な部分だけを塗りつぶす */
  cairo_rectangle(cr,
                  event->area.x, event->area.y,
                  event->area.width, event->area.height);
  cairo_fill(cr);

  /* 使い終わったコンテキストを破棄 */
  cairo_destroy(cr);

  return FALSE;
}
  • 再描画が必要な領域の情報は、コールバック関数の第2引数eventに入っている


最終更新日:2015/05/29 09:35:58