Projet III : Utilisation du GDI

Dans ce TD nous allons voir comment dessiner sur une fiche à l’aide du GDI de Windows.

Créez une nouvelle application (appelée par exemple " Le Dessinateur ").

Le programme devra pouvoir dessiner les trois formes de base : ligne, rectangle, ellipse. Chacune de ces formes comportant un point d’origine et un point d’arrivée, le programme devra donc stocker ces informations dans des structures de type POINT.

L’utilisateur devra pouvoir choisir, via des menus déroulants, le style de sa plume (voir dans l’aide en ligne énumération TPenStyle), de son pinceau (enum TBrushStyle), ainsi que sa forme (ligne, rectangle ou ellipse). Ces informations seront stockées dans des champs privés de la fiche.

Pour dessiner, l’utilisateur devra cliquer sur la fiche, bouger la souris tout en maintenant le bouton appuyé, puis relâcher le bouton. Il définira alors le point d’origine et le point d’arrivée de la forme à dessiner.

  1. Construisez le menu déroulant permettant de choisir le pinceau, la plume et la forme retenues. Ecrire les fonction de réponse aux évènements associés.
  2. Ecrire les fonctions de réponse aux évènements OnMouseDown et OnMouseUp permettant de définir les points origine et arrivée. Dessiner les formes.
  3. Rajouter un élément de menu permettant d’effacer la fiche (voir méthode Invalidate).
  4. Que se passe-t-il si on redimensionne la fiche, la réduit, la cache par une autre fenêtre ? Comment régler ce problème ?
  5. En utilisant l’évènement OnMouseMove ainsi que la possibilité du GDI de dessiner avec un masque XOT (voir fonction SetROP2 de l’API Windows), montrez comment on peut dessiner la forme au fur et à mesure sans laisser de traces et sans effacer le dessin.
  6. Traiter l’évènement OnPaint de la fiche : utilisez-le pour afficher un titre au dessin via la fonction TextOut.
  7. Afin d’obtenir des affichages persistants, posez un composant TImage sur la fiche. Modifiez le source de manière à dessiner dans le Canvas de l’image plutôt que dans celui de la fiche. N’oubliez pas qu’à présent, il faut traiter les évènements de l’image et non ceux de la fiche (pour la souris). Est-ce qu’à présent nous avons besoin de traiter OnPaint ?