お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2012-11-18 23:11:38

futatsuya710
メンバ
登録日: 2012-08-27

GDK3のCairoの使い方

GTK+3を学習しているうちに、GDKでウィンドウ上に描画するプログラムを見つけました。
使ってみたいのですが、3.x対応のサンプル・プログラムが見つかりません。
ウィンドウ上に長方形を描画するサンプル・プログラムを、コンパイルが通る所まで書き直してみました。

#include <gtk/gtk.h>
#include <gdk/gdk.h>

GtkWidget *window;

static gboolean cb_expose_event(GtkWidget *widget, cairo_t *cr, gpointer data)
{
  cr = gdk_cairo_create(GDK_WINDOW(window));
  cairo_set_line_width(cr, 5.0);   //線の太さ
  cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND); //角を丸くする

  //長方形の描画
  {
    //色の指定(外枠)
    cairo_set_source_rgb(cr, 0.0, 1.0, 0.0);
    //長方形を描画
    cairo_rectangle(cr, 50.0, 50.0, 50.0, 50.0);
    //長方形の外枠を作る
    cairo_stroke_preserve(cr);
    //色の指定(塗りつぶす色)
    cairo_set_source_rgb(cr, 0.8, 1.0, 0.8);
    //長方形を塗りつぶす
    cairo_fill(cr);
  }

  cairo_destroy(cr);
  return FALSE;
}

int main(int argc, char *argv[])
{
  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "rectangle");
  gtk_widget_set_size_request(window, 400,200);

  //ウインドウに図形を描けるように設定
  gtk_widget_set_app_paintable(window, TRUE);
  gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK);

  //ウインドウが表示されたときにcb_expose_event()を呼び出す
  g_signal_connect(G_OBJECT(window), "expose-event", G_CALLBACK(cb_expose_event), NULL);
  g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

  gtk_widget_show_all(window);
  gtk_main();
  return 0;
}

実行してウィンドウを表示させると、端末に
(test:7343): GLib-GObject-WARNING **: /build/buildd/glib2.0-2.34.0/./gobject/gsignal.c:2459: signal `expose-event' is invalid for instance `0x23f30c0'
というメッセージが表示され、ウィンドウに何も表示されません。

devhelp>GDK 3 Reference Manual>Cairo Interaction
に記載されているのは、最初のgdk_cairo_createと、cairo_destroyくらいです。
cb_expose_event関数内の処理を説明するマニュアルが見当たらないため、Cairoが使えません。
上記プログラムの訂正点、もしくはGDK3 Cairoを扱った情報をご存知であれば、ご助言いただけると助かります。
よろしくお願い致します。

オフライン

 

#2 2012-11-19 01:55:21

n_gram_8
新しいメンバ
登録日: 2012-11-14

Re: GDK3のCairoの使い方

まず対象のエラーについては "expose-event" シグナルが "draw" シグナルに置き換えられたようなのでそちらに変えましょう。
コードで言うと

g_signal_connect(G_OBJECT(window), "expose-event", G_CALLBACK(cb_expose_event), NULL);

の "expose-event" を "draw" に変えましょう。

これを変えただけでは別のエラーが出ると思いますので、

cr = gdk_cairo_create(GDK_WINDOW(window));

の引数の部分を

cr = gdk_cairo_create(gtk_widget_get_window(widget));


cr = gdk_cairo_create(gtk_widget_get_window(window));

に変えましょう。
前者のほうがcb_expose_event関数だけを見て意味がわかりやすくなり、流用もしやすいと思います。
今後もグローバル変数のウィジェットにしか描写をしないのであれば後者でも良いと思います。

GDK3 Cairoを扱った情報は他のところは知りません。
古いバージョンのGDK Cairoであれば菅谷保之著書の「入門GTK+」
(http://www.iim.ics.tut.ac.jp/~sugaya/wiki/wiki/index.php?GTK%2FGNOME%A4%CB%A4%E8%A4%EBGUI%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0)
に日本語で書いてあるので、これを参考にGDKのバージョンの違いでエラーになるところを調べて直すだけでも結構書けると思います。
今回の内容も「"signal `expose-event' is invalid for instance"」でGoogle検索すれば3,4番目のサイトに原因が書いてありました。
(ただしエラーメッセージの検索で日本のサイトがヒットすることはあまり期待できません。)

オフライン

 

#3 2012-11-19 09:38:27

futatsuya710
メンバ
登録日: 2012-08-27

Re: GDK3のCairoの使い方

n_gram_8様、アドバイスありがとうございます。
コンパイルに成功し、長方形の他、円も描く事ができるようになりました。
また、書籍を勧めていただいてありがとうございます。
まずはバージョンが古くても、サンプル・プログラムを入手し、
徐々にコンパイル・エラー、もしくは実行エラーを解決できるようにして行きたいです。
アドバイスをいただき、御礼申し上げます。

オフライン

 

Board footer

Powered by FluxBB