首頁 >後端開發 >C++ >如何在 Windows 窗體中建立可調整大小的無邊框窗體?

如何在 Windows 窗體中建立可調整大小的無邊框窗體?

Susan Sarandon
Susan Sarandon原創
2025-01-11 13:01:40413瀏覽

How to Create Resizable Borderless Forms in Windows Forms?

打造無邊框窗體:兼顧美觀與可調整大小

在設計自訂窗體介面時,開發者通常傾向於簡潔的無邊框外觀。雖然 Windows 提供了一種透過 "FormBorderStyle" 屬性移除預設邊框的簡單方法,但這會導致窗體無法調整大小。

為了克服這個限制,讓我們探索一個全面的程式碼解決方案,它允許同時實現無邊框的美感和無縫調整大小功能:

<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);
    }

    // 拦截 WM_NCHITTEST 消息以实现自定义调整大小行为
    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>

透過在您的無邊框窗體中實現此程式碼,您可以有效地啟用調整大小功能,同時保持所需的美觀效果。模擬的標題列和自訂抓取指示器提供了直覺且功能齊全的使用者體驗,使用戶能夠輕鬆調整窗體大小。

以上是如何在 Windows 窗體中建立可調整大小的無邊框窗體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn