home *** CD-ROM | disk | FTP | other *** search
- /*----- demo09.cpp
-
- sujets :
-
- - ajout d'une zone statique
- - ajout d'une liste
- - surcharge du membre on_user()
- - gestion de plusieurs fenêtres
- - ajout d'une boîte de dialogue standard
-
- */
-
- /*-----
- définitions
- */
- #include "xe.h" /* gestionnaire d'événements */
- #include "xk.h" /* constantes clavier */
- #include "xo.h" /* définitions des objets */
- #include "xw.h" /* gestionnaire de fenêtres */
-
- #include <stdio.h>
-
- /*-----
- classe de fenêtre MyWin
-
- Destructeur de MyWin :
-
- - aucun destructeur spécifique.
-
- Définition de MyWin :
-
- - largeur de 62 colonnes,
- - hauteur de 18 lignes,
- - fenêtre standard (cadre, titre, ombre, déplaçable, amodale).
-
- Membre on_call() :
-
- - il est déclenché lorsqu'un objet est appelé pour exécution.
-
- - en paramètre, on_call() apporte l'adresse de l'objet courant
- demandant cette exécution.
-
- Membre on_char() :
-
- - il est déclenché pour tout caractère non reconnu par la fenêtre
- ou ses objets.
-
- - en paramètre, on_char() apporte le code du caractère saisi.
-
- Membre on_goto() :
-
- - il est déclenché à chaque arrivée sur le nouvel objet courant
- de la fenêtre.
-
- Membre on_user() :
-
- - il est déclenché à l'initiative de l'objet courant pour informer
- d'un changement dans son état.
-
- - en paramètres, on_user() apporte l'adresse de l'objet courant et
- le code d'information spécifique à l'objet.
-
- */
-
- class MyWin : public XWin
- {
- protected :
- virtual void on_call (XObj *obj);
- virtual void on_char (int key);
- virtual void on_user (XObj *obj, int val);
-
- protected :
- XStatic * o_sta;
- XList * o_lis;
-
- public :
- MyWin (const char *str);
- };
-
- MyWin::MyWin (const char *str)
- : XWin(62, 18)
- {
- int i;
- char buf [32];
-
- /* supprimer attribut xw_MODAL pour fenêtre amodale
- */
- defw(xw_STDWIN & ~xw_MODAL);
-
- /* associe un titre à la fenêtre
- */
- head(str);
-
- /* ajout d'un cadre sortant
- */
- link(new XBox(1, 1, 2, 42, 3, 0, 1));
-
- /* ajout de la zone statique
- identificteur : 1001
- */
- o_sta = (XStatic *)link(new XStatic(1001, 2, 4, 38, -1));
-
- /* ajout d'un cadre sortant
- */
- link(new XBox(1, 4, 2, 42, 11, 0, 1));
-
- /* ajout de la liste
- identificateur : 2001
- */
- o_lis = (XList *)link(new XList(2001, 5, 4, 38, 9, 100, 30));
-
- /* remplit la liste
- */
- i = 0;
-
- do
- sprintf(buf, "%u", i++);
- while (o_lis->addv(buf) != 0);
-
- /* ajout du bouton poussoir Ok
- identificateur : 9000
- raccourci clavier : ALT-O
- */
- link(new XPush(9000, 2, 46, 10, "&Ok", xk_aO));
-
- /* ajout du bouton poussoir Quitte
- identificateur : 9001
- raccourci clavier : ALT-Q
- */
- link(new XPush(9001, 4, 46, 10, "&Quitte", xk_aQ));
-
- /* ajout du bouton poussoir Tous
- identificateur : 9002
- raccourci clavier : ALT-T
- */
- link(new XPush(9002, 6, 46, 10, "&Tous", xk_aT));
-
- /* ajout du bouton poussoir Aucun
- identificateur : 9003
- raccourci clavier : ALT-A
- */
- link(new XPush(9003, 8, 46, 10, "&Aucun", xk_aA));
- }
-
- void MyWin::on_call (XObj *obj)
- {
- int idt;
-
- idt = obj->id();
-
- /* si exécution d'un bouton poussoir
- */
- if (obj->type() == xo_PUSH)
- {
- /* enfonce le bouton
- */
- xo(obj, XPush)->push(1);
-
- /* si bouton Tous
- */
- if (idt == 9002)
- {
- o_lis->selv(1, 1);
- }
- /* si bouton Aucun
- */
- else if (idt == 9003)
- {
- o_lis->selv(1, 0);
- }
- /* sinon ferme la fenêtre
- */
- else if (xw.yes("???", "Etes-vous sûr de vouloir quitter ?\n"))
- hide();
-
- }
-
- }
-
- void MyWin::on_char (int key)
- {
- /* si caractère ESCAPE
- */
- if (key == xk_ESC)
- /* alors ferme la fenêtre
- */
- hide();
-
- }
-
- void MyWin::on_user (XObj *obj, int val)
- {
- char buf [32];
-
- /* si changement dans liste
- */
- if (obj->id() == 2001)
- {
- sprintf(buf, "USER:%u", val);
- o_sta->defs(1, buf);
-
- /* si bascule sélection user(3)
- */
- if (val == 3)
- o_lis->revv(1, -1);
- /* si sélection Tous user(4)
- */
- else if (val == 4)
- o_lis->selv(1, 1);
- /* si sélection Aucun user(5)
- */
- else if (val == 5)
- o_lis->selv(1, 0);
-
- }
-
- }
-
- /*-----
- app_init() - initialisation de l'application
-
- L'initialisation de l'application passe par :
-
- - l'initialisation globale du gestionnaire de fenêtres,
- - l'affichage du bureau.
-
- */
-
- void app_init (void)
- {
- /* initialise tous les gestionnaires en une seule passe
- */
- xw.full(1);
-
- /* affiche le bureau
- */
- xw.desk();
- }
-
- /*-----
- app_quit() - terminaison de l'application
-
- La terminaison de l'application passe par :
-
- - la terminaison globale du gestionnaire de fenêtres.
-
- */
-
- void app_quit (void)
- {
- /* quitte tous les gestionnaires en une seule passe
- */
- xw.full(0);
- }
-
- /*-----
- app_exec() - exécution de l'application
-
- L'exécution de l'application passe par :
-
- - la création d'une fenêtre de type MyWin,
- - l'ouverture de la fenêtre,
- - la lecture de chaque événement,
- - l'évaluation de l'événement récupéré.
-
- L'exécution prend fin lorsque plus aucune fenêtre ne reste ouverte.
-
- */
-
- void app_exec (void)
- {
- XEvn evn;
- MyWin * wi1;
- MyWin * wi2;
-
- /* crée les fenêtres MyWin
- */
- wi1 = new MyWin("MA FENETRE 1");
- wi2 = new MyWin("MA FENETRE 2");
-
- /* ouvre les fenêtres créées
- */
- wi1->topw();
- wi2->topw();
-
- /* boucle de lecture des événements
- */
- while (1)
- {
- /* lit le prochain événement
- */
- xe.next(evn);
-
- /* si aucune fenêtre après évaluation de l'événement récupéré
- */
- if (xw.eval(evn) == 0)
- /* alors quitte la boucle
- */
- break;
-
- }
-
- /* détruit les fenêtres (déjà fermées)
- */
- delete wi2;
- delete wi1;
- }
-
- void main (void)
- {
- /* initialisation de l'application
- */
- app_init();
-
- /* exécution de l'application
- */
- app_exec();
-
- /* fin de l'application
- */
- app_quit();
- }
-