2010-09-22 3 views
8

Je voulais cacher la fenêtre principale de mon application au démarrage, donc je mis cela dans le constructeur:Masquage des formulaires au démarrage: pourquoi cela ne se cache-t-il pas? Masquer() mon formulaire?

this.Hide(); 

Cela ne cache pas ma forme cependant. Il semble que je peux seulement obtenir des boutons pour cacher le formulaire. Est-ce que je fais quelque chose de mal ici?

+0

double possible de [this.Visible ne fonctionne pas dans Windows Forms] (http: // stackoverflow. com/questions/3742709/this-visible-is-not-working-in-windows-forms) –

Répondre

20

vous pouvez utiliser cette ligne de code. Il cacher l'habitude, mais il sera réduit au minimum:

this.WindowState = FormWindowState.Minimized; 

en plus, si vous ne voulez pas afficher sur la barre des tâches soit, vous pouvez ajouter cette ligne:

this.ShowInTaskbar = false; 

Mais pourquoi créez-vous le formulaire si vous ne voulez pas qu'il soit visible en premier lieu?

+0

Parce qu'il démarre avec Windows et réside dans la barre d'état système d'une manière similaire à un logiciel antivirus et pare-feu. Une idée de la raison pour laquelle 'this.Hide()' ne cache pas réellement le formulaire lorsqu'il est appelé depuis le constructeur du formulaire? – Pieter

+1

Je pense que c'est parce qu'à ce stade (lors de l'exécution du constructeur) votre formulaire n'a pas encore été rendu visible. Ce n'est qu'après la fin du constructeur que le formulaire sera créé et rendu visible. Donc, votre seul problème pour que cela ne fonctionne pas, c'est parce que c'est fait par le constructeur. Je ne suggère pas cela comme une solution, mais comme une expérience, faites une minuterie et démarrez-le à partir du constructeur avec un délai de 1 seconde, et faites que la méthode timer_tick cache le formulaire. Cela fonctionnera, car au moment où vous appelez this.Hide() le formulaire sera visible. –

+0

Vous obtenez le même problème lorsque vous avez une construction comme celle-ci dans program.cs: Application.Run (new Form1()); et vous essayez d'écrire Application.Exit() dans le constructeur de Form1. Après l'appel Application.Exit(), votre application sera toujours en vie, car le constructeur est exécuté avant Application.Run et n'aura donc aucun effet. Donc même problème pour vous. Vous le faites caché, juste pour avoir Application.Run le rendre vivable et donner un coup de pied à nouveau. –

0

Essayez de définir la propriété visible du formulaire sur false avant de le charger dans le point d'entrée principal de votre application.

Form1 obj = new Form1(); 
obj.visible = false; 
Application.Run(obj); 

Ou essayez de définir les coordonnées de la forme vers un endroit plus comme 9000, 9000.

+0

Ceci n'est pas une solution. Besoin d'utiliser override de OnVisibleChanged. Voir au dessus. –

+0

Ne pas mettre le formulaire hors écran mais toujours visible. Les utilisateurs aveugles utilisant le logiciel screenreader le verront toujours (tout comme les utilisateurs utilisant alt-tab). –

11

outrepasser la méthode juste OnVisibleChanged et changer la visibilité de la forme là-dedans, quelque chose comme ceci:

protected override void OnVisibleChanged(EventArgs e) 
{ 
    base.OnVisibleChanged(e); 
    this.Visible = false; 
} 

Et voilà! Simple et propre.

+0

Ceci est une solution de travail. Appelez sur la fonction Masquer() et placez-le au-dessus du code. Merci :) –

+0

C'est la seule solution qui a fonctionné pour moi. – tavlima

0

J'ai essayé de le faire en définissant Visible sur false ou en masquant dans le constructeur et dans l'événement OnLoad.

Aucun de ces paramètres n'a eu d'effet, car le formulaire est défini sur Visible une fois le formulaire créé et après le déclenchement de l'événement OnLoad dans SetVisibleCore.

La définition du masque masqué dans l'événement affiché fonctionne, mais le masque clignote sur l'écran pendant un instant.

Vous pouvez également remplacer SetVisibleCore et définir la valeur sur false, mais alors OnLoad n'est pas déclenché et certains des autres événements sont foirés, comme la fermeture de formulaire.

La meilleure solution à mon avis est de définir le formulaire à réduire et non affiché dans la barre des tâches avant d'appeler Application.Run().

Ainsi, au lieu de:

Application.Run(new MainForm()); 

faire:

MainForm form = new MainForm(); 
form.WindowState = FormWindowState.Minimized; 
form.ShowInTaskbar = false; 

Application.Run(form); 

Ensuite, l'application fonctionnera avec tous les événements appropriés tiré (même OnShown) et la forme ne sera pas affiché.

Si vous souhaitez pouvoir masquer/afficher le formulaire comme d'habitude après cela, vous devez définir WindowState et ShowInTaskbar sur Normal et true.

Dans l'événement Affiché, vous pouvez redéfinir ShownInTaskbar sur true, puis masquer correctement le formulaire.

this.Shown += new System.EventHandler(this.MainFormShown); 

...

void MainFormShown(object sender, EventArgs e) 
{ 
    this.ShowInTaskbar = true; 
    this.Visible = false; 
} 

Paramètres du WindowState Retour à la normale tandis que la forme est cachée n'a pas d'effet, vous aurez donc besoin de le faire après vous montrer à nouveau le formulaire, sinon l'icône être dans la barre des tâches mais le formulaire sera minimisé.

this.Show(); 
this.WindowState = FormWindowState.Normal; 
+0

La solution de travail est ci-dessus. Cela ne marchera pas. –

+0

La solution de travail ci-dessus n'a pas fonctionné pour moi. La fenêtre a clignoté sur l'écran momentanément avant d'être masquée. Également il vous empêche de montrer le formulaire après. Cette méthode a bien fonctionné pour moi. –

3

Si vous préférez utiliser this.Hide ou this.Show vous pouvez le faire

protected override void OnShown(EventArgs e) 
{ 
    base.OnShown(e); 
    this.Hide(); 
} 
Questions connexes