Feedback

C# - Fenster am Bildschirmrand andocken

Veröffentlicht von am 11/5/2006
(2 Bewertungen)
Das Beispiel reserviert 100 Pixel Desktop Platz (oben) und positioniert das aktuelle Form in diesem Bereich
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsApplication1
{
    /// <sumary>
    /// Beinhaltet Information über die Application Bar.
    /// Eine ausführliche Beschreibung finden Sie in MSDN APPBARDATA Dokumentation.
    /// </sumary> 
    [StructLayout(LayoutKind.Sequential)]
    public struct APPBARDATA
    {
        public uint cbSize;
        public IntPtr hWnd;
        public uint uCallbackMessage;
        public uint uEdge;
        public RECT rc;
        public int lParam;
    }
    /// <sumary>
    /// Speichert Größe und Position der AppBAr.
    /// </sumary>
    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }
    public partial class Form1 : Form
    {
        const int ABM_NEW         = 0x00000000;
        const int ABM_REMOVE      = 0x00000001;
        const int ABM_SETPOS      = 0x00000003;
        const int ABM_QUERYPOS    = 0x00000002;

        const int ABE_TOP = 1;

        public Form1()
        {
            InitializeComponent();
            FormBorderStyle = FormBorderStyle.SizableToolWindow;
        }
        /// <sumary>
        /// OnLoad wird überschrieben, um die ApplicationBar zu initialisieren.
        /// Dabei wird am oberen Rand des Desktops ein Bereich reserviert, in dem das Fenster dann platziert wird.
        /// </sumary>
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            // Datenstruktur für AppBar erzeugen und initialisieren.
            APPBARDATA abd = new APPBARDATA();
            abd.cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA));
            abd.hWnd = this.Handle;
            abd.uCallbackMessage = RegisterWindowMessage(Guid.NewGuid().ToString()); 

            // AppBar beim System registrieren.
            SHAppBarMessage(ABM_NEW, ref abd);

            // Größe und Position festlegen.
            // In dem Beispiel wird oben am Desktop 100 Pixel Platz reserviert.
            abd.rc = new RECT();
            abd.uEdge = ABE_TOP;
            abd.rc.top = 0;
            abd.rc.left = 0;
            abd.rc.bottom = 100;
            abd.rc.right = SystemInformation.PrimaryMonitorSize.Width;

            // Die Gröse und Position der AppBar prüfen.
            // Wenn diese nicht gültig sind, werden die 
            // korrigierte Werte zurückgegeben.
            SHAppBarMessage(ABM_QUERYPOS, ref abd);
            // Größe und Position der AppBarsetzen
            SHAppBarMessage(ABM_SETPOS, ref abd);
            // Größe und Position des Anwendungsfenster im AppBar Bereich positionieren
            Location = new Point(abd.rc.left, abd.rc.top);
            Size = new Size(abd.rc.right, abd.rc.bottom);
        }

        /// <sumary>
        /// Beim Beenden des Programms wieder aufräumen.
        /// </sumary>
        protected override void OnClosed(EventArgs e)
        {
            APPBARDATA abd = new APPBARDATA();
            abd.cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA));
            abd.hWnd = this.Handle;

            SHAppBarMessage(ABM_REMOVE, ref abd);
            
            base.OnClosed(e);
        }
        [DllImport("shell32.dll")]
        static extern IntPtr SHAppBarMessage(uint dwMessage,
           ref APPBARDATA pData);
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern uint RegisterWindowMessage(string lpString);
    }
}
Abgelegt unter AppBar, Andocken, Docken, Fenster, Rand, Bildschirmrand.

2 Kommentare zum Snippet

Rainbird schrieb am 11/5/2006:
Bei so einem komplexen Snippet, sollten Kommentare und XML-Doku-Tags nicht fehlen.
crokale schrieb am 10/20/2010:
Bei mir wird die Form nicht in dem neuen erzeugtem Bereich angezeigt sondern ist im desktop zu sehe. Wo ran liegt das?
 

Logge dich ein, um hier zu kommentieren!