J'ai une application contenant un formulaire et sur la méthode Load, je dois masquer le formulaire.
Le formulaire s'affichera lorsqu'il en aura besoin (pensez dans le sens d'une fenêtre contextuelle de style Outlook 2003), mais je peux comprendre comment masquer le formulaire lors du chargement sans quelque chose de salissant.
Aucune suggestion?
J'y viens de C #, mais devrait être très similaire dans vb.net.
Dans votre fichier 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 à la durée de vie du formulaire principal.
Cependant, si vous supprimez le paramètre à Application.Run (), l'application sera démarrée sans aucun formulaire 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 aura un NotifyIcon dessus pour afficher une icône dans la barre des tâches - cela peut être affiché même si le formulaire lui-même n'est pas encore visible. L'appel de Form.Show()
ou Form.Hide()
à partir des gestionnaires d'événements NotifyIcon affichera et masquera le formulaire respectivement.
Habituellement, vous ne le feriez que lorsque vous utilisez une icône de barre d'état ou une autre méthode pour afficher le formulaire plus tard, mais cela fonctionnera bien même si vous n'affichez jamais votre formulaire principal.
Créez un booléen dans votre classe Form qui est défini par défaut sur 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 les formulaires .Visible = true après avoir chargé le formulaire, cela intercepte cela et le définit sur false. Dans le cas ci-dessus, il la définira toujours sur false jusqu'à ce que vous l'activiez en définissant allowhowdisplay sur true.
Maintenant, cela empêchera le formulaire de s'afficher au démarrage, vous devez maintenant réactiver le SetVisibleCore pour fonctionner correctement en définissant le allowhowdisplay = true. Vous souhaiterez le faire sur n'importe quelle fonction d'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;
}
}
J'utilise ceci:
private void MainForm_Load(object sender, EventArgs e)
{
if (Settings.Instance.HideAtStartup)
{
BeginInvoke(new MethodInvoker(delegate
{
Hide();
}));
}
}
De toute évidence, vous devez modifier la condition if avec la vôtre.
protected override void OnLoad(EventArgs e)
{
Visible = false; // Hide form window.
ShowInTaskbar = false; // Remove from taskbar.
Opacity = 0;
base.OnLoad(e);
}
Au moment de la construction du formulaire (concepteur, programme principal ou constructeur de formulaire, selon vos objectifs),
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
Lorsque vous devez montrer le formulaire, vraisemblablement lors d'un é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 Afficher/Masquer.
Essayez également de masquer l'application dans la barre des tâches.
Pour ce faire, veuillez utiliser ce code.
protected override void OnLoad(EventArgs e)
{
Visible = false; // Hide form window.
ShowInTaskbar = false; // Remove from taskbar.
Opacity = 0;
base.OnLoad(e);
}
Merci. Ruhul
J'ai eu beaucoup de mal avec ce problème et la solution est beaucoup plus simple que moi. J'ai d'abord essayé toutes les suggestions ici mais ensuite je n'étais pas satisfait du résultat et je l'ai étudié un peu plus. J'ai trouvé que si j'ajoute le:
this.visible=false;
/* to the InitializeComponent() code just before the */
this.Load += new System.EventHandler(this.DebugOnOff_Load);
Cela fonctionne très bien. mais je voulais une solution plus simple et il s'avère que si vous ajoutez:
this.visible=false;
/* to the start of the load event, you get a
simple perfect working solution :) */
private void
DebugOnOff_Load(object sender, EventArgs e)
{
this.Visible = false;
}
Vous souhaiterez définir l'état de la fenêtre sur réduit et afficher dans la barre des tâches sur faux. Ensuite, à la fin de vos formulaires, chargez l'état de la fenêtre d'ensemble à maximiser et affichez la barre des tâches à true
public frmMain()
{
Program.MainForm = this;
InitializeComponent();
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
}
private void frmMain_Load(object sender, EventArgs e)
{
//Do heavy things here
//At the end do this
this.WindowState = FormWindowState.Maximized;
this.ShowInTaskbar = true;
}
Mettez ceci dans votre Program.cs:
FormName FormName = new FormName ();
FormName.ShowInTaskbar = false;
FormName.Opacity = 0;
FormName.Show();
FormName.Hide();
Utilisez-le lorsque vous souhaitez afficher le formulaire:
var principalForm = Application.OpenForms.OfType<FormName>().Single();
principalForm.ShowInTaskbar = true;
principalForm.Opacity = 100;
principalForm.Show();
Remplacer OnVisibleChanged dans le formulaire
protected override void OnVisibleChanged(EventArgs e)
{
this.Visible = false;
base.OnVisibleChanged(e);
}
Vous pouvez ajouter un déclencheur si vous devez l'afficher à un moment donné
public partial class MainForm : Form
{
public bool hideForm = true;
...
public MainForm (bool hideForm)
{
this.hideForm = hideForm;
InitializeComponent();
}
...
protected override void OnVisibleChanged(EventArgs e)
{
if (this.hideForm)
this.Visible = false;
base.OnVisibleChanged(e);
}
...
}
Cela fonctionne parfaitement pour moi:
[STAThread]
static void Main()
{
try
{
frmBase frm = new frmBase();
Application.Run();
}
Lorsque je lance le projet, tout était caché, y compris dans la barre des tâches, sauf si je dois le montrer.
Le lancement d'une application sans formulaire signifie que vous devrez gérer vous-même le démarrage/l'arrêt de l'application.
Le démarrage du formulaire invisible est une meilleure option.
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainUIForm mainUiForm = new MainUIForm();
mainUiForm.Visible = false;
Application.Run();
}
Voici une approche simple:
C'est en C # (je n'ai pas VB compilateur pour le moment)
public Form1()
{
InitializeComponent();
Hide(); // Also Visible = false can be used
}
private void Form1_Load(object sender, EventArgs e)
{
Thread.Sleep(10000);
Show(); // Or visible = true;
}
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 form1 = new Form1();
form1.Visible = false;
Application.Run();
}
private void ExitToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
Application.Exit();
}
J'ai eu un problème similaire à celui de l'affiche où le code pour masquer le formulaire dans l'événement form_Load se déclenchait avant que le formulaire ne soit complètement terminé, ce qui faisait échouer la méthode Hide () (ne se bloquait pas, ne fonctionnait pas comme prévu).
Les autres réponses sont excellentes et fonctionnent mais j'ai trouvé qu'en général, l'événement form_Load a souvent de tels problèmes et ce que vous voulez y mettre peut facilement aller dans le constructeur ou l'événement form_Shown.
Quoi qu'il en soit, lorsque j'ai déplacé ce même code qui vérifie certaines choses, puis masque le formulaire lorsqu'il n'est pas nécessaire (un formulaire de connexion lorsque la connexion unique échoue), son fonctionnement comme prévu.
Cet exemple prend en charge l'invisibilité totale ainsi que seulement NotifyIcon dans la barre d'état système et aucun clic et bien plus encore.
Plus ici: http://code.msdn.Microsoft.com/TheNotifyIconExample
En complément de réponse de Groky (qui est en fait de loin la meilleure réponse de mon point de vue), nous pourrions également mentionner la classe ApplicationContext , qui permet également (comme cela est indiqué dans le exemple de l'article) la possibilité d'ouvrir deux (voire plus) formulaires au démarrage de l'application et de contrôler la durée de vie de l'application avec chacun d'eux.