C#: Outlook like Pop-up Alert

20. Januar 2010

dotnet
Jeder kennt die Outlook-Benachrichtigungen am rechten unten Bildschirmrand wenn man eine neue Mail erhält. Leider gibt es im .Net-Framework kein fertiges Control, welches genau die gleiche Funktionalität bietet. Jedoch kann man mit wenigen Zeilen Code sich ein eigenes solches Control schreiben.

Im Prinzip verwenden wir einfach ein normales Windows Forms ohne Rand (ShowInTaskBar = false, FormBorderStyle =none, TopMost = true) und bewegen dieses von unten nach oben.

Dazu benötigen wir 3 verschiedene Timer:

// 
// _timerLoad
// 
this._timerLoad.Enabled = true;
this._timerLoad.Interval = 10;
this._timerLoad.Tick += new System.EventHandler(this._timerLoad_Tick);
// 
// _timerHide
// 
this._timerHide.Interval = 10;
this._timerHide.Tick += new System.EventHandler(this._timerHide_Tick);
// 
// _timerShown
// 
this._timerShown.Interval = 3000;
this._timerShown.Tick += new System.EventHandler(this._timerShown_Tick);

_timerLoad regel das einblenden, _timerHide das ausblenden und _timerShow dient dazu, das Ausblenden nach 3 Sekunden zu starten.

Im Load Ereignis des Forms müssen wir dann die Form Positionieren:

_x = Screen.GetWorkingArea(this).Width;
_y = Screen.GetWorkingArea(this).Height;
Location = new Point(_x - Width, _y + Height);
 
_timerLoad.Enabled = true;
_timerLoad.Start();

Danach die 3 Timer-Events zum ein und ausblenden:

/// <summary>
/// Form einblenden
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void _timerLoad_Tick(object sender, EventArgs e)
{
  int i = Location.Y;
 
  if (i > _y - Height)
  {
    Location = new Point(_x - Width, i - 8);
  }
  else
  {
    _timerLoad.Stop();
    _timerLoad.Enabled = false;
 
    _timerShown.Start();
    _timerShown.Enabled = true;
  }
}
 
/// <summary>
/// Warten und dann ausblenden
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void _timerShown_Tick(object sender, EventArgs e)
{
  _timerHide.Enabled = true;
  _timerHide.Start();
}
 
/// <summary>
/// Form ausblenden
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void _timerHide_Tick(object sender, EventArgs e)
{
  int i = Location.Y;
 
  if (i < _y)
  {
    Location = new Point(_x - Width, i + 8);
  }
  else
  {
    _timerHide.Stop();
    _timerHide.Enabled = false;
    Close();
  }
}

Schreib einen Kommentar

Previous post:

Next post: