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

Contribuez Discussion :

[Tuto] creer un gui a partir de 0 avec une librairie graphique [En attente]


Sujet :

Contribuez

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Février 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 25
    Points : 70
    Points
    70
    Par défaut [Tuto] creer un gui a partir de 0 avec une librairie graphique
    Salut, apres la demande de Lord anubis, je vais essayer de presenter un design de gui qui permet de creer un gui simple a utiliser et a modifier :p (enfin j'espere)

    Ce qu'il faut connaitre pour ce tutorial :

    • Les listes chainées (tres important il va y en avoir partout)
    • les structures ou classes selon le langage avec si possible les fonctions virtuelles (pour le C il faut ruser , l'exemple utilise la poo)
    • la gestion bit a bit des variables (on l'utilise qu'une fois)
    • et bien sur une librairie graphique avec le minimum syndical: affichage de texte dessins de rectangle et blit + gestion de la souris



    Le but est de creer un gui ou 1 instruction = 1 widget avec neamoins la possibilité de parametre de maniere assez avancé le comportement des widget.

    Pour cela, nous allons une achitecture de gui basée sur les arbre de listes chainées.
    Commençons tout d'abord par creer une classe d'objet generique dont toutes les widgets de notre gui dériveront.dans mon exemple cette classe de base est appelé widget.

    cette classe devra contenir:
    • un pointeur pour etablir les liens entre les different widget de meme parenté
    • un pointeur pour etablir le lien de parenté
    • des fonctions pour donner les coordonnées du widget
    • des fonction pour donner les coordonne du canvas du widget si celui la existe : utile pour redessiner dans les fenetre ou les ecran
    • des fonctions pour gerer les liens de parenté entre widget : ajouter un widget enfant ,avoir le premier widget enfant , avoir le parent ...
    • des fonctions pour modifier le focus: c'est a dire pour specifier si le widget est actif ou non (utile pour limiter les fentre acctives ...)
    • des fonctions pour gerer les zorder (utile pour les fenetres )
    • un variable pour contenir le type du widget ( fenetre , boutton , textbox animation ... )
    • une fonction pour afficher le widget
    • une fonction pour effectuer les calculs du widget
    • une fonction pour gerer les clics sur le widget
    • un pointeur de fonctions pour pouvoir modifier profondement le comportement d'un widget


    voici un exemple de class widget de base :
    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
     
    class widget
    {
    public:
    	widget *ggslink;
    	char autowidget;//sert a tester si le widget se prend en charge tout seul ou si il fo mettre un cllbck specifique
    	widgttype widgettype;//type de widget pour les test
    	wdgtcomprtement comportement;//comportement des widget.
    virtual CALLBCK redrawprocess();//callbck standart pour le redraw des widgets
    virtual CALLBCK ggswidgetcallbck();//operation generique des widgets.
    virtual CALLBCK ggsmouseproc();
    virtual void  getcoord(int *x,int *y,int *x1,int *y1);//pour prendre les coordonne de n importe quel widget
    virtual void  getcanvascoord(int *x,int *y,int *x1,int *y1);//pour prendre les coordonne de n importe quel widget
    virtual void setson(widget *ptr);
    virtual CALLBCK isfocus();//pour tester si les frames et les widows on le focus ou pas
    //virtual CALLBCK	 setfocus();//pour rendre les fenetre o premier plan
    virtual void changezorder(int focus);
    virtual void unsetfocus();//pour enleverlesfocus
    virtual widget *getson();
    virtual void setactiveframe();//pour rendre une frame active->a utiliser dans une fonction groupe pour enlever l activite des autre frames
    virtual void addwidget(widget *wdget);//pour copier des widget dans la liste chainee de leur parents a utiliser uniquement dans les constructeurs.
    //addwidget a un corp de fonction uniquement pour frame et ggswindows
    virtual BITMAP *getbitmap();//pour trouver le bitmap utiliser par le widget
    virtual int getzorder();
    virtual widget *getparent();//pas utilise ??
    virtual void focuson();//pout passer le focus de 0 a 1
    virtual void callmanualcallback();
    virtual int zorderwnd();// pour avoir le nombre  maximal du zorder -> utilisé lors de la creation de fenetre depuis le widget frame
    virtual int inczorderwnd();// fonction pour augmenter le nombre maximal du zorder -> utilisé apres la creation d'une fenetre depuis le widget frame
    virtual int deczorderwnd();//fonction pour diminuer le mombre maximal du zorder-> utilisé apres la destrcution d'une fenetre depuis le widget frame
    virtual void setbitmap(BITMAP *bmp);// pour modifier les bitmap des widget
    virtual void setbitmap2(BITMAP *bmp);//idem
     
    widget();//constructeur generique
    virtual ~widget();
    };
    Voila c'est a peu pres tout ce dont nous avons besoin, les 4 dernier elements de la classe sont de loin les plus importants.ce sont eux qui definnissent le comportement du widget.Toute les fonction de la classe widget sont virtuel pour permettre une modification de comportement tout en gardant le meme appel de fonction.

    il ne reste reste plus qu'a ecrire les fonctions qui feront bouger tout les ptits widget ainsi que les widget eux memes.

    voila a quoi ressemble l'agencement des widget lorsque le gui tourne:

    Ici frame est le widget de base qui constitue l'ecran.il contient tout les autres widget.
    windows est une fenetre.
    Frame manager est un objet qui contient toutes les frames crées par l'utilisateur, ainsi qu'un pointeur sur la frame active.


    //arf pas facile a aborder comme sujet, je tente de continuer.

    bon maintenant que nous avons une idée sur l'organisation de nos données, nous allons nous pencher sur les fonctions pour faire tourner tout se petit monde.

    Le premier problème à résoudre est la gestion globale du gui: il faut que n'importe quel widget puisse notifier si la souris a été cliqué, si il doit etre détruit, si l'on doit quitter le programme ect...
    Pour établir une gestion globale de tout les widget, j'utilise une unique variable globale accessible par toutes les fonctions et tout les objets du gui.Pour faire passer les messages à l'aide de cette unique variable j'utilise la variable bit à bit, on peut ainsi faire passer plusieurs messages à l'aide d'une seule variable.

    voila pour exemples les differents messages que j'utilise dans mon gui:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef unsigned char message;     //utilisation des switch sur 8 bits
    const message NOTHING=0,							//00000000  lorsqu'il alloue de la memoire.
    			  DELWIDGET=1,							//00000001  message de supression de widget			  RELEASEFRAME=DELWIDGET<<1,			//00000010  pour dire si il faut tester le changement de frame active
    			  AUTORLFRAME=DELWIDGET<<2,				//00000100  pour tester le changement de frame automatiquement.
    			  CLICL=DELWIDGET<<3,					//00001000  pour voir si on clic sur mouse_b &1
    			  FRAMEINIBATION=DELWIDGET<<4,           //00010000  pour iniber les widgets de frame... 
    			  QUITPROG=DELWIDGET<<7;				//10000000  pour quitter
    //je continue plus tard
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Du nouveau ?

Discussions similaires

  1. [Débutant] Exploitation de fonctions et données avec une interface graphique (GUI)
    Par procrastination dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 25/02/2014, 18h38
  2. Creer des colonnes a partir des valeurs d'une colonne
    Par Lynecoln dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/03/2012, 17h55
  3. Réponses: 3
    Dernier message: 06/12/2008, 19h34
  4. creer un fichier lib à partir d'une DLL
    Par benoit70 dans le forum MFC
    Réponses: 12
    Dernier message: 28/09/2008, 22h58
  5. creer des decors a partir d'un fichier
    Par NICKO dans le forum DirectX
    Réponses: 2
    Dernier message: 21/09/2002, 09h34

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