# Programmation Windows/Les bases de l'API Win32
### Section 1 : les bases de Windows

* Architecture du système Windows
* Mode utilisateur contre mode noyau
* Les bases de l'API Win32
* <Windows.h>
* Handles and Data Types
* Unicode
* Dynamic Link Libraries (DLL)
* Programming Windows With OSS Tools
* Resource Scripts

### Section 2 : API Win32 et contrôles d'interface utilisateur

* Message Loop Architecture
* Interfacing (Mouse, keyboard, and timer messages)
* Window Creation
* User Interface Controls
* GDI and Drawing
* Dialog Boxes
* Input-Output
* File Management
* Memory Subsystem (heaps, virtual memory)
* Multitasking
* Interprocess Communication
* MDI Programs
* Registry API
* Security API
* Winsock

### Section 3 : Microsoft Foundation Classes (MFC)

* Microsoft Foundation Classes (MFC)
** Classes Hierarchy

### Section 4 : Dynamic Data Exchange (DDE), ActiveX et COM

* Dynamic Data Exchange (DDE)
* COM and ActiveX
* COM Programming
* DCOM and COM+
* Multi-language programming examples
* OLE Programming

### Section 5 : programmation des pilotes de périphériques

* Device Driver Introduction
* The DDK
* Driver Structure
* Driver API
* Terminate and Stay Resident (TSR)
* Virtual Device Drivers (VXD)
* Windows Driver Model (WDM)
* Vista Driver Migration

### Section 6 : programmation shell

* Programming Shell Extensions
* Extending IE
* Programming Screen-savers
* Programming Services
* Programming CMD aka Windows Batch Programming
** Sample FTP script
* Control Panel Applets
* Windows Script Host
* ASP
** JScript
** VBScript
** PerlScript
* Compiled HTML Help and Help API

### Annexes

* Resource Script Reference
* Obtaining the SDK
* Obtaining the DDK
* Obtaining MASM
* Obtaining the HTML Help Workshop
* Key Combinations
* 64-bit Windows Migration
* Windows Vista Migration
* Lists of Available APIs and related libraries

### Section 1 : les bases de Windows

* Architecture du système Windows
* Mode utilisateur contre mode noyau
* Les bases de l'API Win32
* <Windows.h>
* Handles and Data Types
* Unicode
* Dynamic Link Libraries (DLL)
* Programming Windows With OSS Tools
* Resource Scripts

### Section 2 : API Win32 et contrôles d'interface utilisateur

* Message Loop Architecture
* Interfacing (Mouse, keyboard, and timer messages)
* Window Creation
* User Interface Controls
* GDI and Drawing
* Dialog Boxes
* Input-Output
* File Management
* Memory Subsystem (heaps, virtual memory)
* Multitasking
* Interprocess Communication
* MDI Programs
* Registry API
* Security API
* Winsock

### Section 3 : Microsoft Foundation Classes (MFC)

* Microsoft Foundation Classes (MFC)
** Classes Hierarchy

### Section 4 : Dynamic Data Exchange (DDE), ActiveX et COM

* Dynamic Data Exchange (DDE)
* COM and ActiveX
* COM Programming
* DCOM and COM+
* Multi-language programming examples
* OLE Programming

### Section 5 : programmation des pilotes de périphériques

* Device Driver Introduction
* The DDK
* Driver Structure
* Driver API
* Terminate and Stay Resident (TSR)
* Virtual Device Drivers (VXD)
* Windows Driver Model (WDM)
* Vista Driver Migration

### Section 6 : programmation shell

* Programming Shell Extensions
* Extending IE
* Programming Screen-savers
* Programming Services
* Programming CMD aka Windows Batch Programming
** Sample FTP script
* Control Panel Applets
* Windows Script Host
* ASP
** JScript
** VBScript
** PerlScript
* Compiled HTML Help and Help API

### Annexes

* Resource Script Reference
* Obtaining the SDK
* Obtaining the DDK
* Obtaining MASM
* Obtaining the HTML Help Workshop
* Key Combinations
* 64-bit Windows Migration
* Windows Vista Migration
* Lists of Available APIs and related libraries
[ Modifier le sommaire ]
Ce premier chapitre va vous apprendre les bases de l'API Win32.

## Code de base

