Feedback

C# - Fenster am Bildschirmrand andocken (auch WPF)

Veröffentlicht von am 23.05.2013
(1 Bewertungen)
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.
GFU-Schulungen  [Anzeige]

VB.NET 2017/2015/2013 Aufbau

Nach dieser Schulung können Sie mittels objektorientierter Modelle in VB.NET 2017/2015/2013 wiederverwendbare Elemente eigenständig erstellen.

C# Aufbaukurs

Sie haben grundlegende .NET- und C#-Kenntnisse und und wollen diese nun erweitern. Der Aufbaukurs C# führt Sie ein die Arbeit mit Interfaces und Delegates, Generics und Parallel Computing.

/// <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

 

Logge dich ein, um hier zu kommentieren!