Ce qui suit constitue l'énoncé du travail pratique #2 concernant la portion traitant de l'écran.
Étant donné le programme principal suivant (disponible sur le site du cours, sous le nom de "tp2ecran.cpp" dans l'archive "tp2ecran.zip"):
#include <iostream.h> #include "Ecran.h" #include "Clavier.h" int main () { bool Termine; char c; int RangeeHautEcran; // Garder la valeur de la rangee courante // a l'ecran. int ColonneHautEcran; // Garder la valeur de la colonne courante // a l'ecran. DivisionEcran Portion_Ecran; // Variable de type DivisionEcran // qui specifie le haut ou le bas de // l'ecran. Termine = false; RangeeHautEcran = 0; ColonneHautEcran = 0; Ecran_Initialise(); Message(); while (!Termine) { if (Clavier_Tester_Statut ()) // un caractere a lire { c = Clavier_Lire_Sans_Echo (); if (c == CHAR_ECHAP) { Termine = true; } else { if (RangeeHautEcran >= MAX_RANGEE_HAUT && ColonneHautEcran > MAX_COLONNE_HAUT) { Portion_Ecran = PARTIE_HAUTE_ECRAN; Ecran_Deroule(Portion_Ecran); //On deroule au complet // la partie haute de l'ecran // On revient en haut et a gauche de l'ecran du haut RangeeHautEcran = 0; ColonneHautEcran = 0; Ecran_Ecrire_XY(c, RangeeHautEcran, ColonneHautEcran); ColonneHautEcran++; } else if (ColonneHautEcran > MAX_COLONNE_HAUT) { ColonneHautEcran = 0; RangeeHautEcran++; Ecran_Ecrire_XY(c, RangeeHautEcran, ColonneHautEcran); ColonneHautEcran++; } else if (RangeeHautEcran > MAX_RANGEE_HAUT) { Portion_Ecran = PARTIE_HAUTE_ECRAN; Ecran_Deroule(Portion_Ecran); RangeeHautEcran = 0; ColonneHautEcran = 0; Ecran_Ecrire_XY(c,RangeeHautEcran,ColonneHautEcran); } else { Ecran_Ecrire_XY(c,RangeeHautEcran,ColonneHautEcran); ColonneHautEcran++; } } } } cout << endl << "Au revoir!" << endl; } // main () |
ainsi que le fichier d'en-tête suivant (aussi disponible sur le site du cours, sous le nom de "Ecran.h" dans l'archive "tp2ecran.zip"):
#ifndef ECRAN_H #define ECRAN_H // Le nombre de rangees maximale et de colonne maximale const int MAX_RANGEE_BAS = 24; const int MAX_COLONNE_BAS = 79; const int MAX_COLONNE_HAUT = 79; const int MAX_RANGEE_HAUT = 11; // Celle qui separe les 2 portions d'ecran // Les attributs des caracteres typedef enum { AUCUN,HI,LOW,ITALIQUE,SOULIGNE,BLINK,RAPBLINK,REVVIDEO,INVISIBLE } attr; // La partie haute ou basse de l'ecran typedef enum { PARTIE_HAUTE_ECRAN, PARTIE_BASSE_ECRAN } DivisionEcran; // Les fonctions ecrites en assembleur extern "C" { void Ecrire_Ecran (char c, int pos); void Ecran_Ecrire_XYattr (char c, attr attribut, int r, int col); void Ecran_Ecrire_XY (char c, int rang, int col); void Ecran_Efface(); char Ecran_Lire_Caractere_XY(int rang, int col); } // Les fonctions a ecrire par l'eleve void Ecran_Ecrire(char c, int Rangee, int Colonne); // Cette fonction permet d'ecrire un caractere a la rangee et a // la colonne specifiee. void Ecran_Deroule(DivisionEcran); // Cette fonction deroule "scroll" l'ecran du haut d'une ligne vers // le haut lorsque la rangee est 11 et la colonne est a 79. // Cette fonction deroule l'ecran du bas lorsque la rangee est 24 et // la colonne vaut 79. // Le deroulement dans l'ecran du haut ou du bas est specifie par la // variable de type DivisionEcran void Ecran_Initialise(); // Cette fonction initialise l'ecran. On vide l'ecran et on y affiche // une ligne separatrice au millieu de ce dernier. void Message(); // Fonction sert tout simplement a faire afficher le message // "Esc pour terminer. Je n'ecris rien ici..." dans l'ecran du bas. |
Vous devrez, à l'aide de Borland C 3.1 (BC3.1):
Vous trouverez aussi dans l'archive "tp2ecran.zip" un exécutable, soit "TP2ECRAN.EXE". Le programme "TP2ECRAN.exe" est le résultat minimum attendu de la 2ième partie de ce travail.
Le travail consiste à implanter trois (3) sous-programmes permettant de faire la gestion de la sortie à l'écran. Contrairement aux autres parties du travail, celle-ci réalise la gestion de l'écran par le biais de l'écriture et la lecture de caractère directement dans la mémoire vidéo (voir annexe pour plus d'explication).
Ces sous-programmes respecteront les prototypes donnés par "Ecran.h".
Ce qui suit détaille les sous-programmes existants dont vous devrez faire usage pour votre travail.
Après l'appel de la procédure Ecran_Ecrire_XY(), le caractère c est affiché à l'écran à la position ( Rangee, Colonne ).
void Ecran_Ecrire_XY(char c, int Rangee, int Colonne); |
c |
Caractère à faire afficher à la rangée Rangee et à la colonne Colonne. |
Rangee |
La rangée où faire afficher le caractère à l'écran, dans l'intervalle de 1 à 25 inclusivement. |
Colonne |
La colonne où faire afficher le caractère à l'écran, dans l'intervalle de 1 à 80 inclusivement. |
Exemple:
Ecran_Ecrire_XY('a',10,70); // 'a' s'affiche à la rangée 10, // colonne 70 |
Après l'appel de la procédure Ecran_Ecrire_XYattr(), le caractère c est affiché à l'écran à la position ( Rangee, Colonne ) avec l'attribut attr.
void Ecran_Ecrire_XYattr (char c, attr Attribut_Caractere, int Rangee, int Colonne); |
c |
Caractère à faire afficher à la rangée Rangee et à la colonne Colonne. |
Rangee |
La rangée où faire afficher le caractère à l'écran, dans l'intervalle de 1 à 25 inclusivement. |
Colonne |
La colonne où faire afficher le caractère à l'écran, dans l'intervalle de 1 à 80 inclusivement. |
Attribut_Caractere |
L'attribut à donner au caractère parmi les choix suivants: AUCUN, HI, LOW, ITALIQUE, SOULIGNE, BLINK, RAPBLINK, REVVIDEO, INVISIBLE Ces attributs sont définis par l'intermédiaire du type attr qui est un type énuméré défini dans le fichier "Ecran.h". |
Exemple:
Ecran_Ecrire_XYattr('a',10,70,REVVIDEO); // 'a' s'affiche à la // rangée 10, colonne 70 // en reverse vidéo |
Après l'appel de la fonction Ecran_Lire_Caractere_XY(), le caractère présent à la position ( Rangee, Colonne ) est retourné.
char Ecran_Lire_Caractere_XY (int rangee, int colonne); |
Rangee |
La rangée où lire un caractère à l'écran, dans l'intervalle de 1 à 25 inclusivement. |
Colonne |
La colonne où lire un caractère à l'écran, dans l'intervalle de 1 à 80 inclusivement. |
Cette fonction retourne le caractère présent à la rangée Rangee et la colonne Colonne dans la mémoire vidéo.
Exemple:
c = Ecran_Lire_Caractere_XY(10,70); // c reçoit le caractère se // trouvant à la rangée 10, // colonne 70 de l'écran |
Après l'appel de la procédure Ecran_Efface(), l'écran est effacé entièrement.
void Ecran_Efface(); |
Aucun.
Exemple:
Ecran_Efface(); // l'écran est effacé |
Ce qui suit détaille les sous-programmes que vous devrez écrire dans le cadre de votre travail.
Cette procédure initialise l'écran. Elle vide l'écran et le divise en deux avec un caractère de votre choix. Le caractère '-' pourrait être intéressant pour diviser l'écran.
void Ecran_Initialise (); |
Cette fonction reçoit deux paramètres. Le premier, une variable de type énuméré (DivisionEcran, voir le fichier Ecran.h) qui représente la partie haute ou basse de l'écran. La frontière entre la partie haute et la partie basse de l'écran est représentée par la ligne qui divise l'écran. Le deuxième paramètre est un type char qui représente le caractère à afficher à l'écran.
Exemple d'appel:
DivisionEcran PortionEcran; char c; PortionEcran = PARTIE_HAUTE_ECRAN; c = 'd'; Ecran_Ecrire_XY(DivisionEcran, c); |
L'appel de Ecran_Ecrire_XY() ci-dessus fera en sorte de faire afficher la lettre 'd' dans la partie haute de l'écran à la rangée et la colonne courante.
Ceci vous demande donc de garder, par l'intermédiaire de deux variables (une pour la rangée et une pour la colonne), la valeur de la rangée courante et de la colonne courante.
Cette procédure doit faire dérouler vers le haut les lignes de textes précédemment entrées. Vous devez donc, par une combinaison des sous-programmes Ecran_Lire_Caractere_XY() et Ecran_Ecrire_XY(), faire monter les lignes de la portion haute ou basse de l'écran (tel que spécifié par le paramètre reçu de type DivisionEcran--voir le fichier Ecran.h) d'une rangée vers le haut.
Ainsi, l'appel suivant:
Ecran_Deroule(PARTIE_BASSE_ECRAN); |
aura cet effet:
Dans le programme de démonstration, cette procédure vide en entier la portion de l'écran considerée.
Vérification: laboratoire de la semaine du 17 avril 2000.