mit gtk+ zeichnen



  • hallo,
    ich habe ein problem. für meine übung erstell ich ein c-programm, es funktioniert nicht, und ich finde programmbeispiel, wo ich abschauen kann. alles was ich brauche ist programm, das z.b. eine linie zeichnet. kann mir jemand da helfen?
    danke



  • für gtk+ gibt es einige tutorials im netz http://www.gtk.org/tutorial/
    zum beispiel..

    aber ist kein ansi c, da können die linuxer sicher weiterhelfen..



  • ich kenne dieses toturial, aber das hilft mir nicht weiter, ich habe viel gesucht, ich will zeichnen, und das schaff ich nicht
    dann vielleicht eine eine andere frage:
    ich bekomme die fehlermeldung: assertion `drawable != NULL' failed.
    was heisst das?
    vielen dank



  • *duck*

    ich weiß, gehört nicht hierher..

    so geht es auf jeden mal bei mir mit dem zeichnen...

    #include <stdio.h>
    #include <string.h>
    #include <gtk/gtk.h>
    
    gint QUIT(GtkWidget *widget,gpointer data);
    gint DRAW_FIGURE(GtkWidget *widget,gpointer data);
    
    int main(int argc,char *argv[]){
      GtkWidget *window;
      GtkWidget *scrolled_window;
      GtkWidget *draw_area_1;
      GtkWidget *button;
      GtkWidget *vbox;
      GtkWidget *hbox;
    
      //gtk_set_locale();
      gtk_init(&argc,&argv);
      window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title(GTK_WINDOW(window),"DRAW AREA TEST WINDOW");
      gtk_signal_connect(GTK_OBJECT(window),"delete_event",
                 GTK_SIGNAL_FUNC(QUIT),NULL);
      vbox=gtk_vbox_new(FALSE,0);
      gtk_container_add(GTK_CONTAINER(window),vbox);
      gtk_container_border_width(GTK_CONTAINER(vbox),5);
      gtk_widget_show(vbox);
    
      //
      //???
      //
      //??????????
      scrolled_window=gtk_scrolled_window_new(NULL,NULL);
      gtk_widget_set_usize(GTK_WIDGET(scrolled_window),579,280);
      gtk_container_set_border_width(GTK_CONTAINER(scrolled_window),5);
      gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
                     GTK_POLICY_NEVER,GTK_POLICY_NEVER);
      draw_area_1=gtk_drawing_area_new();
      gtk_widget_set_name(draw_area_1,"DRAW AREA 1");
      gtk_widget_show(draw_area_1);  
      gtk_scrolled_window_add_with_viewport
        (GTK_SCROLLED_WINDOW(scrolled_window),draw_area_1);
    
      gtk_box_pack_start(GTK_BOX(vbox),scrolled_window,FALSE,FALSE,0);
    
      //
      //???
      //
      hbox=gtk_hbox_new(FALSE,0);
      gtk_widget_show(hbox);
      //DRAW 3D???
      button=gtk_button_new_with_label("DRAW");
      gtk_box_pack_start(GTK_BOX(hbox),button,TRUE,TRUE,0);
      gtk_widget_set_name(button,"DRAW");
      gtk_widget_show(button);
      gtk_signal_connect(GTK_OBJECT(button),"clicked",
                 GTK_SIGNAL_FUNC(DRAW_FIGURE),draw_area_1);
      //CLOSE???
      button=gtk_button_new_with_label("CLOSE");
      gtk_box_pack_start(GTK_BOX(hbox),button,TRUE,TRUE,0);
      gtk_widget_set_name(button,"CLOSE");
      gtk_widget_show(button);
      gtk_signal_connect(GTK_OBJECT(button),"clicked",
                 GTK_SIGNAL_FUNC(QUIT),NULL);
      gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0);
    
      gtk_widget_show_all(window);
      gtk_main();
    }
    
    gint QUIT(GtkWidget *widget,gpointer data){
      gtk_main_quit();
      return TRUE;
    }
    
    gint DRAW_FIGURE(GtkWidget *widget,gpointer data){
      GtkWidget *drawing_area=(GtkWidget *)data;
      GdkDrawable *drawable;
      GdkColor yellow={0,0xffff,0xffff,0x0000};
      GdkGC *yellowgc;
      GdkColormap *cmap;
      //???????(????????????????????????????)
      GdkFont *font=gdk_fontset_load
        ("-*-mincho-medium-r-normal-*-14-140-*-*-c-*-jisx0208.1983-0");
    
      int sx,sy;
      GdkPoint points[5];
    
      points[0].x=200;points[0].y=130;
      points[1].x=250;points[1].y=200;
      points[2].x=100;points[2].y=150;
      points[3].x=200;points[3].y=220;
      points[4].x=220;points[4].y=80;
    
      //
      //=========================================================
      //
    
      drawable=drawing_area->window;
    
      sy=drawing_area->allocation.height;
    
      sx=drawing_area->allocation.width;
    
      //gdk_draw_rectangle  
    
      gdk_draw_rectangle(drawable,
                 drawing_area->style->black_gc,
                 TRUE,0,0,sx,sy);
      cmap=gdk_colormap_get_system();
    
      yellowgc=gdk_gc_new(drawable);
      if(!gdk_color_alloc(cmap,&yellow)){
        g_error("couldn't allocate color");
      }
      gdk_gc_set_foreground(yellowgc,&yellow);
    
      //
      //=========================================================
      //
    
      if(strcmp("DRAW AREA 1",gtk_widget_get_name(drawing_area))==0){
    
        gdk_draw_string(drawable,font,
                yellowgc,sx/2-49,sy/2+7,"[DRAWING AREA]");
    
        //gdk_draw_line  
    
        gdk_draw_line(drawable,
              drawing_area->style->white_gc,32,21,sx-32,21);
        gdk_draw_line(drawable,
              drawing_area->style->white_gc,32,sy-21,sx-32,sy-21);
        gdk_draw_line(drawable,
              drawing_area->style->white_gc,32,21,32,sy-21);
        gdk_draw_line(drawable,
              drawing_area->style->white_gc,sx-32,21,sx-32,sy-21);
    
        //gdk_draw_arc   ???????
    
        gdk_draw_arc(drawable,
             drawing_area->style->white_gc,FALSE,60,60,30,60,0*64,360*64);
    
        //gdk_draw_point  ??????
    
        gdk_draw_point(drawable,
               drawing_area->style->white_gc,100,100);
        gdk_draw_point(drawable,
               drawing_area->style->white_gc,105,105);
        gdk_draw_point(drawable,
               drawing_area->style->white_gc,105,100);
        gdk_draw_point(drawable,
               drawing_area->style->white_gc,100,105);
    
        //gdk_draw_polygon     
        gdk_draw_polygon(drawable,drawing_area->style->white_gc,TRUE,points,5);
    
      }
    
      return (TRUE);
    }
    

    vergiß nicht, die gdk lib auch mit einzubinden neben der gtk..
    sieht gut aus.

    hoffe es funzt bei dir auch.



  • vielen dank elise, du bist wirklich sehr nett.
    eine kleinigkeit, es erscheint die warnung:
    Gdk-CRITICAL **: file gdkdraw.c: line 213 (gdk_draw_string): assertion `font != NULL' failed.
    aber das hat mit der schriftart zu tun, was nicht wichtig ist.
    danke nochmal


Anmelden zum Antworten