C#实现自定义的窗口最大化、最小化和关闭按钮功能

 更新时间:2026年01月20日 09:42:36   作者:工业程序猿老赵  
在 C# 中实现自定义的窗口最大化、最小化和关闭按钮,替代系统默认的窗口控件,本文会详细讲解实现步骤和完整代码示例,需要的朋友可以参考下

一、核心实现思路

  1. 移除系统默认窗口边框​:先隐藏窗体自带的标题栏和边框,避免与自定义按钮冲突。
  2. 添加自定义控件​:使用Button控件(或PictureBox等)制作最大化、最小化、关闭按钮。
  3. 绑定按钮点击事件​:为每个按钮绑定对应的点击事件,调用窗体的内置方法实现窗口状态切换和关闭。
  4. 补充窗口拖动功能​:移除系统标题栏后,窗体无法拖动,需手动实现鼠标拖动窗体的功能。
  5. ​**优化体验(可选)**​:添加按钮鼠标悬浮 / 离开效果,提升交互感。

二、完整实现代码(WinForms 示例)

步骤 1:窗体设计(Form1)

先在 WinForms 窗体中添加 3 个Button控件,分别命名为:

  • btnMin(最小化按钮)
  • btnMax(最大化 / 还原按钮)
  • btnClose(关闭按钮)

步骤 2:完整代码

using System;
using System.Drawing;
using System.Windows.Forms;

namespace CustomWindowButtons
{
    public partial class Form1 : Form
    {
        // 记录鼠标拖动时的起始位置
        private Point mouseDownPoint = Point.Empty;

        public Form1()
        {
            InitializeComponent();
            // 窗体初始化设置
            InitFormSettings();
            // 绑定按钮事件
            BindButtonEvents();
        }

        /// <summary>
        /// 初始化窗体设置(移除系统边框、设置窗体样式)
        /// </summary>
        private void InitFormSettings()
        {
            // 移除系统默认窗口边框和标题栏
            this.FormBorderStyle = FormBorderStyle.None;
            // 设置窗体默认大小
            this.Size = new Size(800, 600);
            // 居中显示
            this.StartPosition = FormStartPosition.CenterScreen;

            // 自定义按钮样式初始化(可选,简化外观)
            btnMin.Size = new Size(40, 30);
            btnMax.Size = new Size(40, 30);
            btnClose.Size = new Size(40, 30);
            btnMin.Text = "—";
            btnMax.Text = "□";
            btnClose.Text = "×";
            btnMin.Font = new Font("Arial", 12, FontStyle.Bold);
            btnMax.Font = new Font("Arial", 12, FontStyle.Bold);
            btnClose.Font = new Font("Arial", 12, FontStyle.Bold);

            // 排列按钮(窗体右上角)
            btnClose.Location = new Point(this.Width - 45, 5);
            btnMax.Location = new Point(this.Width - 90, 5);
            btnMin.Location = new Point(this.Width - 135, 5);
        }

        /// <summary>
        /// 绑定按钮的点击事件和鼠标悬浮/离开事件
        /// </summary>
        private void BindButtonEvents()
        {
            // 最小化按钮点击事件
            btnMin.Click += BtnMin_Click;
            // 最大化/还原按钮点击事件
            btnMax.Click += BtnMax_Click;
            // 关闭按钮点击事件
            btnClose.Click += BtnClose_Click;

            // 可选:添加按钮鼠标悬浮效果,提升交互体验
            btnMin.MouseEnter += Button_MouseEnter;
            btnMax.MouseEnter += Button_MouseEnter;
            btnClose.MouseEnter += Button_MouseEnter;
            btnMin.MouseLeave += Button_MouseLeave;
            btnMax.MouseLeave += Button_MouseLeave;
            btnClose.MouseLeave += Button_MouseLeave;
        }

        #region 按钮事件处理
        /// <summary>
        /// 最小化按钮点击事件
        /// </summary>
        private void BtnMin_Click(object sender, EventArgs e)
        {
            // 调用窗体内置方法,将窗口最小化到任务栏
            this.WindowState = FormWindowState.Minimized;
        }

        /// <summary>
        /// 最大化/还原按钮点击事件
        /// </summary>
        private void BtnMax_Click(object sender, EventArgs e)
        {
            // 判断当前窗口状态,切换最大化/还原
            if (this.WindowState == FormWindowState.Maximized)
            {
                // 还原窗口默认大小
                this.WindowState = FormWindowState.Normal;
                btnMax.Text = "□"; // 更新按钮文本
            }
            else
            {
                // 最大化窗口
                this.WindowState = FormWindowState.Maximized;
                btnMax.Text = "■"; // 更新按钮文本
            }

            // 窗口状态变化后,重新调整按钮位置(避免最大化后按钮偏移)
            AdjustButtonPosition();
        }

        /// <summary>
        /// 关闭按钮点击事件
        /// </summary>
        private void BtnClose_Click(object sender, EventArgs e)
        {
            // 调用窗体内置方法,关闭当前窗体
            this.Close();
        }

        /// <summary>
        /// 鼠标悬浮按钮时,更改按钮背景色
        /// </summary>
        private void Button_MouseEnter(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            if (btn != null)
            {
                // 关闭按钮悬浮时设置红色背景,其他按钮设置浅灰色
                btn.BackColor = btn == btnClose ? Color.LightCoral : Color.LightGray;
            }
        }

        /// <summary>
        /// 鼠标离开按钮时,恢复按钮默认背景色
        /// </summary>
        private void Button_MouseLeave(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            if (btn != null)
            {
                btn.BackColor = SystemColors.Control;
            }
        }
        #endregion

        #region 辅助方法
        /// <summary>
        /// 调整按钮位置(适配窗口最大化/还原状态)
        /// </summary>
        private void AdjustButtonPosition()
        {
            btnClose.Location = new Point(this.Width - 45, 5);
            btnMax.Location = new Point(this.Width - 90, 5);
            btnMin.Location = new Point(this.Width - 135, 5);
        }

        /// <summary>
        /// 实现窗体拖动功能(重写鼠标按下/移动/松开事件)
        /// </summary>
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            // 记录鼠标按下时的坐标(相对于窗体)
            if (e.Button == MouseButtons.Left)
            {
                mouseDownPoint = new Point(e.X, e.Y);
            }
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
            // 鼠标左键按住且起始位置有效时,拖动窗体
            if (e.Button == MouseButtons.Left && mouseDownPoint != Point.Empty)
            {
                // 计算窗体新位置
                this.Location = new Point(
                    this.Left + (e.X - mouseDownPoint.X),
                    this.Top + (e.Y - mouseDownPoint.Y)
                );
            }
        }

        protected override void OnMouseUp(MouseEventArgs e)
        {
            base.OnMouseUp(e);
            // 鼠标松开后,重置起始位置
            mouseDownPoint = Point.Empty;
        }
        #endregion

        /// <summary>
        /// 窗口大小改变时,重新调整按钮位置(适配手动拉伸窗口)
        /// </summary>
        protected override void OnResize(EventArgs e)
        {
            base.OnResize(e);
            if (this.WindowState != FormWindowState.Minimized)
            {
                AdjustButtonPosition();
            }
        }
    }
}

三、关键知识点解析

  1. 移除系统窗口边框​:通过设置FormBorderStyle = FormBorderStyle.None,隐藏窗体自带的标题栏、边框和系统按钮,为自定义按钮腾出空间。
  2. 窗口状态控制​:
    • 最小化:this.WindowState = FormWindowState.Minimized
    • 最大化:this.WindowState = FormWindowState.Maximized
    • 还原:this.WindowState = FormWindowState.Normal
  3. 窗体拖动实现​:通过重写窗体的OnMouseDownOnMouseMoveOnMouseUp方法,记录鼠标按下时的坐标,移动时计算窗体偏移量,实现手动拖动窗体的功能(弥补移除系统标题栏后的缺失功能)。
  4. 按钮状态适配​:窗口最大化 / 还原后,通过AdjustButtonPosition方法重新调整按钮位置,避免按钮偏移;同时更新最大化按钮的文本,提升用户辨识度。

四、扩展优化建议

  1. 使用 PictureBox 实现更美观的按钮​:将Button替换为PictureBox,加载自定义的图标(最大化、最小化、关闭图标),实现更精致的界面效果。
  2. 添加窗口大小限制​:设置this.MinimumSize = new Size(400, 300),避免窗口被拉伸到过小。
  3. 添加关闭确认提示​:在BtnClose_Click事件中添加MessageBox.Show,确认用户是否要关闭窗口,防止误操作。
  4. 适配高分屏​:处理窗体缩放问题,避免按钮在高分屏上显示异常。

总结

  1. 实现自定义窗口按钮的核心是​隐藏系统边框 + 绑定控件事件 + 调用窗体内置状态方法​。
  2. 关键步骤:移除FormBorderStyle、绑定Click事件、实现窗体拖动、适配窗口状态变化。
  3. 上述代码可直接在 WinForms 项目中运行,修改控件名称后即可快速集成到你的项目中。

以上就是C#实现自定义的窗口最大化、最小化和关闭按钮功能的详细内容,更多关于C#窗口最大化、最小化和关闭按钮的资料请关注脚本之家其它相关文章!

相关文章

  • 详解C#异步多线程使用中的常见问题

    详解C#异步多线程使用中的常见问题

    本文主要介绍了C#异步多线程使用中的常见问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C#实现餐饮管理系统

    C#实现餐饮管理系统

    这篇文章主要为大家详细介绍了C#实现餐饮管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 详解如何在C#/.NET Core中使用责任链模式

    详解如何在C#/.NET Core中使用责任链模式

    这篇文章主要介绍了详解如何在C#/.NET Core中使用责任链模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 实例讲解C#中的职责链模式

    实例讲解C#中的职责链模式

    这篇文章主要介绍了C#中的职责链模式的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C#中winform窗体实现注册/登录功能实例(DBHelper类)

    C#中winform窗体实现注册/登录功能实例(DBHelper类)

    在编写项目时,编写了一部分关于登录页面的一些代码,下面这篇文章主要给大家介绍了关于C#中winform窗体实现注册/登录功能(DBHelper类)的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • C#实例化和静态类对象调用对比

    C#实例化和静态类对象调用对比

    这篇文章主要介绍了C#实例化和静态类对象调用对比,什么时候用实例化对象,什么时候用静态类对象,内存和生命周期又是如何,框架本身的回收机制是什么,下文详细解说需要的小伙伴可以参考一下
    2022-04-04
  • C#使用TextBox作数据输入方法

    C#使用TextBox作数据输入方法

    笔者最近需要上位机与下位机进行数据交互,在广泛参考大佬的资料后,较为完善地使用Textbox控件进行数据输入的功能。感兴趣的可以了解一下
    2021-06-06
  • Unity实现画线条功能

    Unity实现画线条功能

    这篇文章主要为大家详细介绍了Unity实现画线条功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C#如何读写应用程序配置文件App.exe.config,并在界面上显示

    C#如何读写应用程序配置文件App.exe.config,并在界面上显示

    这篇文章主要介绍了C#如何读写应用程序配置文件App.exe.config,并在界面上显示问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 基于C#中XmlReader读取Xml的深入分析

    基于C#中XmlReader读取Xml的深入分析

    本篇文章是对C#中XmlReader读取Xml进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论