Maison >développement back-end >C++ >Comment créer un formulaire sans bordure redimensionnable et mobile dans Windows Forms ?

Comment créer un formulaire sans bordure redimensionnable et mobile dans Windows Forms ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-11 13:21:42657parcourir

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

Créer des formulaires sans bordure redimensionnables et mobiles dans Windows Forms

Dans Windows Forms, des formulaires sans bordure peuvent être facilement créés en définissant la propriété « FormBorderStyle » sur « Aucun ». Toutefois, cette action par défaut désactive la possibilité de redimensionner le formulaire. Pour surmonter cette limitation, des méthodes plus avancées sont nécessaires.

Le code suivant illustre une solution personnalisée qui déplace et redimensionne simultanément un formulaire sans bordure :

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

Explication du fonctionnement du code :

  • Barre de titre personnalisée : OnPaintLa méthode remplacée dessine une barre bleue en haut du formulaire pour simuler une barre de titre.
  • Poignée de redimensionnement : La fonction DrawSizeGrip dessine une poignée de contrôle dans le coin inférieur droit du formulaire, permettant de la faire glisser pour le redimensionner.
  • Événement WM_NCHITTEST : WndProc Méthode de remplacement pour intercepter le message WM_NCHITTEST afin de détecter la position du curseur de la souris. Si le curseur se trouve dans la barre de titre ou dans la poignée de contrôle, le code de test de détection approprié est renvoyé. Le pos.Y dans le code doit être remplacé par pos.X pour être logique et garantir que la zone de poignée de redimensionnement dans le coin inférieur droit est correctement détectée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn