IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

CAIRO draw area effacer courbe.


Sujet :

GTK+ avec C & C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut CAIRO draw area effacer courbe.
    Bonjour,

    Presentation de mon probleme:
    Je selectionne dans un menu les courbes à tracer, puis je les traces dans une nouvelle fenetre.
    Pas de probleme jusque la.
    Cependant si je retourne dans mon menu et que je selectionne de nouvelle courbes, les nouvelles sont bien tracée mais les anciennes que j'ai déselectionné reste affichée...

    Comment faire pour retracer ma draw area completement depuis le debut?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
     
    void callback_tracer(GtkWidget *pBtn, gpointer pdata)
    {
        MYGTK *mygtk= (MYGTK*) pdata;
        GtkWidget *p_main_window = NULL;
        GtkWidget *p_drawing_area = NULL;
        COORDONNEES coord;
     
        /* Code "inutile" */
     
        /* Trace */
     
        p_main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size(GTK_WINDOW(p_main_window), LONGUEUR_ECRAN, LARGEUR_ECRAN);
     
        p_drawing_area = gtk_drawing_area_new ();
        g_signal_connect (G_OBJECT (p_drawing_area), "expose_event",G_CALLBACK (callback_expose_event),(gpointer) &coord);
        gtk_container_add (GTK_CONTAINER (p_main_window), p_drawing_area);
        gtk_widget_show_all (p_main_window);
    }
     
     
     
    void callback_expose_event(GtkWidget *widget,GdkEventExpose *event,gpointer pdata)
    {
        cairo_t *cr;
        COORDONNEES *coord=(COORDONNEES *) pdata;
        COLOR colors[NB_RES_MAX];
        int cptmes,cptres,cpt,i;
        int echelle[6];
        char s_echelle[20];
     
        creercouleur(colors);
     
        cr = gdk_cairo_create (widget->window);
    //    cairo_rectangle (cr,event->area.x, event->area.y,event->area.width, event->area.height);
    //    cairo_clip (cr);
     
        /* Trace les courbes selectionnees */
     
        cairo_set_line_width(cr, 1);
     
        for (cptres=0;cptres<NB_RES_MAX;cptres++)
        {
            if (coord->courbes[cptres]==1)
            {
                cairo_set_source_rgb(cr, colors[cptres].red, colors[cptres].green, colors[cptres].blue);
                //cairo_move_to(cr,coord->x[cptres][0],coord->x[cptres][0]);
                for (cptmes=0;cptmes<coord->nbpoints[cptres]-1;cptmes++)
                {
                    cairo_line_to(cr, coord->x[cptres][cptmes], coord->y[cptres][cptmes]);
                }
                cairo_close_path(cr);
                cairo_stroke(cr);
            }
        }
     
        /* Trace les angles et les cercles */
     
        cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); //Gris
        cairo_arc(cr,LONGUEUR_ECRAN/2,LARGEUR_ECRAN/2,LARGEUR_ECRAN/12,0,2*M_PI);
        cairo_stroke(cr);
        cairo_arc(cr,LONGUEUR_ECRAN/2,LARGEUR_ECRAN/2,LARGEUR_ECRAN/6,0,2*M_PI);
        cairo_stroke(cr);
        cairo_arc(cr,LONGUEUR_ECRAN/2,LARGEUR_ECRAN/2,LARGEUR_ECRAN/4,0,2*M_PI);
        cairo_stroke(cr);
        cairo_arc(cr,LONGUEUR_ECRAN/2,LARGEUR_ECRAN/2,LARGEUR_ECRAN/3,0,2*M_PI);
        cairo_stroke(cr);
        cairo_arc(cr,LONGUEUR_ECRAN/2,LARGEUR_ECRAN/2,5*LARGEUR_ECRAN/12,0,2*M_PI);
        cairo_stroke(cr);
        cairo_arc(cr,LONGUEUR_ECRAN/2,LARGEUR_ECRAN/2,LARGEUR_ECRAN/2,0,2*M_PI);
        cairo_stroke(cr);
     
     
        for (cpt=0;cpt<36;cpt++)
        {
            cairo_move_to(cr,LONGUEUR_ECRAN/2,LARGEUR_ECRAN/2);
            cairo_line_to(cr,LONGUEUR_ECRAN/2+LARGEUR_ECRAN/2*cos(M_PI*cpt/18),LARGEUR_ECRAN/2+LARGEUR_ECRAN/2*sin(M_PI*cpt/18));
            cairo_close_path(cr);
            cairo_stroke(cr);
        }
     
        /* Trace l'echelle */
     
        cairo_select_font_face(cr, "Purisa",CAIRO_FONT_SLANT_NORMAL,CAIRO_FONT_WEIGHT_BOLD);
     
        cairo_set_font_size(cr, 13);
        echelle[0]=coord->arronditmax;
        cairo_move_to(cr, LONGUEUR_ECRAN/2+5, 20);
        i=sprintf(s_echelle,"%d",echelle[0]);
        cairo_show_text(cr, s_echelle);
     
        for (cpt=1;cpt<6;cpt++)
        {
            echelle[cpt]=echelle[cpt-1]-5;
            cairo_move_to(cr, LONGUEUR_ECRAN/2+5, cpt*LARGEUR_ECRAN/12+20);
            i=sprintf(s_echelle,"%d",echelle[cpt]);
            cairo_show_text(cr, s_echelle);
        }
     
        cairo_destroy(cr);
    }
    Merci de votre aide.

    Cordialement

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Il suffit de ne pas les redessiner en réponse à l'expose-event. Et si tu veux forcer que toute la zone soit redessinée, il suffit d'appeler gdk_window_invalidate_rect en spécifiant les coordonnées de la fenêtre où tu fais ton tracé.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut
    Merci pour ta réponse.

    Dans mon code, le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (coord->courbes[cptres]==1)
            {
    m'assure de ne pas retracé la courbe.
    En effet, le problème est que ma fenetre n'est pas effacée à chaque fois que je lance ma "fonction maître" qui est le callback tracer.
    Je vais donc regarder gdk_window_invalidate_region.

    Cordialement.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut
    En fait,
    Mon code était mal fait et je ne remettait pas correctement a jour l'état des courbes a tracer.

    Cela marche bien maintenant

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Drawing area - problème d'affichage
    Par Bertrand_g dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 20/03/2008, 21h59
  2. Dessiner sur une drawing area
    Par Fibus dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 19/12/2007, 16h57
  3. drawing area et itérations
    Par Rniamo dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 07/11/2007, 19h00
  4. Drawing area
    Par Blackshade dans le forum GTK+ avec PHP
    Réponses: 4
    Dernier message: 06/06/2007, 16h51
  5. Image de fond dans un drawing area
    Par smux dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 15/09/2006, 11h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo