Il arrive parfois que l'on veuille rendre une fenêtre dimensionnable MAIS selon certaines contraintes. Par exemple en respectant un certain ratio.
Et la c'est le drame car .Net ne fournit pas ce genre de services. Je vous propose donc de voir le code nécessaire pour réaliser ce genre de comportement.
Bon je vous cache pas que ca passera par un peu d'interop car nous devrons récupérer des messages Windows que .Net ne nous remonte pas.
En effet Windows envoie un message WM_SIZING avec pleins d'informations telles que la nouvelle taille ou encore la zone de redimensionnement (gauche, droite, etc.). Nous allons donc pouvoir jouer la dessus et faire notre petite sauce:
struct Rect
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
float aspectRatio = 4.0f / 3.0f;
enum SizeZone
{
Left = 1,
Right = 2,
Top = 3,
TopLeft = 4,
TopRight = 5,
Bottom = 6,
BottomLeft = 7,
BottomRight = 8
}
protected override void WndProc(ref Message m)
{
const int WM_SIZING = 0x214;
if (m.Msg == WM_SIZING && m.HWnd.Equals(Handle))
{
Rect rect = (Rect)Marshal.PtrToStructure(m.LParam, typeof(Rect));
int width = rect.Right - rect.Left;
int height = rect.Bottom - rect.Top;
SizeZone zone = (SizeZone)m.WParam.ToInt32();
switch (zone)
{
case SizeZone.Right:
rect.Bottom = rect.Top + (int)(width / aspectRatio);
break;
case SizeZone.Bottom:
rect.Right = rect.Left + (int)(height * aspectRatio);
break;
case SizeZone.BottomRight:
rect.Right = rect.Left + (int)(height * aspectRatio);
break;
default:
break;
}
Marshal.StructureToPtr(rect, m.LParam, true);
}
base.WndProc(ref m);
}