Cascade et mosaïque de fenetres filles dans une application mdi

Soyez le premier à donner votre avis sur cette source.

Vue 17 615 fois - Téléchargée 735 fois

Description

Petit bout de code tout simple permettant de mettre en cascade, mosaïque horizontale, et verticale des fenêtres 'filles' appartenant à une forme MDI.

J'ai cherché dans les sources et forums, et je n'ai rien trouvé, ou alors j'ai mal cherché :-? :S
C'est pourtant utile dans certaines applications MDI.

Une zip contenant toute l'application

Source / Exemple :


//Ouverture d'une nouvelle fenetre fille
private void menuNewForm_Click(object sender, System.EventArgs e)
{
	//Instanciation d'une fenetre fille
	Form2 frm = new Form2();
	//La forme appartient à la forme principale
	frm.MdiParent = this;
	frm.Top = 0;
	frm.Left = 0;
	//Affiche la fenetre Form2
	frm.Show();
}

//Mise en cascade des fenetres filles
private void menuFCascade_Click(object sender, System.EventArgs e)
{
	int nbr = 0;
	//Pour chaque fenetre fille
	foreach (Form frm in MdiChildren)
	{	
		//on remet leur état en normal (si elles sont maximisées ou minimisées)
		frm.WindowState = FormWindowState.Normal;
		//Si une fenetre fille appartient a la classe Form2
		if (frm is Form2)
		{
			//Redimensionnement et ancrage
			frm.Top = 35 * nbr;
			frm.Left = 20 * nbr;
			frm.Width = 300;
			frm.Height = 300;
		}
		nbr++;
	}
}

//Mosaïque horizontale des fenetres filles
private void menuFMHor_Click(object sender, System.EventArgs e)
{
	int nbr = 0;
	//On compte le nbr de fenetre fille appartenant à la classe Form2
	foreach (Form frm in MdiChildren)
		if (frm is Form2)
			nbr++;
	//Si il n'y pas de fenetre fille appartenant à la classe Form2 on quitte
	if (nbr <= 0)
		return;
	//On divise la hauteur de la fenetre principale - 60 pixels (barre de titre + barre menu)
	int taille = (this.Height - 60) / nbr;
	nbr = 0;
	//Pour chaque fenetre fille appartenant à la classe Form2
	foreach (Form frm in MdiChildren)
		if (frm is Form2)
		{
			//On positionne la fenetre
			frm.Top = taille * nbr;
			frm.Left = 0;
			//Et redimenssionne
			frm.Width = this.Width - 40;
			frm.Height = taille;
			nbr++;
		}
}

//Mosaïque verticale des fenetres filles
private void menuFMVer_Click(object sender, System.EventArgs e)
{
	int nbr = 0;
	//On compte le nbr de fenetre fille appartenant à la classe Form2
	foreach (Form frm in MdiChildren)
		if (frm is Form2)
			nbr++;
	//Si il n'y pas de fenetre fille appartenant à la classe Form2 on quitte
	if (nbr <= 0)
		return;
	//On divise la largeur de la fenetre principale - 20 pixels (bords)
	int taille = (this.Width - 20) / nbr;
	nbr = 0;
	//Pour chaque fenetre fille appartenant à la classe Form2
	foreach (Form frm in MdiChildren)
		if (frm is Form2)
		{
			//On positionne la fenetre
			frm.Top = 0;
			frm.Left = taille * nbr;
			//Et redimenssionne
			frm.Width = taille;
			frm.Height = this.Height - 60;
			nbr++;
		}
}

Conclusion :


J'ai pas réussi à faire planté mon application, mais peut être que vous... ^^ :p

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
8
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
11 mai 2010

Rappel (pour le parent) :
- la propriété IsMdiContainer de la fenêtre principale/parent (le this ici) doit avoir la valeur true !
- la propriété IsMdiChild indique si le formulaire est un formulaire enfant MDI.
- la propriété MdiChildren retourne un tableau d'objets Form, dont chaque objet identifie l'un des formulaires enfants MDI de ce formulaire. Il est rempli par l'appel MdiParent sur l'enfant ; ainsi les 2 se 'connaissent'.
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
12
petite précision : "this" est la fenetre MDI parent....

précision N°2 : si vous voulez la liste des fenetre enfant dans un menu il suffit sur votre item de menu "fenêtres" de passer MdiList à true...

et comme par magie si vous afficher plusieurs fenetre fille leur nom va apparaitre en bas de l'item de menu "fenetre" avec un petit séparateur (pour pas les mélanger avec les items cascade, horizontal...Etc...
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
12
heu..y avait vachement plus simple :

private void m_cascade_Click(object sender, System.EventArgs e)
{
this.LayoutMdi(System.Windows.Forms.MdiLayout.Cascade);
}

private void m_horizontal_Click(object sender, System.EventArgs e)
{
this.LayoutMdi(System.Windows.Forms.MdiLayout.TileHorizontal);
}

private void m_vertical_Click(object sender, System.EventArgs e)
{
this.LayoutMdi(System.Windows.Forms.MdiLayout.TileVertical);
}

private void m_mosaique_Click(object sender, System.EventArgs e)
{
this.LayoutMdi(System.Windows.Forms.MdiLayout.ArrangeIcons);
}

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.