Tutorial d'initiation A la programmation avec l'API Windows
Tutorial d'initiation a la programmation Windows avec Microsoft Visual C++
Chapitre 1Les bases d'un programme Windows4. Lecture dans un fichier et boîte de dialogue
Cours théorique :
Nous allons maintenant revenir sur un programme utilisant des ressources. En effet, l'utilisation de boites de dialogues créées en ressources permettent bien souvent de gagner un temps précieux pour des programmes de petites tailles et de faible complexité. C'est le cas du programme que nous allons réaliser ici.
Nous allons donc aborder deux thèmes principaux: les boites de dialogues et les controles prédéfinis, ainsi que la lecture d'un fichier par des fonctions de l'API Windows, donc sans utiliser les fonctions du C traditionnel. Les controles prédéfinis sont les 'edit boxes', 'combo boxes', 'buttons', etc. Leur utilisation est très simple car ils sont gérés de manière entièrement autonome. Ils envoient à la fenêtre qui les a créés des messages de notification pour indiquer les actions de l'utilisateur: clic sur le boutton, saisie d'un caractère...
La lecture du fichier se fait de manière relativement simple, et fonctionne par un systeme de HANDLE (comme beaucoup de fonctions de l'API Windows) qu'il faut créer puis détruire.
Projet N°4 :
- Objectif : créer une boite de dialogue permettant la saisie d'un fichier et affichant les 500 premiers octets de ce fichier.
- Réalisation : nous allons ici utiliser une ressource pour créer la boite de dialogue. La lecture du fichier se fera au niveau de la procédure de la boite de dialogue car elle est très brève. Nous utiliserons ici une fonction qui permet de créer la boite de dialogue et de relever les messages, la partie 'main' du programme sera donc très courte (2 lignes).
Télécharger le projet ici.
- Le projet pas à pas :
Nous allons créer un programme avec un fichier de ressources, inclure les fichiers correspondants (voir parties précédentes). La fonction 'WinMain()' est excessivement simple puisque la fonction DialogBox() s'occupe de créer la boîte de dialogue et de récupérer ses messages. Cette fonction retourne seulement une fois que la boite de dialogue est fermée.
#include <Windows.h>
LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance,(LPCTSTR)IDD_MAIN,NULL,(DLGPROC)MainProc); return 0; }
La procédure de la boîte de dialogue est très simple, elle ne gère que trois messages provenant de trois bouttons. IDOK est envoyé lors d'un clic sur le boutton OK, IDCANCEL est envoyé lors d'un clic sur la 'croix' et IDC_LIRE est un message envoyé lors d'un clic sur le boutton IDC_LIRE que nous avons créé. Les variables créées en début de procédure serviront à la lecture du fichier que nous verrons après.
LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam) { int Select; char buf[501]; HANDLE hFile; DWORD Read; switch(message) { case WM_COMMAND: Select=LOWORD(wParam); switch(Select) { case IDC_LIRE:
La réelle nouveauté de ce programme va se faire ici. Il s'agit tout d'abord de récupérer le nom de fichier entré par l'utilisateur. Comme il est entré dans un contrôle prédéfini, nous allons utiliser la fonction GetDlgItemText() et nous plaçerons ce nom de fichier dans le buffer créé au debut de cette procédure sous le nom de 'buf'. Une fois ce nom de fichier récupéré, nous allons essayer d'ouvrir le fichier donné en lecture. Si nous n'y parvenons pas, un message d'erreur sera affiché grâce à la fonction 'MessageBox()'. Le traitement du message sera alors arrêté.
Remarque: la fonction MessageBox() ne retourne qu'une fois que la boîte de dialogue créée est fermée. Mais la récupération des messages de notre boîte de dialogue est assurée par MessageBox(). Le traitement prolongé de ce message n'est donc pas génant dans ce cas puisque les messages continueront d'arriver à notre procédure.
GetDlgItemText(Dlg,IDC_FILENAME,buf,256); hFile=CreateFile(buf,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FI  LE_ATTRIBUTE_NORMAL,NULL); if(hFile==INVALID_HANDLE_VALUE) { MessageBox(Dlg,"Erreur, impossible d'ouvrir le fichier spécifié.","E  rreur",MB_OK); return 0; }
Arrivés à ce stade nous savons que le fichier saisi est valide et qu'il a pu être ouvert. Il ne reste plus qu'à lire les 500 premiers octets. Ils seront placés dans le buffer. Comme cette chaîne vas être afichée, elle doit être terminée par un caractère NULL. C'est pour cette raison que 'buf' a été défini comme un tableau de 501 caractères (500 pour la lecture et 1 pour le caractère NULL). Comme la lecture peut faire moins de 500 octets, nous nous baserons sur la valeur retournée par ReadFile() pour ajouter le caractère NULL. Puis nous afficherons ce buffer dans l'edit box créé a cet effet grace à SetDlgItemText().
ReadFile(hFile,buf,500,&Read,NULL); CloseHandle(hFile); buf[Read]=' '; SetDlgItemText(Dlg,IDC_TEXT,buf); return 0;
Le reste du traitement de la procédure ne présente pas de difficulté particulière. Il est similaire aux traitements précédents. La seule différence notalbe est lors de la fermeture de la boîte de dialogue. Comme elle a été créée avec la fonction DialogBox() il ne faut pas utiliser PostQuitMesage() pour la quitter mais EndDialog().
case IDOK: EndDialog(Dlg,0); return TRUE; case IDCANCEL: EndDialog(Dlg,0); return TRUE; } default: return FALSE; } }
Ce programme est relativement simple. La gestion de l'interface graphique ne prend que quelques lignes. Nous voyons donc bien l'intérêt de l'utilisation des ressources et donc contrôles prédéfinis. Sans l'aide des ressources, ce programme aurait été beaucoup plus compliqué à réaliser.
|