
Ubuntu日本語フォーラム

ログインしていません。
カテゴリ違いならすみません。
現在ubuntuの12.04でgtk+3.0でcairoを使って線の描画をするプログラムを書いているのですが、なかなかうまくいかないので質問します。
描画する関数は以下の通りです。
expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
{
GdkWindow *drawable = gtk_widget_get_window(widget); //<------◎
cairo_t *cr;
double line_width = 30.0;
cr = gdk_cairo_create( drawable );
cairo_set_line_width( cr, line_width );
cairo_set_source_rgb( cr, 1.0, 0.0, 0.0);
cairo_set_line_cap( cr, CAIRO_LINE_CAP_BUTT);
cairo_move_to( cr, 50, 50);
cairo_line_to( cr, 100, 100);
cairo_stroke( cr);
cairo_destroy( cr);
return(FALSE);
}
こちらを実行してもウィンドウは表示されるものの線の描画をしてくれません。
参考にサイトなどがgtk2で書いていたものなので◎のところは変更しましたが他に手を加える箇所があれば教えてください。
またgtk3を用いて描画するサンプルプログラムを書いてくれると非常に助かります。
オフライン
大分時間が経っていますが、解決されたでしょうか?
コードの部分だけでは判断できませんが、
gtk_window_newで作成したウィンドウに直接描画
しようとしているのならば上手くいかないかもしれません。
手っ取り早いところだとgtk_drawing_areaウィジェットを作成して
gtk_widget_set_size_requestでサイズを指定、
g_signal_connectでdrawing_areaウィジェットに
exposeイベントを設定するのが良いかと。
線を描画するコードはこれで問題ないと思います。
オフライン
GTK+3のdrawシグナルを利用して以下のようにすれば描画できます。
#include <gtk/gtk.h>
gboolean draw(GtkWidget *widget, cairo_t *cr)
{
double line_width = 30.0;
cairo_set_line_width(cr, line_width);
~~~~ 略 ~~~~
cairo_stroke(cr);
// cairo_destroy しない
return(FALSE);
}
int main(int argc, char *argv[])
{
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
// draw シグナルを使う
g_signal_connect (window, "draw", (GCallback)draw, NULL);
g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
// ウィジェット(ウィンドウ)に描画できるようにする
gtk_widget_set_app_paintable(window, TRUE);
gtk_widget_show(window);
gtk_main();
return 0;
}オフライン