Empecher la fermeture d'une MDI fille

Résolu
roinou Messages postés 21 Date d'inscription dimanche 8 mai 2005 Statut Membre Dernière intervention 7 novembre 2005 - 4 oct. 2005 à 12:15
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 7 oct. 2005 à 02:00
Salut à tous,



Je voudrai empecher la fermeture d'une fenètre MDI Fille (toute les
fenètres en fait). Idéalement cela reviendrai à griser la croix, ou
bien remplacer l'action de fermeture par la réduction. J'ai trouvé des
codes en VB, mais aucun en C#.



Aidez moi SVP!!



PS : Il est possible de désactiver les 3 bouton supérieurs, mais dans la mesure du possible, je voudrai l'éviter.

14 réponses

roinou Messages postés 21 Date d'inscription dimanche 8 mai 2005 Statut Membre Dernière intervention 7 novembre 2005
6 oct. 2005 à 19:43
oui, le code est dans ma MDI fille. Ca marche chez toi avec WinXP?



De toute façon, c'est pas grave, j'ai enfin trouvé une solution satisfaisante!!!






protected override CreateParams CreateParams



{



get



{



int CS_NOCLOSE = 0x0200;



CreateParams param = base.CreateParams;



param.ClassStyle |= CS_NOCLOSE;







return param;



}



}




a mettre dans la mdi fille, et miracle sa marche! Pas d'appel à une dll!!
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
4 oct. 2005 à 12:41
Salut,

protected override void OnClosing( CancelEventArgs e )
{
this.WindowState = FormWindowState.Minimized;
e.Cancel = true;
}
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
4 oct. 2005 à 12:53
Cependant, s'il veut fermer sa form parente, ca va annuler l'evenement aussi :/



A noter que si tu bosses avec le .net 2.0, tu as juste a regarder si la
propriété FormClosingEventArgs.CloseReaser est différente de
CloseReason.MdiFormClosing

Mx
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
4 oct. 2005 à 14:47
Ouaip exact Mx, j'avais pas vu..

J'ai testé une solution en .NET 1.1 ( à part la classe partial ) ça semble fonctionner mais c'est pas super élégant.

public partial class MainForm : Form
{
private const int WM_CLOSE = 0x0010;


internal bool close; // Add property


public MainForm( ) : base( )
{
InitializeComponent( );


this.IsMdiContainer = true;
ChildForm f1 = new ChildForm( );
f1.Text = "Form 1";
f1.MdiParent = this;
f1.Visible = true;
ChildForm f2 = new ChildForm( );
f2.Text = "Form 2";
f2.MdiParent = this;
f2.Visible = true;
}


protected override void WndProc( ref Message m )
{
if ( m.Msg == WM_CLOSE )
{
this.close = true;
}


base.WndProc( ref m );
}
}


public class ChildForm : Form
{
public ChildForm( ) : base( )
{


}


protected override void OnClosing( CancelEventArgs e )
{
base.OnClosing( e );


if ( !( ( MainForm )this.MdiParent ).close )
{
this.WindowState = FormWindowState.Minimized;
e.Cancel = true;
}
}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
roinou Messages postés 21 Date d'inscription dimanche 8 mai 2005 Statut Membre Dernière intervention 7 novembre 2005
4 oct. 2005 à 15:43
Merci pour ta réponse Lutinore, bien que je trouve ça un peu crade.
J'avais pensé à une solution très similaire, mais je pense que le point
important est de surcharger la méthode WndProc, pour changer la valeur
de close AVANT que le systeme ferme les fenetres filles.



Par contre, si je puis me permettre, il serais plus judicieux de ne pas
surcharger OnClosing, mais plutot d'utiliser les évènements. Après
tout, ils sont la pour ça... Qu'en penses-tu?



private void childForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{

MotherWindow tmp = (MotherWindow) this.MdiParent;

if ( !tmp.IsClosing )

e.Cancel = true;

}

}



ChildForm.Closing += new System.ComponentModel.CancelEventHandler(this.VehiculeForm_Closing);



Voila, maintenant, il existe des propriétés pour griser les boutons
maximise et minimise, peut-etre qu'en fouillant un peu et en dérivant
on peut atteindre cette p**** de croix.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
4 oct. 2005 à 16:45
Pour les évènements ça ne change pas grand chose mais je me réfère à ce qui est écrit dans la documentation:


"La méthode OnClosing autorise également les classes dérivées à gérer l'événement sans y attacher de délégué. Cette technique est recommandée pour gérer un événement dans une classe dérivée."

C'est la méthode de la classe de base qui appelle les délégués inscrits.

Pour griser la croix je ne sais pas.. ( !? )
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 38
5 oct. 2005 à 10:57
pour griser la croix :

private void FormCloseButtonEnable(bool enable) {
if (!enable) {
// Grise le bouton Fermer de la fenêtre (croix)
EnableMenuItem(GetSystemMenu(this.Handle, false), SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
} else {
// Rend actif le bouton Fermer de la fenêtre
EnableMenuItem(GetSystemMenu(this.Handle, false), SC_CLOSE, MF_BYCOMMAND | MF_ENABLED);
}
}

avec :
[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);


[DllImport("user32.dll")]
private static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem,
uint uEnable);


private const int SC_CLOSE = 0xF060;
private const uint MF_BYCOMMAND = 0x0;
private const uint MF_ENABLED = 0x0;
private const uint MF_GRAYED = 0x1;

Sébastien FERRAND
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 38
5 oct. 2005 à 10:57
j'oubliais... pour griser : FormCloseButtonEnable(false);
sinon FormCloseButtonEnable(true);

Sébastien FERRAND
0
roinou Messages postés 21 Date d'inscription dimanche 8 mai 2005 Statut Membre Dernière intervention 7 novembre 2005
6 oct. 2005 à 19:24
Aye Sebmafate, ça ne marche pas, malheureusement...

Je débute en C#, peut-être ai-je oublié une étape importante?



PS : ne pas oublier "using System.Runtime.InteropServices;" en entête
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 38
6 oct. 2005 à 19:30
le code tu l'as mis dans la mdi fille ?

Sébastien FERRAND
0
roinou Messages postés 21 Date d'inscription dimanche 8 mai 2005 Statut Membre Dernière intervention 7 novembre 2005
6 oct. 2005 à 19:31
Après un peu de recherche, j'ai l'impression que ta méthode ne marche
que sur des systèmes inférieurs à Windows 2K. Y a t'il une equivalence
pour Windows XP?
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 38
6 oct. 2005 à 19:38
ca marche avec XP... je l'utilise sans soucis...

modifie la méthode comme ceci :
private void FormCloseButtonEnable(bool enable, Form from) {
if (!enable) {
// Grise le bouton Fermer de la fenêtre (croix)
EnableMenuItem(GetSystemMenu(form.Handle, false), SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
} else {
// Rend actif le bouton Fermer de la fenêtre
EnableMenuItem(GetSystemMenu(form.Handle, false), SC_CLOSE, MF_BYCOMMAND | MF_ENABLED);
}
}

comme ca, tu passes la référence du formulaire dont tu veux griser la croix

Sébastien FERRAND
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 38
6 oct. 2005 à 19:45
lol... c'était trop simple :p

mais, ce n'est pas réversible ;)

Sébastien FERRAND
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
7 oct. 2005 à 02:00
Ouaip effectivement trop simple, j'ai regardé les styles mais trop vite, j'ai pas vu CS_NOCLOSE.

Sébastien tu modifies souvent le style de tes contrôles, c'est étonnant que tu sois passé à coté ; )
0