Ajouter des couleurs dans la console en Pascal

Les applications console en Pascal/Delphi peuvent sembler austères, mais elles peuvent en réalité afficher jusqu’à 16 couleurs différentes pour rendre vos programmes plus visuels et conviviaux. Dans cet article, nous allons explorer comment manipuler les couleurs de la console Windows en Pascal.

Prérequis#

Pour utiliser les fonctions de couleur, vous devez inclure l’unité Windows dans votre programme :

program ConsoleColors;
uses
  Windows, SysUtils;

Comprendre le système de couleurs#

La console Windows utilise un système de 16 couleurs (0-15) :

  • 0-7 : Couleurs de base (sombres)
  • 8-15 : Versions claires des mêmes couleurs

Chaque couleur peut être appliquée au texte (premier plan) ou à l’arrière-plan.

Fonction principale de couleur#

Voici la procédure essentielle pour changer les couleurs :

PROCEDURE SetColor(foreground: byte; background: byte);
Begin
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), foreground + (background * 16));
End;

Comment ça fonctionne ?#

  • foreground : Couleur du texte (0-15)
  • background : Couleur de fond (0-15)
  • background * 16 : Décale les bits de fond vers les 4 bits supérieurs
  • foreground + (background * 16) : Combine les deux valeurs

Afficher toutes les couleurs disponibles#

Pour voir toutes les couleurs disponibles, créons une procédure de démonstration :

PROCEDURE ShowAllColors();
var
  i: integer;
Begin
  writeln('=== Palette de couleurs disponibles ===');
  writeln;

  FOR i := 0 TO 15 do
  Begin
    SetColor(7, 0);           // Couleur par défaut pour les étiquettes
    write(i:2, ' --> ');
    SetColor(i, 0);           // Texte coloré sur fond noir
    writeln('■■■■■■■■■■');
  End;

  SetColor(7, 0);             // Retour à la couleur par défaut
  writeln;
  writeln('Légende des couleurs :');
  writeln('0: Noir      1: Bleu foncé    2: Vert foncé    3: Cyan foncé');
  writeln('4: Rouge     5: Magenta      6: Brun          7: Gris clair');
  writeln('8: Gris      9: Bleu clair    10: Vert clair   11: Cyan clair');
  writeln('12: Rouge    13: Magenta      14: Jaune        15: Blanc');
End;

Procédures utilitaires#

Écrire du texte en couleur#

Pour éviter de répéter SetColor() avant et après chaque écriture :

PROCEDURE WriteColor(text: string; textColor: byte; bgColor: byte = 0);
Begin
  SetColor(textColor, bgColor);
  write(text);
  SetColor(7, 0);             // Retour à la couleur par défaut
End;

PROCEDURE WriteLnColor(text: string; textColor: byte; bgColor: byte = 0);
Begin
  WriteColor(text + #13#10, textColor, bgColor);
End;

Effacer l’écran avec une couleur de fond#

PROCEDURE ClearScreen(bgColor: byte = 0);
var
  csbi: TConsoleScreenBufferInfo;
  consoleHandle: THandle;
  coord: TCoord;
  written: DWORD;
  size: DWORD;
Begin
  consoleHandle := GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(consoleHandle, csbi);

  size := csbi.dwSize.X * csbi.dwSize.Y;
  coord.X := 0;
  coord.Y := 0;

  FillConsoleOutputCharacter(consoleHandle, ' ', size, coord, written);
  FillConsoleOutputAttribute(consoleHandle, bgColor, size, coord, written);
  SetConsoleCursorPosition(consoleHandle, coord);
End;

Exemple pratique complet#

Voici un programme complet qui démontre l’utilisation des couleurs :

program ConsoleColorsDemo;
uses
  Windows, SysUtils, Crt;

// Procédures de couleur (définies ci-dessus)
PROCEDURE SetColor(foreground: byte; background: byte);
Begin
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), foreground + (background * 16));
End;

