81 votes

Masquage du formulaire unique au démarrage

J'ai une application avec un formulaire, et dans la méthode Load, je dois cacher le formulaire.

Le formulaire s'affichera de lui-même lorsqu'il en aura besoin (pensez à une fenêtre contextuelle de style Outlook 2003), mais je n'arrive pas à trouver comment masquer le formulaire au chargement sans que cela ne soit désordonné.

Des suggestions ?

118voto

Paul Aicher Points 461

En général, vous ne le ferez que si vous utilisez une icône de la barre d'état système ou une autre méthode pour afficher le formulaire plus tard, mais cela fonctionnera très bien même si vous n'affichez jamais votre formulaire principal.

Créez un bool dans votre classe de formulaire, dont la valeur par défaut est false :

private bool allowshowdisplay = false;

Remplacez ensuite la méthode SetVisibleCore.

protected override void SetVisibleCore(bool value)
{            
    base.SetVisibleCore(allowshowdisplay ? value : allowshowdisplay);
}

Étant donné que Application.Run() définit le formulaire .Visible = true après le chargement du formulaire, cette fonction l'intercepte et le définit comme false. Dans le cas ci-dessus, il le mettra toujours à false jusqu'à ce que vous l'activiez en définissant allowhowdisplay à true.

Cela empêchera le formulaire de s'afficher au démarrage. Vous devez maintenant réactiver le SetVisibleCore pour qu'il fonctionne correctement en définissant l'option allowhowdisplay = true. Vous voudrez faire cela sur n'importe quelle fonction de l'interface utilisateur qui affiche le formulaire. Dans mon exemple, il s'agit de l'événement de clic gauche dans mon objet notiyicon :

private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        this.allowshowdisplay = true;
        this.Visible = !this.Visible;                
    }
}

2 votes

Merci ! Contrairement à presque toutes les autres suggestions, celle-ci ne montre PAS un bref flash de la fenêtre principale.

2 votes

C'est la façon correcte de procéder, et c'est donc la réponse acceptée. À l'époque des MFC, nous avions l'habitude de faire une chose similaire en traitant le premier message WM_WINDOWPOSCHANGING et en cachant le formulaire à cet endroit pour éviter le "clignotement de la fenêtre".

0 votes

Merci. J'ai essayé la réponse acceptée et cela n'a pas fonctionné car j'ai besoin d'afficher une icône de la barre d'état système, mais ceci a parfaitement fonctionné.

117voto

Groky Points 6866

Je viens de C#, mais cela devrait être très similaire en vb.net.

Dans votre fichier de programme principal, dans la méthode Main, vous aurez quelque chose comme.. :

Application.Run(new MainForm());

Cela crée un nouveau formulaire principal et limite la durée de vie de l'application à celle du formulaire principal.

Toutefois, si vous supprimez le paramètre de Application.Run(), l'application sera lancée sans qu'aucun formulaire ne soit affiché et vous serez libre d'afficher et de masquer les formulaires autant que vous le souhaitez.

Plutôt que de masquer le formulaire dans la méthode Load, initialisez le formulaire avant d'appeler Application.Run(). Je suppose que le formulaire comportera un NotifyIcon pour afficher une icône dans la barre des tâches - celle-ci peut être affichée même si le formulaire lui-même n'est pas encore visible. Appeler Form.Show() o Form.Hide() des gestionnaires des événements NotifyIcon afficheront et masqueront le formulaire respectivement.

15 votes

De loin la meilleure (et l'une des plus simples) solution que j'ai vue. Toutes les conneries concernant la mise à zéro de l'opacité, l'utilisation d'instances séparées de Timer pour masquer le formulaire, etc.

0 votes

En utilisant cette méthode, sera-t-il encore trouvé par Process.MainWindowHandle et autres ?

13 votes

D'après ce que je vois, le concepteur n'a pas de propriété Visible.

39voto

Matías Points 3008

J'utilise ceci :

private void MainForm_Load(object sender, EventArgs e)
{
    if (Settings.Instance.HideAtStartup)
    {
        BeginInvoke(new MethodInvoker(delegate
        {
            Hide();
        }));
    }
}

Évidemment, vous devez remplacer la condition "si" par la vôtre.

3 votes

Ainsi, le programme s'allume puis se cache rapidement au démarrage.

0 votes

Je suppose que je devrais en faire autant si je ne voyais pas votre code. Merci

0 votes

Pour résoudre le problème du flash au démarrage de l'application, réglez l'opacité du formulaire sur 0 dans le concepteur, puis dans la fonction de rappel, appelez d'abord Hide() et réglez ensuite l'opacité sur 100.

21voto

Chriz Points 21
    protected override void OnLoad(EventArgs e)
    {
        Visible = false; // Hide form window.
        ShowInTaskbar = false; // Remove from taskbar.
        Opacity = 0;

        base.OnLoad(e);
    }

1 votes

Je veux que mon formulaire soit caché MAIS qu'il soit toujours chargé et fonctionne. Cette solution fonctionne parfaitement dans ce cas. Upvote à vous !

0 votes

Je pense que c'est la meilleure solution, THX :)

16voto

Jeff Points 41

Au moment de la construction du formulaire (Designer, programme Main, ou constructeur de formulaire, selon vos objectifs),

 this.WindowState = FormWindowState.Minimized;
 this.ShowInTaskbar = false;

Lorsque vous avez besoin de montrer le formulaire, présumez sur l'événement de votre NotifyIcon, inversez si nécessaire,

 if (!this.ShowInTaskbar)
    this.ShowInTaskbar = true;

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

Les événements successifs d'affichage/masquage peuvent plus simplement utiliser la propriété Visible du formulaire ou les méthodes Show/Hide.

0 votes

Cela fonctionne également dans l'événement Load. Je pense que c'est la façon dont c'était prévu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X