2008-11-25 8 views
6

Dans mon application, je dois temporairement griser le bouton de réduction du formulaire principal. Des idées comment cela peut-il être réalisé? Cela ne me dérange pas de faire p/invoque des DLLs Win32. Editer: Supprimer le bouton de minimisation serait la solution préférée, mais existe-t-il un autre moyen d'empêcher la forme de se réduire au minimum?Comment désactiver le bouton de réduction en C#?

Répondre

11

J'ai lu votre commentaire en ce qui concerne ma réponse et j'ai pu trouver une solution plus complète pour vous. J'ai couru cela rapidement et il semblait avoir le comportement que vous vouliez. Au lieu de déduire vos WinForms de la forme, tirer de cette classe:


using System; 
using System.Windows.Forms; 
using System.ComponentModel; 

namespace NoMinimizeTest 
{ 
    public class MinimizeControlForm : Form 
    { 
     private const int WM_SYSCOMMAND = 0x0112; 
     private const int SC_MINIMIZE = 0xf020; 

     protected MinimizeControlForm() 
     { 
      AllowMinimize = true; 
     } 

     protected override void WndProc(ref Message m) 
     { 
      if (!AllowMinimize) 
      { 
       if (m.Msg == WM_SYSCOMMAND) 
       { 
        if (m.WParam.ToInt32() == SC_MINIMIZE) 
        { 
         m.Result = IntPtr.Zero; 
         return; 
        } 
       } 
      } 
      base.WndProc(ref m); 
     } 

     [Browsable(true)] 
     [Category("Behavior")] 
     [Description("Specifies whether to allow the window to minimize when the minimize button and command are enabled.")] 
     [DefaultValue(true)] 
     public bool AllowMinimize 
     { 
      get; 
      set; 
     } 
    } 
} 

Vous pourriez faire un peu plus si vous voulez être en mesure de décider d'autoriser ou non réduire au minimum au moment où le clic est envoyé, par exemple:


using System; 
using System.Windows.Forms; 
using System.ComponentModel; 

namespace NoMinimizeTest 
{ 
    public class MinimizeControlForm : Form 
    { 
     private const int WM_SYSCOMMAND = 0x0112; 
     private const int SC_MINIMIZE = 0xf020; 

     protected MinimizeControlForm() 
     { 

     } 

     protected override void WndProc(ref Message m) 
     { 
      if (m.Msg == WM_SYSCOMMAND) 
      { 
       if (m.WParam.ToInt32() == SC_MINIMIZE && !CheckMinimizingAllowed()) 
       { 
        m.Result = IntPtr.Zero; 
        return; 
       } 
      } 
      base.WndProc(ref m); 
     } 

     private bool CheckMinimizingAllowed() 
     { 
      CancelEventArgs args = new CancelEventArgs(false); 
      OnMinimizing(args); 
      return !args.Cancel; 
     } 

     [Browsable(true)] 
     [Category("Behavior")] 
     [Description("Allows a listener to prevent a window from being minimized.")] 
     public event CancelEventHandler Minimizing; 

     protected virtual void OnMinimizing(CancelEventArgs e) 
     { 
      if (Minimizing != null) 
       Minimizing(this, e); 
     } 
    } 
} 

Pour plus d'informations sur cette notification de fenêtre, voir le MSDN article about it.

10
form.MinimizeBox = false; 

ou si, sous la forme étendue

MinimizeBox = false; 
+0

Ceci masque la zone de minimisation, mais ne la rend pas grise. –

+1

Hmmm, étrange. Je l'ai testé et il grise. Il est toujours là, semi-transparent et vous ne pouvez pas cliquer dessus. – Coincoin

+2

Dépend de votre thème Windows. Si le bouton Réduire est activé, vous obtenez une image. Si désactivé, vous obtenez une image différente. Cette image n'est peut-être rien, alors vous ne voyez même pas un bouton greay-out. – Eyal

1

Il suffit de faire MinimizeBox = false; dans le code de votre formulaire.

0

Vous pouvez également implémenter la poignée à la minimiser l'événement pour annuler la commande

+0

Cela fonctionnerait s'il y avait un tel événement. :) – MusiGenesis

1

Mettez ce code dans l'événement Resize de votre formulaire:

if (this.WindowState == FormWindowState.Minimized) 
{ 
    this.WindowState = FormWindowState.Normal; 
} 

Cela rendra votre formulaire un-minimizable (Disclaimer: ne préconise pas de modifier le comportement standard des fenêtres de cette manière).

0

Ne le faites pas. Ne plaisante pas avec mes fenêtres. Ils sont à moi, pas à vous. C'est mon ordinateur et si je veux minimiser, je devrais pouvoir. Je ne peux pas penser, et n'ai jamais été donné, une bonne raison de faire ceci.

+7

Je vais aller avec "logiciel de surveillance de base centrale nucléaire".Si l'auteur veut rendre cette fenêtre non minimisable, ça me va. – MusiGenesis

+4

jusqu'à ce que le logiciel de surveillance affiche tout ce qui est rouge et que le bouton "arrêt d'urgence" se trouve derrière la fenêtre du logiciel de surveillance – Kevin

+8

Pour l'amour de Dieu, n'utilisez pas C# WinForms pour les centrales nucléaires! –

0

La réponse de Coincoin est correcte. MinimizeBox est également disponible en tant que propriété dans la fenêtre des propriétés du concepteur.

@Kevin: Bien que j'apprécie le sentiment, ce n'est pas toujours une réponse valable. Si l'application affiche une boîte de dialogue modale en créant une nouvelle instance d'un formulaire puis en appelant .ShowDialog(), vous ne voulez pas que l'utilisateur réduise ce formulaire, car toutes les entrées du thread d'interface utilisateur principal sont bloquées jusqu'à ce que Le statut modal de ce formulaire est satisfait. L'utilisateur peut éventuellement cliquer sur le formulaire principal et obtenir le son "ding ding ding" de Windows sans y répondre et ne pas savoir quoi faire.

+0

La configuration de MinimizeBox à false suffirait généralement, mais dans mon cas, la MaximizeBox est également masquée. Lorsque MinimizeBox est affiché, la barre d'outils affiche 3 boutons - minimiser, grisé, agrandir, fermer. Mais quand when est défini sur MinimizeBox sur false, les boutons minimiser/agrandir ne sont plus rendus. –

+0

ou ils pourraient avoir besoin de voir une information derrière le formulaire modal pour le remplir et vouloir le minimiser pour mieux voir cette information. En outre, puisque cette question peut être vue par les programmeurs débutants, je voulais mettre ce conseil là pour eux. – Kevin

0

juste définir la propriété MinimizeBox de votre formulaire à false. cela désactivera le bouton de réduction mais les autres boutons resteront fonctionnels.

Questions connexes