Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mencipta Borang Tanpa Sempadan Boleh Resizable dan Alih dalam Borang Windows?

Bagaimana untuk Mencipta Borang Tanpa Sempadan Boleh Resizable dan Alih dalam Borang Windows?

Mary-Kate Olsen
Lepaskan: 2025-01-11 13:21:42
asal
586 orang telah melayarinya

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

Buat borang tanpa sempadan yang boleh diubah saiz dan alih dalam Borang Windows

Dalam Windows Forms, borang tanpa sempadan boleh dibuat dengan mudah dengan menetapkan sifat "FormBorderStyle" kepada "Tiada". Walau bagaimanapun, tindakan lalai ini melumpuhkan keupayaan untuk mengubah saiz borang. Untuk mengatasi had ini, kaedah yang lebih maju diperlukan.

Kod berikut menunjukkan penyelesaian tersuai yang bergerak dan mengubah saiz bentuk tanpa sempadan secara serentak:

<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>
Salin selepas log masuk

Penjelasan tentang cara kod berfungsi:

  • Bar tajuk tersuai: OnPaintKaedah yang diganti akan melukis bar biru di bahagian atas borang untuk mensimulasikan bar tajuk.
  • Ubah saiz pemegang: Fungsi DrawSizeGrip melukis pemegang kawalan di penjuru kanan sebelah bawah borang, membenarkan penyeretan untuk mengubah saiz.
  • Acara WM_NCHITTEST: WndProc Gantikan kaedah untuk memintas mesej WM_NCHITTEST untuk mengesan kedudukan kursor tetikus. Jika kursor berada dalam bar tajuk atau pemegang kawalan, kod ujian hit yang sesuai dikembalikan. pos.Y dalam kod hendaklah ditukar kepada pos.X supaya logik dan pastikan kawasan pemegang ubah saiz di sudut kanan bawah dikesan dengan betul.

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Borang Tanpa Sempadan Boleh Resizable dan Alih dalam Borang Windows?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan