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;
}
}
各部分支持功能
至此,窗体自定义边框模板已完成。有需要的话,可以点击下面的链接获取源代码,如果觉得有帮助,请给予点赞或评论,转载的话注意标明出处,谢谢(~ ̄▽ ̄)~