Section courante

A propos

Section administrative du site

Les premiers pas

Cette section contient des conseils de programmation et des recettes de code pour WinGraph. Si vous avez des questions, veuillez d'abord consulter cette section.

Comment compiler les unités WinGraph ?

Les fichiers sources sont situés dans le dossier \src. Ce sont 'wingraph.pas', 'wincrt.pas' et 'winmouse.pas'. Ils peuvent être compilés directement à l'aide du compilateur en ligne de commande (même après avoir déplacé les fichiers dans un autre dossier) ou à l'aide des scripts de traitement par lots fournis. Dans ce dernier cas, consultez le fichier 'compile.txt' pour plus de détails.

Comment utiliser les commutateurs du compilateur dans WinGraph ?

Dans l'unité 'wingraph.pas', il y a trois commutateurs avec lesquels vous pouvez jouer. Le commutateur 256_COLOR_NAMES définit 256 variables de nom de couleur pouvant être utilisées lors de la sélection des couleurs. Si un pilote graphique hérité est sélectionné (avec 16 couleurs ou moins), il vaut mieux laisser ce commutateur désactivé, car les couleurs ne sont pas cartographiées correctement. Le commutateur INIT_OPENGL active les dessins OpenGL dans la fenêtre graphique, sinon il peut être désactivé. Le commutateur HIDE_CONSOLE masque temporairement la fenêtre de la console parente (si le programme en a une) au moment où la fenêtre graphique est affichée.

Si le programme génère une sortie utile dans la console pendant l'exécution, laissez ce commutateur désactivé. Notez que tous les commutateurs mentionnés ci-dessus ne sont pas activés par défaut.

Comment utiliser les unités WinGraph pour mon projet ?

Vous avez ici deux options :

Les unités WinCrt et WinMouse sont facultatives (elles ajoutent le support du clavier et de la souris à WinGraph).

À propos de la philosophie de WinGraph

Votre fenêtre de programme principale peut être une console ou une interface graphique. Peu importe, puisque WinGraph crée sa propre fenêtre graphique avec un processus léger dédié pour gérer ses messages. Il gérera également tous les événements de clavier et de souris, si les unités WinCrt et WinMouse sont incluses. Tout cela ne se produit qu'après avoir appelé la routine InitGraph.

Vous devez d'abord définir les dimensions de la fenêtre et le nombre de couleurs dans la palette en jouant avec les pilotes et les modes. Après avoir défini certains attributs (couleur, police de caractères, style des lignes, remplissage,...), vous pouvez commencer à dessiner comme dans l'unité Graph de Borland Pascal. Après chaque opération graphique, vous pouvez vérifier GraphResult pour découvrir si quelque chose s'est mal passé.

Si vous essayez de porter le code hérité de Borland Pascal vers WinGraph, faites attention aux aspects suivants : les routines marquées avec le symbole (P) ou (D) peuvent se comporter différemment (vérifiez les paramètres), les routines marquées avec (N) sont manquantes et les routines Crt pour la gestion du clavier est émulée par l'unité WinCrt uniquement après InitGraph. C'est une bonne idée de porter d'abord le code pour la cible GO32v2 du compilateur Free Pascal.

Plusieurs démonstrations sont incluses pour vous adapter au style de programmation WinGraph.

Incompatibilités importantes avec l'unité Graph de Borland Pascal

Comment initialiser la fenêtre graphique ?

Le code le plus simple est :

  1. gd:=Detect;
  2. InitGraph(gd,gm,'');
  3.  { ... Mettre votre code ici ... }
  4. Repeat Until CloseGraphRequest; { Ces instructions attend que le bouton de fermeture soit cliqué }
  5. CloseGraph;

