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 Windows6. Lecture d'un fichier WAV
Cours théorique :
A présent, nous allons réaliser un nouveau projet qui sera déjà un programme 'utile' en soi. Evidemment, il restera très sommaire et se contentera de lire un fichier WAV sélectionné par l'utilisateur.
Nous inviterons tout d'abord l'utilisateur à choisir le fichier qu'il veut lire à partir d'une boîte de dialogue 'parcourir'. Une fois que l'utilisateur aura choisi le fichier qu'il désire lire, il pourra choisir de l'écouter. La lecture du fichier WAV se fera grâce à une fonction multimédia fournie par Windows: sndPlaySound(). Cette fonction est entièrement autonome et lira le fichier en arrière plan sans la moindre intervention de la part du programme. Cet automatisme est très pratique puisqu'il permet de lire le fichier sans se soucier de rien. Cependant, les possibilités de cette fonction restent restreintes. On pourra se satisfaire de cette fonction dans quasiment toutes les applications multimédias.
Projet N°5 :
- Objectif : créer une boite de dialogue permettant la saisie d'un fichier WAV puis sa lecture.
- Réalisation : nous allons utiliser un fichier ressources qui sera ici très adapté. Le programme ne contiendra que la fonction WinMain() et une procédure pour la boite de dialogue.
Télécharger le projet ici.
- Le projet pas à pas :
Comme dans le programme précédent, nous allons créer un projet d'application Win32, ainsi qu'un fichier de ressources. La fonction WinMain() contiendra simplement l'appel de notre boîte de dialogue. Remarquons tout de même que la fonction sndPlaySound() que nous allons utiliser se trouve dans la librairie 'winmm.lib' qui n'est pas une librairie standard. Il faut donc ajouter cette librairie. Ceci peut être fait grâce au menu Project/Setting/Link/Input. Dans le champ contenant déjà les librairies par défaut, ajoutez 'winmm.lib'. Sans cet ajout, nous obtiendrions une erreur à la compilation indiquant que la fonction ne peut pas être trouvée.
La boîte de dialogue contiendra un champ 'Edit Box' (IDC_NOMDEFICHIER)dans lequel sera affiché le nom du fichier à lire. Nous cocherons la case 'Read Only' dans les options de ce champ de manière à empêcher l'utilisateur de saisir lui même un nom de fichier. De cette manière, la possibilité de choix erronés se trouve déjà limitée.
Nous ajouterons un bouton 'Parcourir' avec pour identifiant 'IDC_PARCOURIR' et un bouton 'Lire' (IDC_LIRE). Pour quitter, l'utilisateur devra utiliser la 'croix' (ID_CANCEL).
La fonction WinMain() ne diffère pas par rapport au programme précédent (si ce n'est dans les entêtes à inclure). Nous ajouterons une variable globale de manière à pouvoir accéder à l'instance du programme dans toutes les fonctions du programme (et ici dans la procédure de la boîte de dialogue).
#include <Windows.h> #include <mmsystem.h> #include "ressource.h"
HINSTANCE hInst;
LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { hInst=hInstance; DialogBox(hInstance,(LPCTSTR)IDD_MAIN,NULL,(DLGPROC)MainProc); return 0; }
La procédure de la boîte de dialogue n'est pas très compliquée. Il faudra toutefois y ajouter les boutons 'Lire' et 'Parcourir'. Le bouton parcourir sera le plus difficile à ajouter.
Nous allons réserver un buffer de taille MAX_PATH (qui est une constante marquant la taille maximale d'un nom de fichier), ainsi qu'une structure OPENFILENAME qui nous servira pour la boîte de dialogue 'Parcourir'.
LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam) { int Select; char buf[MAX_PATH]; OPENFILENAME DlgInfs;
switch(message) { case WM_COMMAND: Select=LOWORD(wParam); switch(Select) { case IDC_PARCOURIR:
La fonction qui affiche la boîte de dialogue 'Parcourir' est GetOpenfileName(). De manière à personnaliser cette boîte de dialogue à nos besoins, nous passons une structure contenant les caractéristiques de la boîte de dialogue. Comme nous n'utiliserons pas une grande partie des membres de cette structure, nous allons tous les mettre à 0 grâce à la fonction memset() du C standard. Ceci constitue une bonne habitude à prendre. Pour plus d'informations sur les paramètres et les possibilités de cette fonction référez vous à l'aide de fournie par Microsoft.
memset(&DlgInfs,0,sizeof(OPENFILENAME));
DlgInfs.lStructSize=sizeof(OPENFILENAME); DlgInfs.hwndOwner=Dlg; DlgInfs.hInstance=hInst; DlgInfs.lpstrFilter="Fichiers WAV *.WAV "; DlgInfs.lpstrFile=buf; DlgInfs.nMaxFile=MAX_PATH; DlgInfs.lpstrTitle="Choisissez le fichier à lire."; DlgInfs.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; if(GetOpenFileName(&DlgInfs)) SetDlgItemText(Dlg,IDC_NOMDEFICHIER,buf); return TRUE;
Lorsque l'utilisateur pressera le bouton 'Lire', il faudra récupérer le nom de fichier saisi dans le champ 'IDC_NOMDEFICHIER' et le lire grâce à la fonction sndPlaySound().
case IDC_LIRE: GetDlgItemText(Dlg,IDC_NOMDEFICHIER,buf,MAX_PATH);
sndPlaySound(buf,SND_ASYNC); return TRUE;
Il ne reste plus qu'à gérer la sortie de la boîte de dialogue. Dans le cas ou l'utilisateur quitte le programme, il faut stopper la lecture du son en cours. Pour cela on utilisera encore la fonction sndPlaySound() avant de quitter.
case IDCANCEL: sndPlaySound(NULL,NULL); EndDialog(Dlg,0); return TRUE; } default: return FALSE; } }
Ce programme ne présente aucune difficulté particulière. Il se suffit à lui même bien qu'étant particulièrement pauvre. Ceci permet de donner une idée de la gestion des boîtes de dialogues qui seront dans le futur intégrées à un programme bien plus important. Bien que la gestion de telles boîtes de dialogue constitue un détail dans un programme plus important, il est nécessaire de bien comprendre leur fonctionnement de manière à ne pas perdre de temps et pouvoir créer rapidement une interface graphique agréable.
|