expose-event
何かを描画してから更新または再描画するために使用したい。つまり、ウィンドウには描画領域とボタンがあります。ボタンをクリックすると、それに応じて描画領域が再描画されます。私の問題は
次のコードでは、 に変更
gtk_container_add (GTK_CONTAINER (box), canvas);
するとgtk_box_pack_start(GTK_BOX(box), canvas, FALSE, FALSE, 0);
、何も描画されません。通常gtk_box_pack_start
、ボックスに何かを追加するために使用します。今回はなぜうまくいかないのでしょうか?build_ACC_axis
描画領域をリフレッシュ(描画したものを削除)し、新たな描画に備える機能です。しかし、それは描いたものを削除しませんでした。なんで?描画領域を更新するには?
ソース ファイルが test.c の場合、コンパイルは
gcc -o test test.c `pkg-config --cflags --libs gtk+-2.0`
コードは以下のとおりです。
#include <gtk/gtk.h>
#include <glib.h>
static void draw (GdkDrawable *d, GdkGC *gc)
{
/* Draw with GDK */
gdk_draw_line (d, gc, 0, 0, 50, 50);
gdk_draw_line (d, gc, 50, 50, 50, 150);
gdk_draw_line (d, gc, 50, 150, 0, 200);
gdk_draw_line (d, gc, 200, 0, 150, 50);
gdk_draw_line (d, gc, 150, 50, 150, 150);
gdk_draw_line (d, gc, 150, 150, 200, 200);
gdk_draw_line (d, gc, 50, 50, 150, 50);
gdk_draw_line (d, gc, 50, 150, 150, 150);
}
static gboolean expose_cb (GtkWidget *canvas, GdkEventExpose *event, gpointer user_data)
{
GdkGC *gc;
gc = gdk_gc_new (canvas->window);
draw (canvas->window, gc);
g_object_unref (gc);
return FALSE;
}
void build_ACC_axis (GtkWidget *button, GtkWidget *widget)
{
GdkRegion *region;
GtkWidget *canvas = g_object_get_data(G_OBJECT(widget), "plat_GA_canvas");
region = gdk_drawable_get_visible_region(canvas->window);
gdk_window_invalidate_region(canvas->window, region, TRUE);
gtk_widget_queue_draw(canvas);
/* gdk_window_process_updates(canvas->window, TRUE); */
gdk_region_destroy (region);
}
int main (int argc, char **argv)
{
GtkWidget *window;
GtkWidget *canvas, *box, *button;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(window, 500, 300);
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
box = gtk_vbox_new(FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), box);
canvas = gtk_drawing_area_new ();
g_object_set_data(G_OBJECT(window), "plat_GA_canvas", canvas);
/* gtk_box_pack_start(GTK_BOX(box), canvas, FALSE, FALSE, 0); */
gtk_container_add (GTK_CONTAINER (box), canvas);
g_signal_connect (G_OBJECT (canvas), "expose-event", G_CALLBACK (expose_cb), NULL);
button = gtk_button_new_with_label ("ok");
gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
/* gtk_container_add (GTK_CONTAINER (box), button); */
gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(build_ACC_axis), window);
gtk_widget_show_all (window);
gtk_main ();
}
2 番目の質問に答えたいと思います。ボタンをクリックすると、expose-event
シグナルが送信されて実行されますexpose_cb
。機能に変化がないのでdraw
、スッキリは見えません。以下は、更新を表示できる更新されたコードです。ポイントは変数を追加することですfactor
。しかし、最初の質問については、まだ理由がわかりませんでした。
#include <gtk/gtk.h>
#include <glib.h>
int factor;
static void draw (GdkDrawable *d, GdkGC *gc, double fac)
{
/* Draw with GDK */
gdk_draw_line (d, gc, 0, 0, 50, 50 * fac);
gdk_draw_line (d, gc, 50, 50, 50, 150);
gdk_draw_line (d, gc, 50, 150, 0, 200);
gdk_draw_line (d, gc, 200, 0, 150, 50);
gdk_draw_line (d, gc, 150, 50, 150, 150);
gdk_draw_line (d, gc, 150, 150, 200, 200);
gdk_draw_line (d, gc, 50, 50, 150, 50);
gdk_draw_line (d, gc, 50, 150, 150, 150);
}
static gboolean expose_cb (GtkWidget *canvas, GdkEventExpose *event, gpointer user_data)
{
GdkGC *gc;
gc = gdk_gc_new (canvas->window);
draw (canvas->window, gc, factor);
g_object_unref (gc);
return FALSE;
}
void build_ACC_axis (GtkWidget *button, GtkWidget *widget)
{
GdkRegion *region;
GtkWidget *canvas = g_object_get_data(G_OBJECT(widget), "plat_GA_canvas");
region = gdk_drawable_get_visible_region(canvas->window);
gdk_window_invalidate_region(canvas->window, region, TRUE);
/* gtk_widget_queue_draw(canvas); */
gdk_window_process_updates(canvas->window, TRUE);
gdk_region_destroy (region);
factor++;
}
int main (int argc, char **argv)
{
GtkWidget *window;
GtkWidget *canvas, *box, *button;
gtk_init (&argc, &argv);
factor = 1;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(window, 500, 300);
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
box = gtk_vbox_new(FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), box);
canvas = gtk_drawing_area_new ();
g_object_set_data(G_OBJECT(window), "plat_GA_canvas", canvas);
/* gtk_box_pack_start(GTK_BOX(box), canvas, FALSE, FALSE, 0); */
gtk_container_add (GTK_CONTAINER (box), canvas);
g_signal_connect (G_OBJECT (canvas), "expose-event", G_CALLBACK (expose_cb), NULL);
button = gtk_button_new_with_label ("ok");
gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
/* gtk_container_add (GTK_CONTAINER (box), button); */
gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(build_ACC_axis), window);
gtk_widget_show_all (window);
gtk_main ();
}