Remarque sur les fonctions Windows

 

Vous constaterez rapidement que la manière de passer des paramètres entre les différentes fonctions de Windows n'est pas forcément la même...

 

Par exemple :

HWND CreateWindow(

LPCTSTR lpClassName, // nom de la classe de fenêtre

LPCTSTR lpWindowName, // titre de votre fenêtre

DWORD dwStyle, // style de la fenêtre

int x, // position horizontal de la fenêtre

int y, // position vertical de la fenêtre

int nWidth, // largeur de la fenêtre

int nHeight, // hauteur de la fenêtre

HWND hWndParent, // handle de la fenêtre parent

HMENU hMenu, // handle de menu

HANDLE hInstance, // handle de l’instance de l’application

LPVOID lpParam // Pointe sur une valeur passée à la fenêtre à travers une structure CREATESTRUCT.

);

Cette fonction permet de créer une fenêtre. Peu importe de savoir comment cela marche pour le moment, mais à priori, c'est un passage de paramètres classique.

Cette fonction date du début de Windows. En ce temps là, les paramètres indiqués étaient suffisants.

Seulement voilà, Windows, ça ne date pas d'hier, et il a évolué depuis. Ainsi, il existe de nouvelles possibilités pour les fenêtres qui n'étaient pas prévues (et peut-être pas prévisible) au tout début du développement de Windows.

Il fallait donc modifier le passage de paramètres pour créer une fenêtre. D'où le problème: comment rester compatible entre les différentes versions de Windows ? En effet, un vieux programme ne doit pas (ou ne peut plus) être modifié à chaque nouvelle version de Windows.

Eh bien, tout comme sous DOS, il ne faut donc pas toucher aux fonctions d'origines. Pour revenir à la fonction CreateWindow(), il a donc fallu en créer une nouvelle. Chez Microsoft, ils ont décidé de créer une nouvelle fonction portant le même nom que la fonction d'origine mais terminée par Ex (pour Extended ?) à la fin. Ce qui donne CreateWindowEx.

Les paramètres étant le suivant:


HWND CreateWindowEx(

DWORD dwExStyle, // style étendue de la fenêtre

LPCTSTR lpClassName, // nom de la classe de fenêtre

LPCTSTR lpWindowName, // titre de votre fenêtre

DWORD dwStyle, // style de la fenêtre

int x, // position horizontal de la fenêtre

int y, // position vertical de la fenêtre

int nWidth, // largeur de la fenêtre

int nHeight, // hauteur de la fenêtre

HWND hWndParent, // handle de la fenêtre mère

HMENU hMenu, // handle de menu

HINSTANCE hInstance, // handle de l’instance de l’application

LPVOID lpParam // Pointe sur une valeur passée à la fenêtre à travers une structure CREATESTRUCT.

);

Il faut espérer qu'il n'y aura pas d'autres changements...

 

Pour les fonctions un peu plus récentes, le passage de paramètres se fait via une structure.

Par exemple dans DirectX pour DirectDraw:

HRESULT CreateSurface(
LPDDSURFACEDESC2 lpDDSurfaceDesc2,
LPDIRECTDRAWSURFACE7 FAR *lplpDDSurface,
IUnknown FAR *pUnkOuter
);

Avec dans la structure:

ddsd.dwSize = sizeof( DDSURFACEDESC2 );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; //on veut un backbuffer avec la surface primaire
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX| DDSCAPS_VIDEOMEMORY ;
ddsd.....

Il y a un champ qui va être intéressant immédiatement : dwSize que l'on doit obligatoirement alimenter avec un sizeof (nom de la structure) que se soit pour récupérer des informations ou pour en envoyer.

L'intérêt ? Et bien, si de nouveaux paramètres doivent être passés, il suffit de se créer une nouvelle structure contenant l'ancienne structure avec les nouveaux champs. Pour utiliser les nouvelles fonctionnalités, il suffira d'appeler la même fonction, mais en passant en paramètre la nouvelle structure. Par contre, pour rester compatible avec les anciennes versions de Windows, on peut toujours passer l'ancienne structure.

Il reste ensuite à renseigner dwSize avec la taille de la nouvelle structure ou de l'ancienne structure suivant la structure que vous voulez utiliser. La fonction pourra ainsi reconnaître la structure utilisée et donc les paramètres passés.