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 linstance de lapplication
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 linstance de lapplication
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.