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 :
- Déplacer les fichiers source de WinGraph dans votre dossier de projet et les compiler avec votre code ;
- Compilez les unités WinGraph dans leur emplacement par défaut et déplacez les fichiers binaires compilés dans votre dossier de projet. Ces fichiers
binaires ont des extensions *.o, *.ppu (pour FPC) ou *.dcu (pour Delphi) et sont
situés dans le dossier \bin. Dans l'en-tête de votre programme, écrivez :
- Uses wingraph,wincrt,winmouse;
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
- Les noms de couleur (Rouge, Vert, ...) ne sont pas des constantes, mais des variables étant cartographiées à l'index de couleur le plus proche dans la palette après chaque appel à SetAllPalette.
- Ces variables de couleur sont de type LongWord (et non Word)
- La routine SetBkColor ne change pas instantanément la couleur d'arrière-plan, uniquement sur les dessins suivants
- Les routines Line et OutTextXY mettent à jour le pointeur actuel
- Le style de ligne défini par l'utilisateur ne fonctionne qu'avec les routines Line, LineRel, LineTo et uniquement pour une largeur de 1 pixel
- les styles de lignes non solides ne fonctionnent que pour une largeur de 1 pixel
- PointType est défini comme un enregistrement de LongInt (pas SmallInt)
- Si le style UserFill est utilisé dans la routine SetFillStyle, le paramètre de couleur est ignoré et le modèle utilisateur aura la couleur initiale déclarée avec SetFillPattern lors de sa première création
- Les routines suivantes se comportent différemment (drapeau D) : GetMaxMode, GetModeRange et SetUserCharSize
- Les routines suivantes ne sont pas implémentées (drapeau N) : InstallUserDriver, RegisterBGIDriver, RegisterBGIFont, SetGraphBufSize
- Plusieurs routines acceptent des paramètres différents de leurs homologues Borland Pascal (drapeau P)
Comment initialiser la fenêtre graphique ?
Le code le plus simple est :
Si l'unité WinCrt est incluse, la quatrième ligne peut être remplacée par :
- 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 :
- SetWindowSize(200,100);
- gd:=nopalette; gm:=mCustom;
- InitGraph(gd,gm,'Une fenêtre de petite taille');
- { ... Mettre votre code ici ... }
- Repeat
- Delay(10); { cette instruction donne un peu de repos au microprocesseur (nécessite l'unité WinCrt) }
- Until CloseGraphRequest; { Ces instructions attend que le bouton de fermeture soit cliqué }
- 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 :
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 :
- {$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 :
- {$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.
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 :
- WriteBuf('Veuillez saisir du texte ici :');
- ReadBuf(t,0);
- 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 :
- Procedure CkeckKeyboard;
- Var
- c:Char;
- Begin
- If Not(KeyPressed)Then Exit;
- c:=ReadKey;
- Case c of
- #27:Begin { Touche Esc }
- { Mettre votre code ici }
- End;
- { ... }
- #0:Begin { Touche étendu }
- c:=ReadKey;
- Case c of
- #75:Begin { Touche de flèche de gauche }
- { Mettre votre code ici }
- End;
- {...}
- End;
- End;
- End;
- 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 :
- Procedure CkeckMouse;
- Var
- me:MouseEventType;
- Begin
- If Not(PollMouseEvent(me))Then Exit;
- GetMouseEvent(me);
- With me do Case action of
- MouseActionDown:Begin { Bouton de la souris appuyé }
- Case buttons of
- MouseLeftButton:Begin { Bouton de gauche }
- { Mettre votre code ici }
- End;
- {...}
- End;
- End;
- { ... }
- End;
- 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 :
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 :
Comment réaliser des animations de base ?
Celle-ci consiste en deux étapes :
- Supposons que nous créons à l'écran une image de sprite délimitée par un rectangle (0,0,24,24) et que nous souhaitons définir la transparence sur la couleur noire. Le code suivant fait ce travail et place l'animation sur sa première position à l'écran :
- Le code suivant exécute une étape de l'animation sur l'écran :
- Delay(25); { définir la temporisation ici }
- PutAnim(xold,yold,anim,BkgPut);
- PutAnim(xnew,ynew,anim,TransPut);
- UpdateGraph(UpdateNow);
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 :
- Uses WinGraph,{$IFDEF FPC}gl,glu;{$ELSE}opengl;{$ENDIF}
et ensuite effectuer quelques initialisations :
- SetOpenGLMode(DirectOn);
- { Mettre votre code ici pour la scène d'initialisation OpenGL }
Ensuite, il suit la boucle d'animation :
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 :
- SetColor(White);
- SetRGBPalette(White,1,1,1);
- { 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 :
Notez que cela ne fonctionne que sur les pilotes basés sur une palette, tels que D8bit.