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 :

Élaboration: GUI par événements


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Par défaut Élaboration: GUI par événements
    Bonsoir,

    Je suis à la recherche d'aide et de documentations pour faire une GUI (Graphical User Interface) directement en C en passant par OpenGL pour le rendu. Évidemment, c'est pas évident, car je compte faire du événementiel, avec un peu d'orientation objet à la façon C, histoire que ça soit évolutif aussi.

    J'ai fais quelques recherches mais je n'ai pas trouvé pour élaborer l'organisation et faire communiquer les différentes parties entre-elles, c'est à dire les fenêtres avec le "gestionnaire principal", les widgets (composants genre champs de texte) avec la fenêtre, etc... Je pensais faire une espèce d'arbre: Gestionnaire > Fenêtres > Widgets complexes > widgets primitifs. Il y a un gestionnaire pour plusieurs fenêtres; les widgets complexes c'est un groupement de widget (exemple: Un champ de texte avec un bouton valider). Il y aura sûrement une méthode Draw appelée récursivement pour chacun des éléments.

    Maintenant, je réfléchit sur les événements: quand on tape quelque chose dans un champs, quand on a un champs actif, un bouton est cliché, etc... Faut-il plutôt faire un gestionnaire d'événements global (envoyé au gestionnaire) ou bien local (parent-enfant). Ce qui serait pas mal, c'est des articles traitant de GUI de manière abstraite, ou avec OpenGL (j'y crois pas trop). Sinon, vos conseils sont les bien venus aussi. Merci !

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    En fait les premières lignes de votre message m'ont étonné. Effectivement une GUI avec OpenGL est vraiment un concept très spécial. Car OpenGL ne fait pas de la gestion de fenpetre mais juste de l'affiche, et il affiche une fenêtre. Alors même si on fait un semblant de GUI dedans ... vous pourrez toujours bouger toute la GUI juste en cliquant sur la fenêtre OpenGL

    Du coup, lorsque l'on parle de GUI, on parle de gestionnaire de fenetre, ce qui nous amène à la XLib pour Linux / Unix et la WinAPI pour Windows. Voici les bases.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Par défaut
    Effectivement, ça porte à confusion. Dans mon cas ce serait de faire un gestionnaire de fenêtres/d'interface rendu par OpenGL en "3D" dans un contexte créé par l'OS. Donc je ne me soucie pas l'API qui crée/gère la fenêtre OpenGL en question puisque je passe par glut. Donc je parle bien de dessiner avec les primitives d'OpenGL les fenêtres, boîtes de texte tout ça, de gérer les fenêtres drag(-and-drop), événements (input-output), moi-même. Le but étant d'avoir une interface dans un jeu (oui toujours le même jeu )

    Si je poste dans ce forum, c'est bien parce que je m'intéresse au côté programmation C et non du côté OpenGL (pour l'instant).

    Quel est le bon terme alors ? Me semblait que GUI convenait très bien, puisque c'est un concept abstrait, sinon le nom c'est Window-Manager peut-être ? J'espère que je me suis bien exprimé cette fois-ci.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Par défaut
    Citation Envoyé par jamesb Voir le message
    Quel est le bon terme alors ? Me semblait que GUI convenait très bien, puisque c'est un concept abstrait, sinon le nom c'est Window-Manager peut-être ? J'espère que je me suis bien exprimé cette fois-ci.
    Pour moi, GUI convient très bien meme si le terme est moins précis que Gestionnaire de Fenetre (un gestionnaire de fenetre est un GUI mais pas l'inverse).

    Pour les évènements, je te propose une solution globale :
    - seul le gestionnaire de fenetre détecte les évènements
    - lorsque l'utilisateur clique sur l'écran, le gestionnaire de fenetre cherche (récursivement par exemple) le widget qui se trouve sous la souris. Ce widget devient alors "actif"
    - lorsque l'utilisateur appuie sur une touche, alors une fonction sera appelée avec comme paramètre le widget actif. En testant le type de ce widdget, tu peut rajouter du comportement de manièrte extensible. Par exemple pour un champ texte, la fonction callback aura pour role de concaténer au texte courant le caractère correspondant au clavier.

    Avec cette architecture, tu pourras facilement rajouter de nouveaux évènements, comme le drag & drop, le double clic, etc.

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Pardon pour la confusion que j'avais apporté avec mon histoire de gestionnaire de fenêtre. Il est vrai que je n'avais pas compris le problème, ou plus précisément, je n'avais pas pensé à ce cas.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Par défaut
    dancingmad: merci pour ton avis ! Je pensais également à un tel système, récursif. Ça va pas être facile au début mais une fois que j'aurais mis le gestionnaire d'événements (haut-niveau) je pourrais commencer à m'amuser (onClick, onDoubleClick, OnMouseOut, onKeyUp, etc... à la javascript).

    LittleWhite: Pas de problème, j'ai sûrement pas assez détailler ce que je voulais faire.

    D'ailleurs j'ai une idée que je vais sûrement creuser: le concept d'overlay. Je m'explique, un overlay est une couche qui dessine à l'écran (1 passe), on peut faire une couche jeu et une couche GUI, appelé dans cet ordre. Ça me permettrais d'avoir des overlay spécialisée 1/ jeu ; 2/ carte 2D ; 3/ GUI-fenêtres ; 4/ sur-couche chat genre Steam par exemple. Je pense que c'est une très bonne idée sachant que chaque couche est implémentée de manière indépendante et au-dessus de tout ça il y aurait un overlays-manager qui appelle les méthodes draw des overlays. Un seul overlay pourra être "séléctionné" (par clique de l'utilisateur ou shift-tab par exemple) et ainsi recevoir les input. Ce qui permettrait de vraiment séparer les choses.

    Donc je vais pouvoir coder la GUI dans un overlay spécialisé, j'espère que ça sera réutilisable. Vu que je peux faire à la POO en C, ça devrait pas trop poser de problème si j'ai plusieurs UI à implémenter (exemple: GUI/carte -> boutons etc...). Mon struct pour le moment ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Generic overlay
    struct __overlay {
    	// Delete
    	void(*Delete)(Overlay *lay);
     
    	// Set the matrices
    	void(*InitMatrices)(Overlay *lay);
    	// Draw the lay
    	void(*Draw)(Overlay *lay);
     
    	// Input if active
    	void (*EventKeyboard)(Overlay *lay, int key);
    	void (*EventMouse)(Overlay *lay, int x, int y);
    };
    Il me faut encore élaborer le gestionnaire d'événements global (au niveau du overlays-manager) pour ensuite les envoyer aux fonctions Event* de l'overlay sélectionné.
    Qu'en pensez-vous, c'est génial, non ?

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

Discussions similaires

  1. Windev : Gestion de liaison série par événement série
    Par jurassic pork dans le forum Contribuez
    Réponses: 2
    Dernier message: 02/10/2023, 11h11
  2. Nouvelle fenêtre générée par évènement
    Par goofyto8 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/07/2013, 07h49
  3. Modification d'un objet GUI par un thread
    Par Dazdh dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 24/03/2009, 13h52
  4. Lecture de fichiers wave par événements extérieurs
    Par Jean Breil dans le forum Pascal
    Réponses: 0
    Dernier message: 19/09/2007, 00h19
  5. Transfert d'icone par évènement
    Par microJaP dans le forum Delphi
    Réponses: 2
    Dernier message: 28/04/2007, 15h37

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