Bonjour,

Je vous propose un nouvel élément à utiliser : Puzzle, un jeu de patience



Ce programme est réalisé avec l'atelier logiciel Microsoft

Visual Studio Community 2019
et utilise la bibliothèque

MFC standard et son architecture Document/Vue.

L'originalité est d'afficher une première fenêtre comportant

deux Views de type Windows Explorer et une deuxième fenêtre

type ScrollView multiple montrant les différents puzzles en cours de résolution.





Le code présenté, largement documenté, permet,

ajouté aux possibilités de l'atelier logiciel, de comprendre

assez aisément les fonctions assurées par ce programme.





Structure du programme





Classiquement la classe CPuzzleApp dérivée de CWinAppEx, contenue

dans les fichiers Puzzle.h et Puzzlz.cpp

démarre le programme et assure les initialisations et définit les deux 'templates'

composant les fenêtres Explorateur et Puzzle de l’application.

Une classe CDocManagerEx dérivée de CDocManager, contenue

dans les fichiers DocManagerEx.h et DocManagerEx.cpp

assure l’aiguillage des requêtes vers le bon 'template' en fonction des types des fichiers :




  • Les dossiers sont dirigés vers l'Explorateur,

  • les fichiers sont dirigés vers le traitement du Puzzle, ne retenant que les

    extensions *.bmp, *.jpg, *.gif, *.wmf et *.emf correspondant à des images

    et *.puz spécifique à un Puzzle en cours, déjà sauvegardé sous cette forme.






La classe CMainFrame dérivée de CMDIFrameWndEx assure la classe principale,

contenue dans les fichiers MainFrm.h et MainFrm.cpp.

Elle contient les fonctions communes.





Première fenêtre : Windows Explorer





Classiquement, ses deux Views sont gérées grâce à une classe CSplitterWndEx

placée dans la classe CMenuFrame (dérivée de CMDIChildWndEx), contenue dans

les fichiers MenuFrm.h et MenuFrm.cpp.

Elle supporte les classes CLeftView (dérivée de CTreeView) et

CMenuView (dérivée de CScrollView), contenues dans les fichiers

LeftView.h, LeftView.cpp,

MenuView.h et MenuView.cpp.



Cette construction peut surprendre, mais l'utilisation des classes

CMFCShellTreeCtrl et CMFCShellListCtrl

assurent les fonctions d'exploration de fichiers et simplifient la programmation.

De plus une Clist mémorisant les imagettes permet de compléter

la présentation des différentes images contenues dans le dossier exploré.



La classe CMenuDoc dérivée de CDocument complète la structure, contenue

dans les fichiers MunuDoc.h et MenuDoc.cpp.









Deuxième fenêtre : le Puzzle





La partie Puzzle est composée des classes suivantes formant le classique du 'template' d'affichage :




  • La classe CPulzzeView dérivée de CSCrollView, contenue dans les

    fichiers PuzzleView.h et PuzzlzView.cpp,

  • la classe CPuzzleFrame dérivée de CMDIChildWndEx, contenue dans

    les fichiers PuzzleFrm.h et PuzzleFrm.cpp,

  • la classe CPuzzleDoc dérivée de CDocument, contenue dans les

    fichiers PuzzlzDoc et PuzzlzDoc.cpp,






La dernière classe nommée utilise la classe CPuzCtrl, contenue

dans les fichiers PuzCtrl.h et PuzCtrl.cpp,

pour toutes les fonctionnalités du jeu. Le paragraphe suivant lui est réservé.







Fonctionnalités du jeu : Classe CPuzCtrl





C'est cette classe qui gère toutes les opérations du jeu.

Une instanciation de cette classe est créée pour chaque nouveau Puzzle traité.

Les opérations du découpage de l'image en pièces au mélange puis à l'affichage sont assumés par le code de cette classe.

Cette classe assure aussi le mouvement des pièces avec la souris ou lors de la résolution automatique.

Des structures principales contiennent les informations nécessaires à son fonctionnement :




  • HBITMAP m_hBm la bitmap contenant l'image du Puzzle en cours.

  • PVOID m_pData des informations supplémentaires de la bitmap.

  • CSize m_size, m_puzSize les dimensions en pixels de l'image

    utilisée pour le Puzzle.

  • struct t_PIECE : définit pour chaque pièce du Puzzle

    la position initiale, un numéro, des chaînages matérialisant un ordre

    d'affichage et le collage de pièces.

  • Table t_PIECE* m_pPieces : regroupe dans une même structure toutes

    les pieces composant le Puzzle.

    WORD m_nx, m_ny : le nombre de pièces dans les deux directions.

  • CList m_anim : contient un pointeur vers chaque pièce en mouvement.

  • CString m_pictPath : nom du fichier complet contenant l'image du Puzzle.

  • CString m_puzzPath : nom du fichier *.puz contenant le descriptif du Puzzle.

  • TCHAR m_puzzFolder[MAX_PATH] : nom du dossier en mémoire locale où

    sont placés les dossiers descripteurs de Puzzle.

  • CPuzCtrl* m_pPuzFirst, *m_pLink : un système de chaînage des classes

    CPuzCtrl permettant de chaîner les classes CPuzCtrl

    et retrouver tous les Puzzles en mémoire.






Ces structures sont complétées par des variables gérant les différentes variables de la classe.







Utilitaires





Des classes auxiliaires assurent des fonctions annexes comme par exemple

les boites de dialogue :




  • Classe CNotesDlg dérivée de la Classe CFrameWnd,

    affiche les notes éventuelles attenantes aux images, rédigées en html.

    Elle est aidée de la classe incluse CNotesView

    dérivée de la classe CHtmlView, le tout contenu dans les fichiers

    NotesView.h et NotesView.cpp.



  • Classe CModel dérivée de CWnd, affiche

    l'image modèle du Puzzle en cours, contenue dans les fichiers

    Model.h et Model.cpp.



  • BitmapRW.h BitmapRW.cpp : Ces fichiers contiennent

    des fonctions assurant le traitement des images et quelques fonctions annexes.



  • Classe CColorsDlg : Assure le dialogue

    permettant de modifier les couleurs du Puzzle, contenu dans les fichiers

    ColorsDlg.h et ColorsDlg.cpp.



  • Classe COptionsDlg : Assure le dialogue

    permettant de modifier les différentes options du jeu, contenu dans les fichiers

    OptionsDlg.h, OptionsDlg.cpp,

    Options.h et Options.cpp.



  • Classe CHelpDlg :Assure l'affichage du mode

    d'emploi de ce jeu, contenu dans les fichiers :

    HelpDlg.h, HelpDlg.cpp

    et HMenu.h qui contient seul les définitions

    spécifiques de l'application.




Qu'en pensez-vous ?