I copy my source files "CurveWindow.h" and "testCurveWindow.cpp" below. And attach them in this mail. You can compile them by: $ g++ testCurveWindow.cpp -o testCurveWindow `pkg-config --cflags --libs gtk+-2.0` In this application, I create an 1 second timer to draw a moving line. But in the function timer_1_test(), the timer is run only once, and then stopped. See the comment in this function. The following is my two source files: /*************************************************************************** * Filename : CurveWindow.h * Begin : 2008-08-14 08:46:43 * Project : CurveWindow * Author : Wu Yin ***************************************************************************/ #include <iostream> #include <gtk/gtk.h> using namespace std; class CurveWindow { public: CurveWindow(){}; GtkWidget *create_drawing_win(); GtkWidget *get_root_widget(); int draw(); GdkPixmap *pixmap; private: GtkWidget *drawing; }; //======================================================== /* Create a new backing pixmap of the appropriate size */ static gboolean configure_event( GtkWidget *widget, GdkEvent *event, gpointer data) { CurveWindow *self = (CurveWindow *)data; GdkColor color; GdkGC *gc = gdk_gc_new(widget->window); self->pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); // Draw the background gdk_draw_rectangle (self->pixmap, widget->style->white_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); return TRUE; } /*************************************************************************** * add by Wu Yin, 2008-08-14 08:55:09 ***************************************************************************/ static gboolean redraw(GtkWidget *widget, GdkEventExpose *event, gpointer data) { printf("expose-event \n"); CurveWindow *self = (CurveWindow *)data; gdk_draw_drawable (widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], self->pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return TRUE; } /*************************************************************************** * add by Wu Yin, 2008-08-19 ***************************************************************************/ int CurveWindow::draw() { GtkWidget *widget = this->get_root_widget(); static int y = 0; y += 10; gdk_draw_line(pixmap, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], 0, 0, 120, y); gtk_widget_draw(widget, NULL); return 0; } /*************************************************************************** * add by Wu Yin, 2008-08-14 08:55:09 ***************************************************************************/ GtkWidget *CurveWindow::get_root_widget() { return drawing; } /*************************************************************************** * add by Wu Yin, 2008-08-14 08:55:09 ***************************************************************************/ GtkWidget *CurveWindow::create_drawing_win() { drawing = gtk_drawing_area_new(); g_signal_connect(G_OBJECT(drawing), "expose-event", G_CALLBACK(redraw), this); g_signal_connect (G_OBJECT (drawing),"configure_event", G_CALLBACK (configure_event), this); return drawing; } /*************************************************************************** * Filename : testCurveWindow.cpp * Begin : 2008-08-14 08:46:43 * Project : CurveWindow * Author : Wu Yin ***************************************************************************/ #include <gtk/gtk.h> #include <iostream> #include "CurveWindow.h" using namespace std; /*************************************************************************** * add by Wu Yin, 2008-08-14 08:55:09 ***************************************************************************/ static void timer_1_test(gpointer data) { CurveWindow *cw = (CurveWindow *)data; cw->draw(); /* !!! Look Here !!! * Uncomment each statement of the following, the timer will run correctly, WHY? */ // printf("timer_1_test() \n"); // gtk_widget_draw(cw->get_root_widget(), NULL); } /*************************************************************************** * add by Wu Yin, 2008-08-14 08:55:09 ***************************************************************************/ static void create_gui() { GtkWidget *drawing_win; GtkWidget *root_win; GtkWidget *root_table; CurveWindow *cw; GdkColor bg, fg; // Create root_window root_win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(root_win), 800, 600); g_signal_connect(GTK_OBJECT(root_win), "destroy", G_CALLBACK(gtk_main_quit), NULL); // Create root table container root_table = gtk_table_new(10, 10, TRUE); gtk_container_add(GTK_CONTAINER(root_win), root_table); // Create Drawing place 1, and add to the root table cw = new CurveWindow(); drawing_win = cw->create_drawing_win(); g_timeout_add(1000, (GSourceFunc)timer_1_test, cw); gtk_table_attach_defaults(GTK_TABLE(root_table), drawing_win, 0, 2, 0, 2); gtk_widget_show_all(root_win); } /*************************************************************************** * add by Wu Yin, 2008-08-14 08:55:09 ***************************************************************************/ int main(int argc, char *argv[]) { gtk_init(&argc, &argv); create_gui(); gtk_main(); return 0; }
Attachment:
CurveWindow.tar.bz2
Description: BZip2 compressed data