Delen via


Supprimer la bordure 3D d'une fenêtre MDI parent

Bonjour,

Lorsque vous créez une application Windows Forms MDI, il se peut que vous ayez envie d'avoir la fenêtre parent qui n'ait pas de bordure du tout (on a le droit, hein...).

Pour cela, vous positionnez alors la propriété IsMdiContainer à True pour indiquer que la fenêtre est le conteneur des fenêtres MDI, mais aussi la propriété FormBorderStyle à None afin de supprimer toute bordure sur cette fenêtre.

Vous compilez et exécutez votre application, mais vous constatez qu'une bordure de type 3D persiste :

Cette bordure qui persiste représente en fait la zone conteneur de la fenêtre MDI.

But du jeu : la supprimer.

La bordure en question n’est pas sur la Form MDI Parent elle-même, mais sur un contrôle de type MDIClient de cette Form (ce contrôle est positionné automatiquement dès que vous spécifiez IsMdiContainer="True" .

 Le code suivant montre comment retrouver ce contrôle MDIClient et supprimer sa bordure, à l'aide d'APIs Win32:

MdiClient

mdiClient = null;
// Parcourt des contrôles de la Form
for (int i = 0; i < this.Controls.Count; i++)
{

// Si le Form est un MDI Container, il contient un client MDIClient
mdiClient = this.Controls[i] as MdiClient;
if (mdiClient != null)
{

break;

}

}

// Si le contrôle MDIClient est trouvé
if (mdiClient != null)
{

int iStyle = Win32.GetWindowLong(mdiClient.Handle, Win32.GWL_EXSTYLE);
//Suppression du style WS_EX_CLIENTEDGE des styles étendus du contrôle courant
iStyle &= ~Win32.WS_EX_CLIENTEDGE;
//Application du nouveau style
iStyle = Win32.SetWindowLong(mdiClient.Handle, Win32.GWL_EXSTYLE, iStyle);

}

Où Win32 est une classe statique reprenant certains appels aux APIs système et certaines constantes Win32.
Par exemple :

static

public class Win32
{

[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr window, int index);

[DllImport("user32.dll")]
public static extern int SetWindowLong(IntPtr window, int index, int value);

public const int GWL_EXSTYLE = -20;
public const int WS_EX_CLIENTEDGE = 0x00000200;

}

Le résultat obtenu est le suivant :

La bordure a bien disparu !

A bientôt,
Aurélien

Comments