PROCEDURE WriteColor(text: string; textColor: byte; bgColor: byte = 0);
Begin
  SetColor(textColor, bgColor);
  write(text);
  SetColor(7, 0);
End;

PROCEDURE WriteLnColor(text: string; textColor: byte; bgColor: byte = 0);
Begin
  WriteColor(text + #13#10, textColor, bgColor);
End;

PROCEDURE ShowAllColors();
var
  i: integer;
Begin
  WriteLnColor('=== Palette de couleurs ===', 15, 1);
  writeln;

  FOR i := 0 TO 15 do
  Begin
    SetColor(7, 0);
    write(i:2, ' --> ');
    SetColor(i, 0);
    writeln('■■■■■■■■■■');
  End;

  SetColor(7, 0);
  writeln;
End;

var
  choix: char;
Begin
  ClearScreen(0);

  WriteLnColor('=== Programme de démonstration des couleurs ===', 14, 1);
  writeln;
  writeln('1. Afficher la palette de couleurs');
  writeln('2. Texte en couleur');
  writeln('3. Quitter');
  writeln;
  write('Votre choix (1-3) : ');

  choix := readkey;
  writeln;

  case choix of
    '1': ShowAllColors;
    '2':
    begin
      WriteLnColor('Ce texte est rouge sur fond jaune', 4, 14);
      WriteLnColor('Ce texte est vert clair sur fond bleu', 10, 1);
      WriteLnColor('Ce texte est blanc brillant sur fond noir', 15, 0);
    end;
    '3': exit;
  end;

  writeln;
  WriteLnColor('Appuyez sur une touche pour quitter...', 7, 0);
  readkey;
End.

Bonnes pratiques#

1. Toujours restaurer les couleurs par défaut#

Après avoir écrit du texte coloré, restaurez les couleurs par défaut :

SetColor(7, 0);  // Texte gris clair sur fond noir

2. Utiliser des constantes pour la lisibilité#

const
  COLOR_BLACK = 0;
  COLOR_BLUE = 1;
  COLOR_GREEN = 2;
  COLOR_CYAN = 3;
  COLOR_RED = 4;
  COLOR_MAGENTA = 5;
  COLOR_BROWN = 6;
  COLOR_LIGHT_GRAY = 7;
  COLOR_GRAY = 8;
  COLOR_LIGHT_BLUE = 9;
  COLOR_LIGHT_GREEN = 10;
  COLOR_LIGHT_CYAN = 11;
  COLOR_LIGHT_RED = 12;
  COLOR_LIGHT_MAGENTA = 13;
  COLOR_YELLOW = 14;
  COLOR_WHITE = 15;

// Utilisation
WriteLnColor('Erreur critique !', COLOR_LIGHT_RED, COLOR_BLACK);

3. Éviter les combinaisons difficiles à lire#

Certaines combinaisons de couleurs sont peu lisibles :

  • Texte jaune sur fond blanc
  • Texte bleu clair sur fond cyan clair
  • Texte vert sur fond vert clair

4. Tester sur différents terminaux#

Les couleurs peuvent varier selon :

  • La version de Windows
  • Les paramètres d’accessibilité
  • Les thèmes de console personnalisés

Limitations et alternatives#

Limitations#

  • 16 couleurs seulement : Pas de millions de couleurs comme en mode graphique
  • Windows uniquement : Ces fonctions ne fonctionnent pas sur Linux/macOS
  • Pas de transparence : Les couleurs sont opaques

Alternatives modernes#

Pour des applications plus avancées, considérez :

  • Bibliothèques graphiques : SDL, OpenGL
  • Frameworks UI : FireMonkey, VCL
  • Bibliothèques console avancées : Crt, Console

Conclusion#

Les couleurs en console Pascal/Delphi peuvent transformer radicalement l’expérience utilisateur de vos applications. Bien que limitées à 16 couleurs, elles permettent de créer des interfaces plus intuitives et visuellement attrayantes.

Vous avez maintenant toutes les clés pour rendre vos programmes console plus colorés et professionnels !

Julien HOMMET
5 minutes
854 mots
cours