Une API, ou Application Programming Interface est, comme son nom l'indique, une interface de programmation : elle contient un ensemble de fonctions bas niveau, ici extrêmement bien documentée (comme vous pouvez le constater), permettant de programmer des applications haut niveau. Elles sont alors accessibles à partir de bibliothèques intégrées au projet.
La Bibliothèque est installée par défaut sur la Quasi-totalité des IDE. Pour pouvoir utiliser le WinAPI, vous devez évidemment sélectionner un projet WinAPI dans votre IDE pendant la création du nouveau projet. Par exemple, sous code::blocks, vous devez sélectionner « Win32 GUI Application ».
Comme vous pouvez vous en douter, vous devrez inclure la bibliothèque appropriée pour utiliser cette API, à savoir :
Comme chacun sait, une seule fonction est commune à tous les programmes : le main. Le point d'entrée du programme est, dans cette API, un peu plus compliqué que dans un projet console ou SDL. Ainsi, le code minimal que vous pouvez faire en WinAPI est le suivant :
Étudions ensemble cette fonction. Vous connaissez forcément le type de retour de cette fonction : il s'agit d'un int. Passons maintenant aux arguments
Le premier argument est l'instance actuelle de votre programme. C'est en quelque sorte une "boîte" représentant votre programme, et imbriquant tout ce qu'il contient (pour ne pas vous encombrer la tête) :
Le deuxième argument désigne l'instance précédente. En fait, ce paramètre date de Windows 16 bits. Il vaut donc toujours NULL :
Conséquence : vous n'êtes même pas obligés d'indiquer un nom de variable, bien que le type soit quand même nécessaire.
Le troisième argument remplace justement argv que vous connaissez déjà dans le prototype du main console ou autre... Cependant, il est dans sa forme brute ; vous ne pourrez donc pas l'utiliser de suite (je vous expliquerai plus tard comment la découper et l'utiliser) :
Il est d'un type que vous ne connaissez pas, puisqu'il s'agit d'une structure signée Microsoft. Celle-ci correspond à un bête char.
Le petit dernier ne vous servira probablement pas souvent : il s'agit du mode d'affichage (visible, invisible, minimisé etc...) de la fenêtre principale :
Même remarque que pour le paramètre contenant l'instance précédente.
Pour ceux qui écoutent les conseils du rédacteur -à savoir moi ;) -, vous devriez au préalable savoir à quoi correspondent les types principaux utilisés par cette API :
* LPSTR correspondant à un char *, et ses déclinaisons :
* LPCSTR correspondant à un const char *.
* LPTSTR correspondant à un TCHAR * (voir TCHAR plus bas).
On l'initialise avec la macro TEXT, selon :
* LPWSTR correspondant à un wchar_t *
On l'initialise avec le préfixe ' L', selon :
Vous pouvez combiner les lettres définissant un caractère particulier de LPSTR pour obtenir des types adaptés (comme LPCTSTR).
* WORD correspondant à un unsigned short
* DWORD correspondant à un unsigned long
* TCHAR correspondant à :
En compilant en Unicode: un wchar_t Sinon : un char
Et voilà pour une présentation restreinte.
Vous savez maintenant ne rien afficher sans erreur de compilation ! Génial, non ? Vous en voulez plus ? D'accord, direction "Votre première fenêtre" .
Pour ceux qui veulent absolument un "Hello World" avant de commencer ,voici la formule magique à rajouter dans le WinMain :

## Votre première fenêtre

Vous êtes impatient de créer votre première fenêtre ? Tant mieux, c'est ici que ça se passe.

### Le Code de base

Premièrement, munissez-vous du code minimal que je vous ai donné tout à l'heure :
Dans certains cas, vous serez contraints de rajouter les mots clés WINAPI ou APIENTRY entre 'int' et 'WinMain', à cause d'une erreur de compilation de type "WinMain already defined in...".

### Les variables nécessaires

Nous aurons besoin pour afficher la fenêtre de plusieurs variables :
Étudions d'abord leur type respectif et leurs rôles :
* fenetrePrincipale est de type HWND, qui veut dire handle de fenêtre. Si vous connaissez un minimum l'anglais, vous remarquerez que l'on pourrait le traduire par poignée.
* message, quant à lui, est comme son nom l'indique un message système, utilisé pour communiquer entre l'utilisateur et les fenêtres : il s'agit en fait du descriptif d'un événement. Si vous connaissez la SDL, vous pourriez faire la correspondance avec 'SDL_event'.
* classeFenetre est la classe de fenêtre nécessaire à la construction de la fenêtre principale. C'est en fait une liste d'informations permettant par la suite de créer la fenêtre selon notre bon vouloir. (Je précise que la "classe" n'a pas ici la même définition que pour le C++.)

## Références

* ↑ En 2013, Unicode est le standard le plus aboutit pour gérer la plupart des systèmes d'écritures du monde entier. À ce sujet lire par exemple le wikibooks À la découverte d'Unicode