Forums Neueste Beiträge
 

Form in Tray anzeigen

03/03/2008 - 11:28 von Brian Schmalisch | Report spam
Hallo,

ich möchte ein Formular gleich beim Start im Tray anzeigen. Ich habe
notifyIcon1 in mein Projekt eingebunden. Folgendes habe ich geschrieben:

private void Form1_Load(object sender, EventArgs e)
{
...

if (IsSettingOK())
{
...
this.Close();
}
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing
|| e.CloseReason == CloseReason.TaskManagerClosing)
{
hideForm();
e.Cancel = true;
}
}

private void hideForm()
{
this.Visible = false;
}

Leider verschwindet das Formular nicht - es wird voll angezeigt. Schließe
ich jedoch das Fenster dann über den Schließen-Button, dann funktioniert es
plötzlich. Ich stehe vor einem Ràtsel.

Brian
 

Lesen sie die antworten

#1 Thorsten Doerfler
03/03/2008 - 12:29 | Warnen spam
Brian Schmalisch schrieb:
ich möchte ein Formular gleich beim Start im Tray anzeigen. Ich habe
notifyIcon1 in mein Projekt eingebunden.
[...]
Leider verschwindet das Formular nicht - es wird voll angezeigt.



Dafür ist der Standard ApplicationContext verantwortlich, der das
Formular immer anzeigt. Du kannst einen eigenen ApplicationContext
erstellen, der ein anderes Verhalten implementiert:

using System;
using System.Windows.Forms;

namespace HiddenApplicationContext
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();

HiddenApplicationContext hiddenContext new HiddenApplicationContext(new Form1());
Application.Run(hiddenContext);
}
}

class HiddenApplicationContext : ApplicationContext
{
private Form mainForm;

public HiddenApplicationContext(Form mainForm):base()
{

this.mainForm = mainForm;
this.mainForm.CreateControl();

this.mainForm.FormClosed + delegate(object sender_, FormClosedEventArgs e_)
{
this.ExitThreadCore();
};
}

protected override void Dispose(bool disposing)
{
base.Dispose(disposing);

if (disposing && mainForm != null)
{
if (mainForm.IsDisposed)
{
mainForm.Dispose();
}
mainForm = null;
}
}
}

// Beispiel für das Formular:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void notifyIcon1_MouseDoubleClick(
object sender, MouseEventArgs e)
{
if (this.Visible)
{
this.Hide();
}
else
{
this.Show();
this.WindowState = FormWindowState.Normal;
}
}

private void Form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Hide();
}
}
}
}

Alleine für das NotifyIcon benötigst Du nicht zwingend ein Formular,
da es ein solches bei Bedarf auch selber erstellt. Du könntest in
Deinem eigenen ApplicationContext auch nur das NotifyIcon verwalten.

Die Funktion "Fenster schließen" bzw. "Anwendung beenden", sollte auch
immer das machen, was der Anwender erwartet und nicht die Anwendung
weiter in den Infobereich verfrachten. Das sollte man der Funktion
"minimieren" überlassen, àhnlich wie in meinem Beispiel.

Thorsten Dörfler
Microsoft MVP Visual Basic

vb-hellfire visual basic faq | vb-hellfire - einfach anders
http://vb-faq.de/ | http://www.vb-hellfire.de/

Ähnliche fragen