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+ Discussion :

rafraichissement drawing area


Sujet :

GTK+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut rafraichissement drawing area
    Bonjour,

    je créer une zone de dessin avec une drawing area.
    Kan je fais fichier, nouveau, alors je choisi un chemin de fichier et j'ouvre mon fichier ki contient des paramètres pour dessiner plusieurs lignes a l'ecran.
    Et, kan j'ouvre un autre fichier pour dessiner d'autres lignes, je suis obligé de reduire la fenetre et l'ouvrir??? pour pouvoir afficher mes nouvelles lignes.

    Donc, comment je pourais afficher directement ce que j'ouvre?
    Et, si je veux ajouter d'autres lignes a ce que j'ai deja ouvert pour k je puisse afficher le tout dans la meme zone de dessin comment je peux faire?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Par défaut
    tu fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_widget_queue_draw(GTK_WIDGET(widget));
    ?

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    dsl jai pas bien compris comment on utilisait
    gtk_widget_queue_draw(GTK_WIDGET(widget));
    et comme jsuis pas tres fort en anglais jai un peu de mal!!!
    si tas un exemple de code ou on ouvre un fichier avec les caractéristiques du rectangle (x, y, hauteur, largeur) et on dessine ca dans une drawing area, puis lorsqu'on ouvre un autre fichier qui contient d'autres caractéristiques du rectangle, cad des x, y, hauteur, largeur differents, qu'on puisse afficher ce nouveau rectangle dans la drawing area?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Par défaut
    tu remplace "widget" par ta drawing area.
    Cela va rappeler le signal "expose" que tu as dû connecter et dans lequel tu as tes fonctions de dessins. (et donc ça va rafraichir ta drawing area)

    Il faut que tes fonctions de dessins puissent prendre en compte tes changements. Perso, même si plein de gens disent qu'il faut éviter, j'utilise des variables globales

    si je trouve le temps je te mettrais un code explicite

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    ok, si tas un exemple ca sera mieux pask jessaie et ca marche pas.
    merci

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Par défaut
    Voilà, je t'ai fait un programme magnifique !!!
    J'espère qu'il est clair en tout cas...

    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
    104
    105
    106
    107
    108
    109
    //include
    #include <gtk/gtk.h>
     
    //headers
    static gboolean DA_realize( GtkWidget *widget);
    static gboolean DA_configure( GtkWidget *widget, GdkEventConfigure *event);
    static gboolean DA_expose( GtkWidget *widget, GdkEventExpose *event);
    static gboolean DA_button_press (GtkWidget *widget, GdkEventButton *event);
     
    //quelques variables...
    GdkPixmap* pixmap;
    GdkGC* gc = NULL;
    int unBoolean; //0 c'est vert, 1 c'est rouge !
     
    //le main, rien de spécial...
    int main(int argc, char ** argv)
    {
        //variables
        GtkWidget* fenetre;
        GtkWidget* drawingArea;
        printf("on démarre (main)...\n");
        gtk_init(&argc,&argv);
     
        //la fenetre principale
        fenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(fenetre),"exemple...");
        gtk_window_set_default_size(GTK_WINDOW(fenetre), 200, 200);
        gtk_window_set_position (GTK_WINDOW (fenetre), GTK_WIN_POS_NONE);
        g_signal_connect(G_OBJECT(fenetre),	"delete_event",G_CALLBACK(gtk_main_quit),NULL);
     
        //la drawing area maintenant
        drawingArea = gtk_drawing_area_new();
        //connection aux callbacks
        g_signal_connect (G_OBJECT (drawingArea), "realize", G_CALLBACK(DA_realize), NULL);
        g_signal_connect (G_OBJECT (drawingArea), "expose_event", G_CALLBACK(DA_expose), NULL);
        g_signal_connect (G_OBJECT (drawingArea), "configure_event", G_CALLBACK(DA_configure), NULL);
        g_signal_connect (G_OBJECT (drawingArea), "button_press_event", G_CALLBACK(DA_button_press), NULL);
        gtk_widget_set_events (drawingArea, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK);
     
        //on met la drawing area dans la fenetre
        gtk_container_add(GTK_CONTAINER(fenetre),GTK_WIDGET(drawingArea));
        // on affiche tout
        gtk_widget_show_all(GTK_WIDGET(fenetre));
        //on démarre la boucle gtk
        gtk_main();
        return 0;
    }
     
    //signal realize
    static gboolean DA_realize( GtkWidget *widget)
    {
        printf("realize ici...\n");
        unBoolean = 0;//(vert au debut)
        return TRUE;
    }
     
    //signal configure
    static gboolean DA_configure( GtkWidget *widget, GdkEventConfigure *event)
    {
        printf("configure ici...\n");
        if (pixmap) g_object_unref(pixmap);
     
        pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1);
        gdk_draw_rectangle (pixmap, widget->style->white_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height);
     
        return TRUE;
    }
     
    //signal expose
    static gboolean DA_expose( GtkWidget *widget, GdkEventExpose *event)
    {
        printf("expose ici...\n");
     
        //ici on fait les dessin (souvent c'est une fonction a part)
        if (pixmap != NULL) gdk_pixmap_unref(pixmap);
        pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1);
        if (gc ==NULL) gc = gdk_gc_new(widget->window);
     
        GdkColor couleur;//on choisit la couleur
        switch (unBoolean)
        {
            case 0:
                printf("vert !\n");
                couleur.pixel=0x00FF00;
                break;
            case 1:
                printf("rouge !\n");
                couleur.pixel=0xFF0000;
                break;
        }
        gdk_gc_set_foreground(gc, &couleur);
     
        gdk_draw_rectangle(GDK_DRAWABLE(pixmap), gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height);
     
        //on affiche le beau dessin
        gdk_draw_drawable(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], pixmap,
            event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height);
     
        return TRUE;
    }
     
    //signal quand tu appuies sur un bouton de la souris
    static gboolean DA_button_press (GtkWidget *widget, GdkEventButton *event)
    {
        unBoolean ^= 1; //on switch: si 1 -> 0 sinon 0->1
        printf("unBoolean : %d \n",unBoolean);
        gtk_widget_queue_draw(GTK_WIDGET(widget));//on redessine maintenant !!!
        return TRUE;
    }
    Remarque:chez moi, quand tu vas clique vite, ça merde un peu... Est-ce un effet du double-click je sais pas.

    PS: trop beau ce programme, je crois que je vais y jouer toute la journée

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