Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS C FAQs C TUTORIELS C LIVRES C COMPILATEURS C SOURCES GTK+

Tutorial d'initiation
A la programmation avec l'API Windows

Tutorial d'initiation a la programmation Windows avec Microsoft Visual C++
PrécédentIndexSuivant

Chapitre 1

Les bases d'un programme Windows

1. Création d'une boîte de dialogue

Cours théorique :

Bien comprendre le principe de fonctionnement d'une application Windows est essentiel avant de commencer à programmer. Je vais ici exposer le principe global de fonctionnement d'une application créant une fenêtre.

Tout d'abord, il convient de bien garder à l'esprit qu'un programme fonctionnant sous Windows et gérant une fenêtre doit rester en dialogue permanent avec Windows. Le programme ne connait (a priori) rien sur son environnement. C'est Windows qui signale à l'application si elle doit redessiner le contenu d'une de ses fenêtres, ou encore si l'utilisateur essaie de fermer la fenêtre.

Cette communication se fait au travers de messages que Windows envoie à chaque fenêtre concernée. C'est au programme d'effectuer la réception de ces messages et de les transmettre aux fonctions gérant les différentes fenêtres. La réception de ces messages ne doit donc pas prendre de retard, et le traitement de chacun des messages doit être bref. En cas de retard, le redessinement des fenêtres n'est donc plus assuré, ce qui a pour conséquence des fenêtres blanches, indéplaçables, similaires à celles des programmes "plantés".

Chaque fenêtre est associée à une fonction ou procédure de fenêtre (Window Proc). Parfois plusieurs fenêtres peuvent être associées à une même procédure. Chaque message reçu est transmis à la procédure correspondante qui se chargera de traiter ce message (redessiner la fenêtre, la redimensionner, afficher un caractère entré par l'utilisateur...).

Une partie du travail de rafraichissement de la fenêtre est pris en charge par Windows. Le programme n'a à redessiner que la zone client de sa fenêtre (et non pas la barre de titre, les menus éventuels...).

Projet N°1 :

- Objectif : créer une boîte de dialogue et une procédure très simple chargée de la gérer.

- Réalisation : la boîte de dialogue sera créée grâce à l'éditeur de ressources de VC++. Le programme sera chargé de la réception des messages et du traitement des plus simples.

Télécharger le projet ici.

- Le projet pas à pas :

Tout d'abord, il s'agit de créer le projet dans VC++ : File/New/Projects/Win32 Application. Donnez ensuite un nom à votre projet et cliquez 'Ok'. Ensuite, sélectionnez 'An empty project' puis 'Finish' et 'Ok'. Nous venons de créer un projet vide, il ne contient aucun fichier de code.

Ajoutons maintenant un fichier de code et fichier de ressources. Allez dans File/New/Files/C++ Source File. Appelez ce fichier main.cpp et validez. Refaites la même opération mais avec un fichier de type Ressource Script nommé res. Fermez le fichier qui s'est ouvert dans l'éditeur. Le script de ressources est associé à un fichier d'en-tête créé et mis à jour automatiquement, mais qu'il convient d'ajouter. Dans le feuillet FileView du panneau de gauche, faites un clic droit sur Header Files et sélectionnez Add Files to Folder. Ajoutez le fichier 'ressource.h' qui doit être dans le même répertoire que votre projet.

Créons à présent le modèle de notre boîte de dialogue. Allez dans le feuillet RessourceView du panneau de travail (à gauche). Faites un clic droit sur res ressources et sélectionnez Insert/Dialog/New. Nous ne modifirons pas cette boîte de dialogue.

Occupons-nous maintenant du code qui va constituer le programme. Tout d'abord, les fichiers d'en-tête, deux sont nécessaires, Windows.h et ressource.h que nous avons inclus précédemment.

Le point d'entrée du programme est la fonction WinMain(). Elle est exécutée automatiquement par Windows lorsque le programme est démarré. Mais avant cette fonction, nous aurons la définition de la procédure de notre fenêtre principale, MainPoc().

#include <Windows.h>
#include "ressource.h"


LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

Nous allons maintenant créer la boîte de dialogue grâce à la fonction CreateDialog(). Le paramètre HINSTANCE est un identifiant de notre application, on passe l'identifiant fourni par Windows en paramètre de la fonction WinMain(). On donne ensuite l'identifiant ressource de notre boîte de dialogue. Elle n'a pas de fenêtre parent et la procédure est la fonction MainProc(). La fonction retourne une variable de type HWND qui identifie notre fenêtre. Puis, on affiche cette fenêtre. Toute fenêtre créée est invisible par défaut.

   HWND hDlg;
   hDlg=CreateDialog(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,(DLGPROC)MainProc);
   ShowWindow(hDlg,SW_SHOW);

Occupons-nous maintenant de la réception des messages. La réception des messages est prise en charge par la fonction GetMessage(). Cette fonction retourne FALSE dès que le message WM_QUIT est reçu, ce qui indique que l'application doit être fermée.

   MSG msg;
   while(GetMessage(&msg,NULL,0,0)==TRUE)
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   return 0;
}

Il ne reste plus qu'à définir le comportement de notre fenêtre dans quelques cas simples: elle doit être fermée et l'application quittée si l'utilisateur presse 'ok' ou essaie de quitter. La fermeture de la fenêtre ne signifie pas forcément l'arrêt de l'application. Ces deux comportements correspondent à deux messages distincs: WM_QUIT indiquie que l'application doit se terminer, WM_CLOSE indique la fermeture de la fenêtre. Mais dans ce cas, on a une fenêtre un peu particulière, puisqu'il s'agit d'une boîte de dialogue. Sa procédure est définie de la même manière que celle d'une fenêtre.

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)
{
   int Select;
   switch(message)
   {
   case WM_COMMAND:
      Select=LOWORD(wParam);
      switch(Select)
      {
      case IDOK:
         EndDialog(Dlg,0);
         PostQuitMessage(0);
         return TRUE;
      case IDCANCEL:
         EndDialog(Dlg,Select);
         PostQuitMessage(0);
         return TRUE;
      }
   default:
      return FALSE;
   }
}

Cette procédure est très simple, elle ne réagit qu'à la pression des boutons 'Ok' et 'Cancel' (le bouton ou la "croix"). En réponse à l'un ou l'autre de ces événements, la procédure demande la fermeture de la boîte de dialogue et termine l'application en envoyant un message WM_QUIT grâce à la fonction PostQuitMessage().


PrécédentIndexSuivant

Responsable bénévole de la rubrique C : Arnaud Feltz (buchs) - Contacter par EMail :
Vos questions techniques : forum d'entraide C - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.