Si l'unité WinCrt est incluse, la quatrième ligne peut être remplacée par :

  1. ReadKey; { Cette fonction attend que n'importe quelle touche soit pressée }

Cependant, n'utilisez pas la routine standard ReadLn pour attendre les entrées du clavier.

Comment ouvrir une fenêtre de taille personnalisée ?

Supposons que nous voulions ouvrir une minuscule fenêtre graphique de 200 par 100. Nous avons :

  1. SetWindowSize(200,100);
  2. gd:=nopalette; gm:=mCustom;
  3. InitGraph(gd,gm,'Une fenêtre de petite taille');
  4.  { ... Mettre votre code ici ... }
  5. Repeat
  6.  Delay(10); { cette instruction donne un peu de repos au microprocesseur (nécessite l'unité WinCrt) }
  7. Until CloseGraphRequest; { Ces instructions attend que le bouton de fermeture soit cliqué }
  8. CloseGraph;

Quel est le problème avec la routine ReadLn ?

La routine ReadLn attend une entrée de la fenêtre de la console parente, étant masquée après l'appel à InitGraph. Il n'y a aucun moyen de recevoir des entrées. Cependant, si vous souhaitez compiler beaucoup de code hérité, vous pouvez redéfinir la routine ReadLn comme suit :

  1. Procedure ReadLn;Begin
  2.  Repeat Until (ReadKey=#13);
  3. End;

Vous pouvez maintenant utiliser cette routine comme prévu, mais l'unité WinCrt doit être incluse.

Comment éviter que la fenêtre de la console parent n'apparaisse ?

Dans votre programme principal, utilisez la directive de compilation suivante :

  1. {$APPTYPE GUI}

Notez que dans Delphi, c'est la valeur par défaut.

La fenêtre de la console parent est-elle utile, de toute façon ?

Parfois oui. Par exemple, dans la phase de débogage de votre programme. Si la fenêtre de console parente n'est pas inhibée, vous pouvez utiliser la routine standard WriteLn pour sortir des choses utiles pendant l'exécution dans la console.

Notez qu'en Delphi, vous devez utiliser, dans ce cas, la directive :

  1. {$APPTYPE CONSOLE}

Comment écrire du texte avec des polices de caractères personnalisées ?

Supposons que vous vouliez écrire du texte en utilisant une police de caractères spécifique, par exemple 'Verdana' avec une taille de police de caractères de 18. La routine suivante vérifie si la police est enregistrée dans le système et définit les attributs de texte en conséquence.

  1. Procedure ChangeFont;
  2. Var 
  3.  Font:SmallInt;
  4. Begin
  5.  Font:=InstallUserFont('Verdana');
  6.  If(font<0)Then Exit;
  7.  SetTextStyle(font,HorizDir,18);
  8. End;

Notez que plusieurs polices de caractères sont installées par défaut lors de l'initialisation. Voir la documentation.

Comment effectuer facilement des entrées et des sorties dans la fenêtre graphique ?

Dans l'unité WinCrt, il y a deux routines, ReadBuf et WriteBuf, faisant bien le travail. Ils émulent les routines de console de lecture et d'écriture. Vous avez un exemple ici :

  1. WriteBuf('Veuillez saisir du texte ici :');
  2. ReadBuf(t,0);
  3. WriteBuf('Vous êtes entré :'+t);

Comment ajouter le support du clavier à mon programme graphique ?

Vous devez inclure l'unité WinCrt et, dans la boucle principale du programme, appeler une routine comme celle-ci :

  1. Procedure CkeckKeyboard;
  2. Var 
  3.  c:Char;
  4. Begin
  5.  If Not(KeyPressed)Then Exit;
  6.  c:=ReadKey;
  7.  Case c of
  8.   #27:Begin { Touche Esc }
  9.    { Mettre votre code ici }
  10.   End;
  11.    { ... }
  12.   #0:Begin { Touche étendu }
  13.    c:=ReadKey;
  14.    Case c of
  15.     #75:Begin { Touche de flèche de gauche }
  16.      { Mettre votre code ici }
  17.     End;
  18.     {...}
  19.    End;
  20.   End;
  21.  End;
  22. End;

Consultez la documentation WinGraph pour la liste complète des codes de touches.

Comment ajouter le support de la souris à mon programme graphique ?

Vous devez inclure l'unité WinMouse et, dans la boucle principale du programme, appeler une routine comme celle-ci :

  1. Procedure CkeckMouse;
  2. Var 
  3.  me:MouseEventType;
  4. Begin
  5.  If Not(PollMouseEvent(me))Then Exit;
  6.  GetMouseEvent(me);
  7.  With me do Case action of
  8.   MouseActionDown:Begin { Bouton de la souris appuyé }
  9.    Case buttons of
  10.     MouseLeftButton:Begin { Bouton de gauche }
  11.      { Mettre votre code ici }
  12.     End;
  13.      {...}
  14.    End;
  15.  End;
  16.   { ... }
  17.  End;
  18. End;

Consultez la documentation WinGraph pour une description complète du type MouseEventType.

Comment charger une image BMP depuis le disque ?

Supposons que nous ayons une image BMP non compressée au format 24 bits dans le fichier 'image.bmp'. La routine suivante place cette image à l'écran, dans le coin supérieur gauche :

  1. Procedure LoadBMP;
  2. Var 
  3.  F:File; 
  4.  Bitmap:Pointer; 
  5.  Size:LongInt;
  6. Begin
  7.  {$I-} Assign(f,'image.bmp'); 
  8.  Reset(f,1); {$I+}
  9.  If(IOResult<>0)Then Exit;
  10.  Size:=FileSize(f);
  11.  GetMem(bitmap,size);
  12.  BlockRead(f,bitmap^,size);
  13.  Close(f);
  14.  PutImage(0,0,bitmap^,NormalPut);
  15.  FreeMem(bitmap);
  16. End;

Comment capturer le contenu de la fenêtre dans une image BMP sur disque ?

Pour capturer tout le contenu de la fenêtre dans le fichier 'image.bmp', utilisez la routine suivante :

  1. Procedure SaveBMP;
  2. Var 
  3.  F:File; 
  4.  Bitmap:Pointer; 
  5.  Size:LongInt;
  6. Begin
  7.  {$I-} Assign(f,'image.bmp'); 
  8.  Rewrite(f,1); {$I+}
  9.  If(IOResult<>0)Then Exit;
  10.  size:=ImageSize(0,0,GetMaxX,GetMaxY);
  11.  GetMem(bitmap,size);
  12.  GetImage(0,0,GetMaxX,GetMaxY,bitmap^);
  13.  BlockWrite(f,bitmap^,size);
  14.  Close(f);
  15.  FreeMem(bitmap);
  16. End;

Comment réaliser des animations de base ?

Celle-ci consiste en deux étapes :

Vous devez libérer les ressources d'animation à la fin en appelant FreeAnim.

Comment réaliser des animations OpenGL ?

Tout d'abord, chargez les unités d'en-tête OpenGL avec :

  1. Uses WinGraph,{$IFDEF FPC}gl,glu;{$ELSE}opengl;{$ENDIF}

et ensuite effectuer quelques initialisations :

  1. SetOpenGLMode(DirectOn);
  2.  { Mettre votre code ici pour la scène d'initialisation OpenGL }

Ensuite, il suit la boucle d'animation :

  1. Repeat
  2.  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); { Efface l'écran OpenGL }
  3.   { Mettre votre code ici pour dessiner une scène OpenGL }
  4.  UpdateGraph(UpdateNow);
  5. Until CloseGraphRequest;

Veuillez consulter un manuel OpenGL pour plus de détails.

Comment obtenir des effets de palette ?

Supposons que nous voulions montrer un texte à l'écran progressivement à l'utilisateur (effet d'ombrage). Préparez l'écran à l'avance :

  1. SetColor(White);
  2. SetRGBPalette(White,1,1,1);
  3. { Mettre votre code ici pour écrire du texte }

Le texte n'est pas encore visible, car il est trop sombre (mais pas noir). Avec la routine suivante, nous obtenons le résultat :

  1. Procedure ShadingEffect;
  2. Var 
  3.  i:byte;
  4. Begin
  5.  For i:=50 to 250 do Begin
  6.   Delay(10); { Définir la temporisation ici }
  7.   SetRGBPalette(White,i,i,i);
  8.  End;
  9. End;

Notez que cela ne fonctionne que sur les pilotes basés sur une palette, tels que D8bit.



Dernière mise à jour : Dimanche, le 9 juillet 2023