Création de fenêtres en fixant la taille de la zone cliente

 

 

Jusqu'à maintenant, vous avez créé des fenêtres en indiquant la taille de celle-ci. La taille de la zone client était alors déduite par le système.

Maintenant, vous allez vous créer une fenêtre dont la taille vous intéresse peu, mais où la taille de la zone cliente est importante.

 

Problème, il n'y a rien lors de la création de la fenêtre qui permet cela...Enfin, il y a bien une solution:

Vous savez déjà que pour récupérer la taille de la zone client, vous utilisez une structure RECT.

Et bien utilisez le pour indiquer la taille que vous voulez obtenir !

RECT WindowRect;

// Déclaration de la taille que notre zone cliente devra faire !
WindowRect.left=(long)0;
WindowRect.right=(long)width;
WindowRect.top=(long)0;
WindowRect.bottom=(long)height;

Le principe, créer une fenêtre via CreateWindowEx(). Mais avant de créer cette fenêtre, il faut déterminer la taille de celle-ci sachant que seule la taille de la zone client est connue.

Heureusement, il existe une fonction qui va nous permettre cela:AdjustWindowRectEx()

Cette fonction va calculer la taille d'une fenêtre par rapport à la taille souhaitée d'une zone cliente et des styles et styles étendus de la fenêtre.

BOOL AdjustWindowRectEx(
LPRECT lpRect,
DWORD dwStyle,
BOOL bMenu,
DWORD dwExStyle
);

En entrée:

lpRect Coordonnées de la zone cliente que l'on désire avoir.

dwStyle Style de la fenêtre. Nécessaire pour en déduire la taille de la fenêtre.

bMenu Booléen qui indique qu'il y a un menu dans la fenêtre

dwExStyle Style étendu de la fenêtre. Nécessaire pour en déduire la taille de la fenêtre.

En sortie:

lpRect contiendra les coordonnées de la taille de la fenêtre.

La fonction retourne 0 si problème.

Le reste est alors classique:

wndclassex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wndclassex.lpfnWndProc = (WNDPROC) WndProcOpenGL;
wndclassex.cbClsExtra = 0;
wndclassex.cbWndExtra = 0;
wndclassex.hInstance = hInstance;
wndclassex.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wndclassex.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclassex.hbrBackground = NULL;
wndclassex.lpszMenuName = NULL;
wndclassex.lpszClassName = "OpenGL";

if (!RegisterClass(&wndclassex)) // Enregistrons notre classe !
{
return FALSE;
}

// Création d'une instance de fenêtre
if (!(hWnd=CreateWindowEx( dwExStyle,
"MaFenêtre", // Nom de la classe
title, // Titre
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | dwStyle,
0, 0, // position en x, y
WindowRect.right-WindowRect.left, // largeur
WindowRect.bottom-WindowRect.top, // hauteur
NULL, // Pas de parent
NULL, // Pas de menu
hInstance, // Instance
NULL)))
{
...