Maison >développement back-end >C++ >Comment redimensionner un formulaire Windows sans bordure ?

Comment redimensionner un formulaire Windows sans bordure ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-11 13:16:42208parcourir

How to Resize a Borderless Windows Form?

Gestion du redimensionnement des formulaires sans bordure

Déplacer un formulaire Windows sans bordure est facile, mais redimensionner un tel formulaire présente un défi unique. En définissant la propriété "FormBorderStyle" sur "Aucun", la bordure par défaut disparaît, rendant le redimensionnement impossible.

Solution :

Pour surmonter ce problème, utilisez un contrôle dessiné personnalisé dans le coin inférieur droit du formulaire, simulant une poignée de redimensionnement. De plus, implémentez la méthode « WndProc » pour intercepter le message « WM_NCHITTEST » et déterminer la position du curseur par rapport au formulaire. Si le curseur se trouve à l'intérieur de la barre de titre ou de la poignée de la simulation, la valeur "m.Result" est mise à jour en conséquence.

Voici un exemple d'extrait de code :

<code class="language-c#">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>

Avec ces modifications, votre fenêtre sans bordure peut désormais être facilement déplacée et redimensionné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