As a matter of fact. I would suggest using Cairo. Which will allow you to then 
draw in any context (IE Printer, PDF, etc...)


    /* Local Variables */
    cairo_t *cr;        /* Rendering context derived from widget */

    /* Get the context to which we need to draw */
    cr = gdk_cairo_create(widget->window);
    /* Printer context would be: 
      cr = gtk_print_context_get_cairo_context(context) 
       where context is a GtkPrinterContext* */

    /* If we have a valid context draw valid object */
    if (cr != NULL){

       /* Boarder rectangle */
       cairo_rectangle(cr,  0.00, 0.00, 20.0 , 40.0 ); 

       cairo_stroke(cr);

       cairo_set_line_width(cr,line_width / 60);

       /* Virtical Seporation lines */
       cairo_move_to(cr, 20.0 , 40.0 ); 
       cairo_line_to(cr, 40.0, 40.0); 

       cairo_stroke(cr);

      /* Distroy the context we created */ 
      cairo_destroy(cr);

   }

 







 EMAILING FOR THE GREATER GOOD
Join me

> Subject: Re: how to draw something on GtkDrawingArea when I click a button?
> From: csaave...@gnome.org
> To: gtk-app-devel-list@gnome.org
> Date: Fri, 19 Mar 2010 08:46:33 +0200
> 
> El vie, 19-03-2010 a las 13:34 +0800, Tolic Ma escribió:
> > Hi,everyone!
> > 
> > I want to draw something on GtkDrawingArea when I click a GtkButton,but I
> > don't know how to do this...
> > 
> > this is my code(it doesn't work...):
> > 
> > *void click_button(void){
> > 
> > 
> > gdk_draw_line(drawing_area,drawing_area->style->white_gc,x,y,width+x,height+y);
> > 
> > }
> 
> You shouldn't draw directly in your callback for the button. Instead,
> you should call gtk_widget_queue_draw() to tell GTK+ to schedule a paint
> of the widget.
> 
> How will the widget be painted? GTK+ will tell your code that the widget
> needs to be painted by emitting the GtkWidget::expose-event signal.
> Then, you should connect to that signal and paint in your callback.
> 
> Last but no least, don't forget to paint to the GdkWindow of the drawing
> area, since that's the drawable.
> 
> More or less (untested code, just for clarity):
> 
> *void
> click_button(GtkButton *button, gpointer data)
> {
>    button_clicked = TRUE;
>    gtk_widget_queue_draw (drawing_area);
>    ...
> }
> 
> gboolean
> expose_drawing_area (GtkWidget *area, 
>                      GdkExposureEvent *event,
>                      gpointer data)
> {
>    ...
>    if (button_clicked) {
>       gdk_draw_line(drawing_area->window,
>                     drawing_area->style->white_gc,x,y,width+x,height+y);
>    }
>    ...
> }
> 
> int main(int argc,char *argv[]){
>    ...
>    g_signal_connect(button,"clicked",G_CALLBACK(click_button),NULL);
>    
> g_signal_connect(drawing_area,"expose-event",G_CALLBACK(expose_drawing_area),NULL);
>    ...
> }
> 
> 
> Claudio
> 
> -- 
> Claudio Saavedra <csaave...@gnome.org>
> 
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list@gnome.org
> http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
                                          
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to