winform自定义窗体边框样式模板(支持四周边框拖拽改变窗体大小,支持鼠标拖动头部移动窗体)

2 篇文章 0 订阅

 winform自己的边框已经过时,但小伙伴们又觉得自定义太过麻烦。本文将手把手教你自定义winform边框样式,并提供源代码链接(可直接作为模板使用)。话不多说,直接上操作步骤。

先上一张完成截图

一:去除winform边框,添加主面板,添加窗体四边(可自定义宽度和颜色,支持拖拽改变窗体大小)

1、去除winform边框:将FormBorderStyle属性设置为none

2、添加主面板:在此面板中,你可以自己添加窗体头(主要包括窗体icon,title,最大最小化按钮,关闭按钮等)

3、在Form.cs文件中,写下下列代码(此节主要添加窗体四边边框,并使其支持拖拽改变窗体大小)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CustomForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitBorder();
        }


        private Point mousePoint = new Point();     //鼠标所在位置(top,left)
        System.Windows.Forms.Label[] labels = new System.Windows.Forms.Label[4];    //上下左右边框集合
        private int lastWidth = 0;                  //上次窗体宽度(改变窗体大小时使用)
        private int lastHeight = 0;                   //上次窗体高度(改变窗体大小时使用)
        /// <summary>
        /// 初始化窗体边框
        /// </summary>
        void InitBorder()
        {

            labels[0] = new System.Windows.Forms.Label();
            labels[1] = new System.Windows.Forms.Label();
            labels[2] = new System.Windows.Forms.Label();
            labels[3] = new System.Windows.Forms.Label();

            labels[0].BackColor = labels[2].BackColor = labels[1].BackColor = labels[3].BackColor = Color.FromArgb(188, 182, 211); //边框颜色

            Controls.Add(labels[0]);
            Controls.Add(labels[1]);
            Controls.Add(labels[2]);
            Controls.Add(labels[3]);

            labels[0].Cursor = labels[2].Cursor = Cursors.SizeWE;
            labels[1].Cursor = labels[3].Cursor = Cursors.SizeNS;

            labels[0].MouseDown += BorderMouseDown;
            labels[1].MouseDown += BorderMouseDown;
            labels[2].MouseDown += BorderMouseDown;
            labels[3].MouseDown += BorderMouseDown;

            labels[0].MouseMove += WMouseMove;
            labels[2].MouseMove += EMouseMove;
            labels[1].MouseMove += NMouseMove;
            labels[3].MouseMove += SMouseMove;

            labels[0].Dock = DockStyle.Left;
            labels[2].Dock = DockStyle.Right;
            labels[1].Dock = DockStyle.Top;
            labels[3].Dock = DockStyle.Bottom;

            UpdateBorder();
        }

        /// <summary>
        /// 边框鼠标按压事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BorderMouseDown(object sender, MouseEventArgs e)
        {
            lastWidth = Width;
            lastHeight = Height;
            this.mousePoint.X = MousePosition.X;
            this.mousePoint.Y = MousePosition.Y;
        }

        /// <summary>
        /// 左边框拖动事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <summary>
        /// 上边框拖动事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void WMouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (Width != MinimumSize.Width)
                {
                    Left = MousePosition.X;
                }
                this.Width = lastWidth - (Control.MousePosition.X - mousePoint.X);
            }

        }
        /// <summary>
        /// 右边框边框拖动事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EMouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.Width = lastWidth + (Control.MousePosition.X - mousePoint.X);
            }

        }
        private void NMouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (Height != MinimumSize.Height)
                {
                    Top = MousePosition.Y;
                }
                this.Height = lastHeight - (Control.MousePosition.Y - mousePoint.Y);
            }

        }
        /// <summary>
        /// 下边框拖动事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SMouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.Height = lastHeight + (Control.MousePosition.Y - mousePoint.Y);
            }

        }

        /// <summary>
        /// 自定义给窗体添加边框
        /// </summary>
        private void UpdateBorder()
        {
            labels[1].Height = labels[3].Height =2;
            labels[0].Width = labels[2].Width = 2;
        }
    }
}

成功截图:

初始窗体

改变大小后窗体

二、添加窗体header和content

布局结构

页面效果:

这部分功能对应代码 (与上步代码放在一起即可正常使用)

        /// <summary>
        /// 最小化按钮点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_minimize_Click(object sender, EventArgs e)
        {
            WindowState = FormWindowState.Minimized;
        }

        /// <summary>
        /// 关闭按钮点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_close_Click(object sender, EventArgs e)
        {
            Close();
        }



        /// <summary>
        /// 标题块按压事件(记住鼠标的位置)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pnl_titile_MouseDown(object sender, MouseEventArgs e)
        {
            this.mousePoint.X = e.X;
            this.mousePoint.Y = e.Y;

        }
        /// <summary>
        /// 鼠标移动事件(根据鼠标按下的位置和鼠标移动后的位置 移动窗体)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pnl_titile_MouseMove(object sender, MouseEventArgs e)
        {

            if (e.Button == MouseButtons.Left)
            {
                this.Top = Control.MousePosition.Y - mousePoint.Y;
                this.Left = Control.MousePosition.X - mousePoint.X;
            }
        }

各部分支持功能

至此,窗体自定义边框模板已完成。有需要的话,可以点击下面的链接获取源代码,如果觉得有帮助,请给予点赞或评论,转载的话注意标明出处,谢谢(~ ̄▽ ̄)~

源代码链接

链接:https://pan.baidu.com/s/1aLN6JtZkq_qrkI24a5qvKw
提取码:89gn

#region 改变窗口样式         #if !DEBUG         [DllImport ("User32.dll")]         private static extern IntPtr GetWindowDC(IntPtr hwnd);         [DllImport ("User32.dll")]         private static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);         protected override void WndProc(ref Message m)         ...{                      base.WndProc(ref m);                          switch(m.Msg)                          ...{                     case 0x86://WM_NCACTIVATE                         goto case 0x85;                     case 0x85://WM_NCPAINT                     ...{                                                             IntPtr hDC = GetWindowDC(m.HWnd);                              //把DC转换为.NET的Graphics就可以很方便地使用Framework提供的绘图功能了                         Graphics gs = Graphics.FromHdc(hDC);                         处理色彩#region 处理色彩                         int ibox = 1;                         if (this.MaximizeBox) ibox ++;                         if (this.MinimizeBox) ibox ++;                         //得到相关背景图片                         Image imgpm = Image.FromFile( Application.StartupPath+ @"Main.bmp");
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值