Einige Programme, wie beispielsweise Skype, heften sich an den Bildschirmrand an, wenn man das Fenster in die Nähe schiebt. Diese Erweiterungsmethode muss im LocationChanged-Eventhandler aufgerufen werden. Die Parameter sind in der XML-Doku näher beschrieben.
Hinweis: Diese Methode lässt auch relativ leicht für WPF umsetzen.
/// <summary>
/// Überprüft ob eine Form in der Nähe von einem Bildschirmrand ist.
/// </summary>
/// <param name="frm">Die Form, deren Position überprüft werden soll.</param>
/// <param name="px">Die Mögliche Differenz vom Rand in Pixel.</param>
/// <param name="snap"><c>True</c>, wenn das Fenster an den entsprechenden Rand verschoben werden soll, ansonsten <c>>False</c>.</param>
/// <returns><c>True</c>, wenn das Fenster einen BHildschirmrand berührt oder sich in der Nähe befindet, andernfalls <c>False</c>.</returns>
/// <exception cref="System.ArgumentNullException">Wird ausgelöst, wenn die Form <c>null</c> ist.</exception>
/// <exception cref="System.ArgumentOutOfRangeException">Wird ausgelöst, wenn px kleiner als 0 ist.</exception>
public static bool IsTouchingScreenBorder(this Form frm, int px, bool snap)
{
if (frm == null)
throw new ArgumentNullException("frm", "Condition: frm != null");
if (px < 0)
throw new ArgumentOutOfRangeException("Condition: px >= 0");
bool result = false;
bool v = false, h = false;
foreach (Screen s in Screen.AllScreens)
{
if (!h)
{
if (s.WorkingArea.Left - px < frm.Left && s.WorkingArea.Left + px > frm.Left)
{
if(snap)
frm.Left = s.WorkingArea.Left;
h = true;
result = true;
}
else if (s.WorkingArea.Right - px < frm.Right && s.WorkingArea.Right + px > frm.Right)
{
if(snap)
frm.Left = s.WorkingArea.Right - frm.Width;
h = true;
result = true;
}
}
if (!v)
{
if (s.WorkingArea.Top - px < frm.Top && s.WorkingArea.Top + px > frm.Top)
{
if(snap)
frm.Top = s.WorkingArea.Top;
v = true;
result = true;
}
else if (s.WorkingArea.Bottom - px < frm.Bottom && s.WorkingArea.Bottom + px > frm.Bottom)
{
if(snap)
frm.Top = s.WorkingArea.Bottom - frm.Height;
v = true;
result = true;
}
}
if (v && h)
return result;
}
return result;
}
Kommentare zum Snippet