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

C Discussion :

Programation avec GTK et Allegro en en même temps


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Programation avec GTK et Allegro en en même temps
    Bonjour,
    j'aimerais faire un petit programme avec les bibliothèques GTK et Allegro en même temps.
    Ce serait pour faire une fenêtre (=> GTK), y afficher une image à gauche (=> allegro) et des boutons à droite (=>GTK).

    Je n'arrive pas à programmer avec les 2 en même temps, mon programme ne veut même pas afficher une image .bmp en fond d'écran.

    Voici mon code pour l'instant:

    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
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #define ALLEGRO_NO_MAGIC_MAIN
    #include <allegro.h>
    #define ERREUR(msg) {\
       set_gfx_mode(GFX_TEXT,0,0,0,0);\
       allegro_message("erreur ligne %d, fichier %s: %s\n",__LINE__, __FILE__,msg);\
       allegro_exit();\
       exit(EXIT_FAILURE);\
    }
     
    int main (int argc, char *argv[])
    {
        int x,y;
        BITMAP* image;
        GtkWidget *win = NULL;
     
        if (allegro_init())
            ERREUR("Cannot initalize Allegro.\n");
        gtk_init (&argc, &argv);
     
        win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title (GTK_WINDOW (win), "Hello World");
        gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
     
        set_color_depth(24);
        if (set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0)!=0)
          ERREUR("initialisation mode graphique");
     
        image=load_bitmap("./image.bmp",NULL);
        if (!image)
            ERREUR("Cannot load image.\n");
     
        allegro_message("hello word allegro !");
     
        g_signal_connect (win, "destroy", gtk_main_quit, NULL);
        gtk_widget_show_all (win);
        gtk_main ();
     
        destroy_bitmap(image);
     
        return EXIT_SUCCESS;
    }

  2. #2
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    GTK et Allegro sont 2 systèmes de fenêtrages différents, tu dois donc choisir lequel tu veux utiliser. Ce serait comme utiliser GTK et Qt conjointement, ça marche pas.

    Sinon concernant ton image, après l'avoir chargée le bout de code que tu nous indique ne l'utilise pas, donc c'est normal que rien de s'affiche.

  3. #3
    Invité
    Invité(e)
    Par défaut Programation GTK
    Merci pour ta réponse, mais si, il est possible de programmer avec les 2 bibliothèques en même temps.
    C'est bon mes ancien problème sont réglé, j'arrive à coder en Allegro + GTK, j'arrive à afficher une image de fond (par l'intermédiaire d'Allegro).

    Et maintenant mon souci est que je voudrai quant je clic sur l'image, grace à GTK (signal_connect) entrer dans une fonction avec comme argument une structure qui est les coordonnée de la position de la souri au moment du clic sur l'image:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct coordonnee{
        int x;
        int y;
    }coord;
    Dans cette fonction, j'ai des condition ( c'est des "if" selon les coordonnée de la souris).

    Pouvez vous m'aider svp je n'y arrive pas.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Voici mon signal connect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gtk_signal_connect (GTK_OBJECT (window), "boutton_press_event", GTK_SIGNAL_FUNC (popu), souris);
        gtk_widget_set_events (window, GDK_BOUTTON_MOTION_MASK);
    Et ma fonction "popu" pour l'instant elle affiche juste les coordonnée de la souris passé par argument structure "coordonnee souris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static void popu(GtkWidget *widget, coordonnee *souris)
    {
        printf("x = %d  \t  y = %d", souris->x, souris->y);
    }

  5. #5
    Invité
    Invité(e)
    Par défaut
    Plus d'informations:
    J'ai ma fonction qui affiche, les coordonnées de ma souris, sur la console d'application:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    static void position_souris( GtkWidget *widget, GdkEventMotion *event )
    {
        gint x1, y1;
        if (event->is_hint)
            gdk_window_get_pointer (event->window, &x1, &y1, NULL);
        else
        {
            x1 = event->x;
            y1 = event->y;
        }
        g_printf("x:%d  y:%d\n", x1, y1);
    }
    Et mon appelle de fonction qui se fait par un g_signal_conect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gtk_signal_connect (GTK_OBJECT (window), "motion_notify_event", GTK_SIGNAL_FUNC (position_souris), NULL);
        gtk_widget_set_events (window, GDK_POINTER_MOTION_MASK);
    Celà affiche à chaque fois que je déplace la souris sur ma fenetre, les nouvelles coordonnées de ma souris.

    J'aimerai que celà ne se fasse que lorsque je clic sur le boutton gauche de ma souris, sur ma fenetre.

    Voici des images pour l'illustration:

  6. #6
    Invité
    Invité(e)
    Par défaut
    Va t'on atteindre les 100 lecteurs sans aucune réponse??

    Personne ne sait comment afficher les coordonnées du clique de la souris en GTK??

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Bonsoir,

    Citation Envoyé par ziad91 Voir le message
    Voici mon signal connect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gtk_signal_connect (GTK_OBJECT (window), "boutton_press_event", GTK_SIGNAL_FUNC (popu), souris);
        gtk_widget_set_events (window, GDK_BOUTTON_MOTION_MASK);
    C'est « button » et pas « boutton » ! Si tu fais des fautes, c'est normal que ça ne marche pas ! Ensuite, dans le nom du signal à relier, les séparateurs sont des tirets « - » et pas des underscores « _ ».

    Citation Envoyé par ziad91 Voir le message
    Va t'on atteindre les 100 lecteurs sans aucune réponse??

    Personne ne sait comment afficher les coordonnées du clique de la souris en GTK??
    Il y a un détail supplémentaire sur la page du signal en question : http://library.gnome.org/devel/gtk/s...on-press-event

    To receive this signal, the GdkWindow associated to the widget needs to enable the GDK_BUTTON_PRESS_MASK mask.

    Il faut donc utiliser gtk_widget_set_events() comme tu le fais déjà pour GDK_BOUTTON_MOTION_MASK.

    Ensuite, le prototype de la fonction de callback associée est le suivant :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    gboolean            user_function                      (GtkWidget      *widget,
                                                            GdkEventButton *event,
                                                            gpointer        user_data)      : Run Last

    Tu reçois donc, plus qu'un simple GdkEvent, un « GdkEventButton ». Et celui-ci contient des membres x et y depuis lesquels tu peux obtenir directement les coordonnées que tu convoites tant.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci de ta réponse.

    Est-ce que ça pose un problème de faire ça avec "button" alors que le champ ou on clique est un "drawing area" (en gros quelque chose d'autre)?
    Je peut pas faire ça sur toute la fenetre "window"?

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par ziad91 Voir le message
    Merci de ta réponse. Est-ce que ça pose un problème de faire ça avec "button" alors que le champ ou on clique est un "drawing area" (en gros quelque chose d'autre)?
    « button » se réfère au bouton de la souris, ou de tout autre périphérique de pointage. Il ne s'agit pas, ici, d'un widget bouton. Ce signal est donc applicable sur tout widget capable de recevoir un clic. C'est ce que l'on cherche.

    Je peut pas faire ça sur toute la fenetre "window"?
    Oui, et c'est ce que tu fais déjà avec ta fonction « Motion ».

    Par contre, assure-toi qu'Allegro n'a vraiment aucun lien avec ta fenêtre, sinon tu auras des interférences. C'est effectivement se causer des soucis supplémentaires pour pas grand chose.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static void position_souris(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
    {
        gint x1, y1;
        if (event->is_hint)
            gdk_window_get_pointer (event->window, &x1, &y1, NULL);
        else
        {
            x1 = event->x;
            y1 = event->y;
        }
        g_printf("x:%d  y:%d\n", x1, y1);
    }
    Dans ma fonction "position_souris", comme tu peux le voir ci-dessous, j'utilise "event->is_hint" qui était dans "GdkEventMotion" mais qui n'est plus dans "GdkEventButton".
    J'utilise quoi à la place?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ahh non ok, voila mon nouveau code mais toujours pas de coordonnées affichée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        gtk_signal_connect (GTK_OBJECT (draw_area), "button-press-event", GTK_SIGNAL_FUNC (position_souris),           NULL);
        gtk_widget_set_events (draw_area, GDK_BUTTON_MOTION_MASK);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    static void position_souris(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
    {
        gdk_window_get_pointer (event->window, &event->x, &event->y, NULL);
        g_printf("x:%d  y:%d\n", event->x, event->y);
    }
    Dernière modification par Invité ; 05/03/2010 à 23h12.

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Détail important : quelle version de GTK utilises-tu ? Je considère que c'est la 2.xx.
    Donc :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_signal_connect (GTK_OBJECT (draw_area), "button-press-event", GTK_SIGNAL_FUNC (position_souris),           NULL);

    Page de gtk_signal_connect() :

    Warning : gtk_signal_connect is deprecated and should not be used in newly-written code. Use g_signal_connect() instead.

    Donc, utiliser g_signal_connect(), le cast GTK_OBJECT est inutile (à vérifier), et la fonction doit être castée en G_CALLBACK.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_widget_set_events (draw_area, GDK_BUTTON_MOTION_MASK);

    C'est « GDK_BUTTON_PRESS_MASK » et plus « GDK_BUTTON_MOTION_MASK ». Il faut être un peu plus attentif.

  13. #13
    Invité
    Invité(e)
    Par défaut
    désolé, c'est que ce problème me prend beaucoup de temps alors que mon projet est à rendre dimanche soir. Il est finit mais il me reste à finir la partie graphique.

    Donc on obtient celà??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        gtk_signal_connect (draw_area,    "button-press-event", G_CALLBACK (position_souris),           NULL);
        gtk_widget_set_events (draw_area, GDK_BUTTON_PRESS_MASK);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    static void position_souris(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
    {
        gdk_window_get_pointer (event->window, &event->x, &event->y, NULL);
        g_printf("x:%d  y:%d\n", event->x, event->y);
    }
    Merci pour ton aide.

  14. #14
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par ziad91 Voir le message
    Donc on obtient cela ?

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        gtk_signal_connect (draw_area,    "button-press-event", G_CALLBACK (position_souris),           NULL);
        gtk_widget_set_events (draw_area, GDK_BUTTON_PRESS_MASK);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    static void position_souris(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
    {
        gdk_window_get_pointer (event->window, &event->x, &event->y, NULL);
        g_printf("x:%d  y:%d\n", event->x, event->y);
    }
    gdk_window_get_pointer() ne sert à rien dans ce cas précis (surtout qu'il faut redescendre de GTK à GDK). Tu reçois un GtkEventButton. Étant donné que l'on sait que c'est un clic, les coordonnées sont déjà dedans. C'est tout l'intérêt de la chose. En plus, entre le moment où l'événement est envoyé, le signal transmis, la callback appelée, la fonction en question appelée à son tour, et si l'on considère que ton processus peut être préempté et que le système peut faire des accès disques, ton pointeur de souris a largement le temps d'aller se balader ailleurs et la position que tu aurais lue ainsi n'aurait rien à voir avec celle que l'utilisateur a réellement cliquée.

    Pour le reste, ça a l'air pas mal. Est-ce que ça marche ?

  15. #15
    Invité
    Invité(e)
    Par défaut
    Ca ne marche toujours pas , voici un imprime écran:


  16. #16
    Invité
    Invité(e)
    Par défaut
    Siii , ça fonctionne mais j'ai pas les bonne coordonnées.
    J'obtient x=0 et y> à 1 milliard.

  17. #17
    Invité
    Invité(e)
    Par défaut
    En modifiant la fonction (enlevant le pointeur event)=>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static void position_souris(GtkWidget *widget, GdkEventButton event, gpointer user_data)
    {
        g_printf("x:%d  y:%d\n", event.x, event.y);
    }
    J'obtient x et y > à 2 millions.

  18. #18
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par ziad91 Voir le message
    En modifiant la fonction (enlevant le pointeur event)=>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static void position_souris(GtkWidget *widget, GdkEventButton event, gpointer user_data)
    {
        g_printf("x:%d  y:%d\n", event.x, event.y);
    }
    J'obtient x et y > à 2 millions.
    C'est dû à un tout petit détail, mais il faut absolument que tu apprennes à débuguer ton programme toi-même. Va dans les options du compilateur et ajoute les flags « -W -Wall --ansi --pedantic --std=c99 », si tu ne l'as pas déjà fait.

    En l'occurence, deux erreurs :

    • Le prototype de la fonction de callback ne contient pas « GdkEventButton event » mais « GdkEventButton * event ». C'est une chance que ton programme ne se soit pas fini en segfault. Cela veut aussi dire qu'il y a quelques adaptations à faire dans le corps de la fonction ;
    • Les membres x et y de event, ils sont de quel format ?

  19. #19
    Invité
    Invité(e)
    Par défaut
    x et y sont au format gdouble.

  20. #20
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par ziad91 Voir le message
    x et y sont au format gdouble.
    Et dans ton gprintf(), tu as écrit quoi ?

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/02/2013, 12h45
  2. Demarrer deux exe en même temps avec gtk+
    Par suzan_ dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 30/07/2010, 11h22
  3. Réponses: 2
    Dernier message: 16/12/2007, 18h28
  4. Réponses: 1
    Dernier message: 28/10/2004, 21h27
  5. [GTK]installer Dev-C++ avec gtk 1.2 ...
    Par vbcasimir dans le forum Dev-C++
    Réponses: 2
    Dernier message: 02/02/2004, 13h34

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