Texel
Win32 | Index | Contact

Les bases de la programmation Windows

Chapitre I
Premier programme



Tous les programmes Windows doivent inclure le fichier d'en-tête windows.h (qui contient lui-même d'autres fichiers d'en-tête) pour permettre l'utilisation des divers fonctions spécifiques à Windows.



I . La fonction WinMain

Avec l'API WIN32, la fonction main est remplacée par WinMain :

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow);



WINAPI est une convention d'appel qui permet d'appeler des fonctions de l'API WIN32.

Le paramètre hInstance est un handle d'instance. Un handle d'instance est un nombre qui identifie notre application. Mais il existe aussi des handles de fenêtres qui identifient des fenêtres. En effet, Windows est un OS multitâche et il doit pouvoir reconnaître les programmes par des numéros pour partager la mémoire. Vous n'avez pas à choisir ce numéro, c'est Windows qui le fait.

Le paramètre hPrevInstance était utiliser dans les versions 16 bits de Windows pour partager et économiser les ressources d'un programme exécuté plusieurs fois. Il est resté mais est définit à 0 par l'OS.

Le paramètre lpCmdLine est la ligne de commande de l'exécutable.

Le dernier paramètre iCmdShow donne les caractéristiques de l'affichage de l'application à son lancement. Par exemple : taille et emplacement d'une fenêtre. Il sera définit par la fonction ShowWindow dans WinMain.




II. Des nouveaux types de données ?

Le types de donnée PSTR du paramètre lpCmdLine de la fonction WinMain vous semble sûrement inconnu. En réalité, il s'agit tout simplement d'un pointeur sur une chaîne de caractères (char*) qui a été renommé dans un fichier d'en-tête par un typedef ou un #define. Vous retrouverez bien d'autres "nouveaux types " de ce genre : LPSTR (long char*), UINT (unsigned int), LRESULT (long). Comme vous le voyez, leur signification est souvent facile à comprendre.




III. La notation hongroise

Si vous avez l'occasion de lire des codes sources d'applications Windows, vous remarquerez que de nombreuses variables, qui ont la même utilités dans des programmes différents, portent le même nom alors que les auteurs de ces programmes sont différents. On pourrait alors se demander si ces variables doivent avoir obligatoirement un nom précis pour fonctionner. Et bien non. Il s'agit tout simplement d'une convention appelée "notation hongroise ". Elle sert d'une part de pense bête lors de la programmation d'une application, et elle permet d'autre part de faciliter la reprise d'un code source par d'autres programmeurs.

Les premières lettres des variables (en lettres minuscules) indiquent le type de la variable. Le reste est une abréviation de son utilité. Exemple : szCmdLine avec "sz " pour "string terminate by zero " et "CmdLine " pour "ligne de commande ".

Voici les notations les plus courantes :


b BOOL (int) i int
by BYTE (caractère non signé) l LONG
c char n short
cx, cy (longueur en x ou y) p pointeur
dw DWORD (long non signé) s chaîne de caractère string
f flag (drapeau) sz chaîne terminée par un zéro
fn fonction x, y int (coordonnées x ou y)
h handle w WORD (mot non signé)
















IV. Les boîtes de messages

La fonction printf ne fonctionne pas avec l'API Win32 (on est plus on mode console). On peut utiliser MessageBox dans la plupart des cas pour afficher des messages courts. Cette fonction affiche simplement une chêne de caractère dans une boîte de message qui n'est qu'une petite fenêtre accompagnée d'un ou plusieurs boutons (ex : Ok et Cancel). Cette fonction est très souvent utilisée pour donner des avertissements à l'utilisateur (Fin d'une tâche ou erreur).


int WINAPI MessageBox( HWND, LPCTSTR, LPCTSTR, UINT );



Le premier argument est un handle de fenêtre. Elle indique à quelle fenêtre se rapporte la boîte de message. Dans notre premier programme, cet argument sera égal à NULL car notre application ne possède pas de fenêtre.

Le deuxième argument est la chaîne de caractère à afficher.

Le troisième argument est une chaîne de caractère affiché dans la barre de titre de la boîte de message.

Le dernier argument est une constante ou une combinaison de constante. Celle-ci indique quels boutons et quel icône sont à afficher dans la boîte. Lorsque vous utiliser plusieurs constantes, vous devez les séparer par " | ". Ces constantes commencent par le préfixe MB_ et représentent des nombres. Ex : MB_OK remplace 0x00000000L par un #define et affiche le bouton Ok. Donc une boîte de message comporte toujours au moins un bouton.

Vous trouverez ces constantes dans les fichiers d'aide de votre compilateur. Voici les plus courants :


MB_OKCANCEL Boutons Ok et Cancel
MB_YESNO Boutons Yes et No
MB_DEFBUTTONn Sélectionne le nième bouton par défaut
MB_ICONQUESTION Affiche l'icône point d'interrogation
MB_ICONEXCLAMATION Affiche l'icône exclamation









MessageBox retourne une valeur qui permet d'identifier le bouton pressé par l'utilisateur. Et comme précédemment, vous pouvez la comparer à des constantes prés définis comme IDOK pour le bouton Ok, IDCANCEL pour le bouton Cancel etc…



V. Premier programme

Les chaînes de caractères passées en argument à MessageBox ne peuvent pas afficher des variables comme le fait printf. Notre premier programme va résoudre le problème en utilisant sprintf pour stoker la chaîne de caractère voulu dans un tableau passé en argument à MessageBox.

#include<windows.h>
#include<stdio.h> // pour sprintf
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
char tab[20] ;int i=5 ;
sprintf(tab, "i égal %d",i);
MessageBox(NULL,tab,"barre de titre",MB_OK| MB_ICONEXCLAMATION);
return 0;
}











Vous pouvez télécharger le code source ici. En parcourant certaines documentations, vous risquez rapidement de tomber sur le terme UNICODE. Ce mot désigne une extension du jeu de caractère ASCII qui code les caractères sur 16 bits. Il permet ainsi l'utilisation de nouveau caractère comme l'alphabet chinois par exemple. Dans ce tutorial, nous n'en parlerons pas pour simplifier les choses. Sachez tout de même que certaine des fonctions présentées ici ont souvent des fonctions synonymes pour manipuler des chaînes de caractères en UNICODE. Windows 9x ne gère que partiellement UNICODE (donc à éviter). Windows NT (et aussi 2K et XP) fonctionne en UNICODE et transforme les fonctions ASCII en leurs équivalents UNICODE lors de l'exécution des programmes (d'où l'intérêt de programmer en UNICODE sous NT pour accélérer l'exécution).


Version originale: Fevrier 2001
Dernière mise à jour: Juin 2002
Par Grégory Smialek
www.texel.fr.fm