Shawn Bakhtiar
Fri, 19 Mar 2010 08:16:35 -0700
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