Heim > Backend-Entwicklung > C++ > Wie erstelle ich in Windows Forms ein in der Größe veränderbares und verschiebbares randloses Formular?

Wie erstelle ich in Windows Forms ein in der Größe veränderbares und verschiebbares randloses Formular?

Mary-Kate Olsen
Freigeben: 2025-01-11 13:21:42
Original
635 Leute haben es durchsucht

How to Create a Resizable and Movable Borderless Form in Windows Forms?

Erstellen Sie in Windows Forms skalierbare und verschiebbare randlose Formulare

In Windows Forms können randlose Formulare einfach erstellt werden, indem die Eigenschaft „FormBorderStyle“ auf „None“ gesetzt wird. Diese Standardaktion deaktiviert jedoch die Möglichkeit, die Größe des Formulars zu ändern. Um diese Einschränkung zu überwinden, sind fortschrittlichere Methoden erforderlich.

Der folgende Code zeigt eine benutzerdefinierte Lösung, die ein randloses Formular gleichzeitig verschiebt und seine Größe ändert:

<code class="language-csharp">public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.FormBorderStyle = FormBorderStyle.None;
        this.DoubleBuffered = true;
        this.SetStyle(ControlStyles.ResizeRedraw, true);
    }

    private const int cGrip = 16;      // 调整大小控制柄大小
    private const int cCaption = 32;   // 标题栏高度

    protected override void OnPaint(PaintEventArgs e)
    {
        // 在右下角绘制调整大小控制柄
        Rectangle rc = new Rectangle(this.ClientSize.Width - cGrip, this.ClientSize.Height - cGrip, cGrip, cGrip);
        ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor, rc);

        // 绘制模拟标题栏
        rc = new Rectangle(0, 0, this.ClientSize.Width, cCaption);
        e.Graphics.FillRectangle(Brushes.DarkBlue, rc);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x84) {  // 捕获WM_NCHITTEST消息
            Point pos = new Point(m.LParam.ToInt32());
            pos = this.PointToClient(pos);
            if (pos.X >= this.ClientSize.Width - cGrip && pos.Y >= this.ClientSize.Height - cGrip)
            {
                m.Result = (IntPtr)17; // HTBOTTOMRIGHT
                return;
            }
        }
        base.WndProc(ref m);
    }
}</code>
Nach dem Login kopieren

Erklärung zur Funktionsweise des Codes:

  • Benutzerdefinierte Titelleiste: OnPaintDie überschriebene Methode zeichnet oben im Formular eine blaue Leiste, um eine Titelleiste zu simulieren.
  • Griff zur Größenänderung: Die Funktion DrawSizeGrip zeichnet einen Steuerpunkt in der unteren rechten Ecke des Formulars, der das Ziehen zur Größenänderung ermöglicht.
  • WM_NCHITTEST-Ereignis: WndProc Override-Methode zum Abfangen der WM_NCHITTEST-Nachricht, um die Position des Mauszeigers zu erkennen. Befindet sich der Cursor innerhalb der Titelleiste oder des Steuerpunkts, wird der entsprechende Treffertestcode zurückgegeben. Das pos.Y im Code sollte in pos.X geändert werden, um logisch zu sein und sicherzustellen, dass der Größenänderungsgriffbereich in der unteren rechten Ecke korrekt erkannt wird.

Das obige ist der detaillierte Inhalt vonWie erstelle ich in Windows Forms ein in der Größe veränderbares und verschiebbares randloses Formular?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage