お知らせ

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

#1 2012-10-25 18:06:24

futoshi
新しいメンバ
登録日: 2012-10-25

ubuntu 12.04 gtk+3.0 cairo C言語 線の描画

カテゴリ違いならすみません。
現在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を用いて描画するサンプルプログラムを書いてくれると非常に助かります。

オフライン

 

#2 2012-12-27 22:32:44

umi
新しいメンバ
登録日: 2012-09-12

Re: ubuntu 12.04 gtk+3.0 cairo C言語 線の描画

大分時間が経っていますが、解決されたでしょうか?

コードの部分だけでは判断できませんが、
gtk_window_newで作成したウィンドウに直接描画
しようとしているのならば上手くいかないかもしれません。

手っ取り早いところだとgtk_drawing_areaウィジェットを作成して
gtk_widget_set_size_requestでサイズを指定、
g_signal_connectでdrawing_areaウィジェットに
exposeイベントを設定するのが良いかと。

線を描画するコードはこれで問題ないと思います。

オフライン

 

#3 2012-12-28 09:02:05

vbk
メンバ
From: Lake Hamana in Hamamatsu
登録日: 2009-12-22

Re: ubuntu 12.04 gtk+3.0 cairo C言語 線の描画

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;
}

オフライン

 

Board footer

Powered by FluxBB