分享好友 资讯首页 频道列表

c#如何手动改变自制无边框Windows窗体的大小?

2025-05-29 09:531580

当用户去除窗体边框时,自行设置窗体外观,用户就不能对窗体的大小进行随意改变了,下面,济南网站建设小编就来为大家介绍,怎么在c#编程语言中手动改天无边框窗体的大小,有需要的朋友可以过来参考一下。


关键代码:


using System;

using System.Drawing;

using System.Windows.Forms;


public partial class FrmMain : Form

{

    private const int RESIZE_HANDLE_SIZE = 10;

    private Timer resizeTimer;

    private Size targetSize;

    

    public FrmMain()

    {

        InitializeComponent();

        this.FormBorderStyle = FormBorderStyle.None;

        this.MinimumSize = new Size(400, 300);

        

        resizeTimer = new Timer();

        resizeTimer.Interval = 10;

        resizeTimer.Tick += ResizeTimer_Tick;

        

        // 添加测试按钮

        Button btnMax = new Button();

        btnMax.Text = "最大化";

        btnMax.Location = new Point(10, 10);

        btnMax.Click += BtnMax_Click;

        this.Controls.Add(btnMax);

        

        Button btnRestore = new Button();

        btnRestore.Text = "恢复";

        btnRestore.Location = new Point(120, 10);

        btnRestore.Click += BtnRestore_Click;

        this.Controls.Add(btnRestore);

    }

    

    private void BtnMax_Click(object sender, EventArgs e)

    {

        AnimateResize(Screen.PrimaryScreen.WorkingArea.Size);

    }

    

    private void BtnRestore_Click(object sender, EventArgs e)

    {

        AnimateResize(new Size(800, 600));

    }

    

    private void ResizeTimer_Tick(object sender, EventArgs e)

    {

        Size current = this.Size;

        int step = 10;

        

        if (Math.Abs(current.Width - targetSize.Width) < step && 

            Math.Abs(current.Height - targetSize.Height) < step)

        {

            this.Size = targetSize;

            resizeTimer.Stop();

        }

        else

        {

            int newWidth = current.Width + Math.Sign(targetSize.Width - current.Width) * step;

            int newHeight = current.Height + Math.Sign(targetSize.Height - current.Height) * step;

            this.Size = new Size(newWidth, newHeight);

        }

    }

    

    private void AnimateResize(Size newSize)

    {

        targetSize = newSize;

        resizeTimer.Start();

    }

    

    protected override void WndProc(ref Message m)

    {

        const int WM_NCHITTEST = 0x0084;

        const int HTLEFT = 10;

        const int HTRIGHT = 11;

        const int HTTOP = 12;

        const int HTTOPLEFT = 13;

        const int HTTOPRIGHT = 14;

        const int HTBOTTOM = 15;

        const int HTBOTTOMLEFT = 16;

        const int HTBOTTOMRIGHT = 17;

        

        if (m.Msg == WM_NCHITTEST)

        {

            Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);

            pos = this.PointToClient(pos);

            

            if (pos.X < RESIZE_HANDLE_SIZE && pos.Y < RESIZE_HANDLE_SIZE)

                m.Result = (IntPtr)HTTOPLEFT;

            else if (pos.X >= this.ClientSize.Width - RESIZE_HANDLE_SIZE && pos.Y < RESIZE_HANDLE_SIZE)

                m.Result = (IntPtr)HTTOPRIGHT;

            else if (pos.X < RESIZE_HANDLE_SIZE && pos.Y >= this.ClientSize.Height - RESIZE_HANDLE_SIZE)

                m.Result = (IntPtr)HTBOTTOMLEFT;

            else if (pos.X >= this.ClientSize.Width - RESIZE_HANDLE_SIZE && pos.Y >= this.ClientSize.Height - RESIZE_HANDLE_SIZE)

                m.Result = (IntPtr)HTBOTTOMRIGHT;

            else if (pos.X < RESIZE_HANDLE_SIZE)

                m.Result = (IntPtr)HTLEFT;

            else if (pos.X >= this.ClientSize.Width - RESIZE_HANDLE_SIZE)

                m.Result = (IntPtr)HTRIGHT;

            else if (pos.Y < RESIZE_HANDLE_SIZE)

                m.Result = (IntPtr)HTTOP;

            else if (pos.Y >= this.ClientSize.Height - RESIZE_HANDLE_SIZE)

                m.Result = (IntPtr)HTBOTTOM;

            else

                m.Result = (IntPtr)HTCLIENT;

            return;

        }

        

        base.WndProc(ref m);

    }

    

    protected override void onPaint(PaintEventArgs e)

    {

        base.onPaint(e);

        ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor, 

            this.ClientSize.Width - RESIZE_HANDLE_SIZE, 

            this.ClientSize.Height - RESIZE_HANDLE_SIZE, 

            RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE);

    }

}


反对 0
举报 0
收藏 0
打赏 0
评论 0
JavaScript求任意一个整数的平方?
求一个整数的平方,我们可以将其理解为是一个整数与其自身相乘的结果,如果,我们想要在我们开发的网站页面中实现该效果,我们可以通过多种方法来解决这个需求,接下来,济

0评论2025-09-02143

JavaScript通过while求1-100间所有数的和?
JavaScript编程语言有多种方法可以帮助我们实现,求1-100间所有数的和,接下来,济宁网站建设小编就来为大家介绍其中的一种,通过JavaScript编程语言中的while循环语句来实

0评论2025-08-26145

JavaScript 输出1-100间所有偶数
在网页中输出1-100间的所有偶数,首先,我们要明白什么是偶数,如何判断某个整数是不是整数,一个整数可以被2整除,那么这个整数就是偶数。,下面,济宁网站建设小编就来和

0评论2025-08-15152

JavaScript while输出1-100之间所有的整数
想要在网站页面中输出1到100之间的所有整数,有多种方法可以实现,下面,济宁网站建设小编就来为大家分享其中中的一种,通过JavaScript编程语言中while循环语句来解决该问

0评论2025-08-13141