C#自定义最大化、最小化和关闭按钮

目录

1.资源文件

2.读取资源文件中的图片

3.WindowState属性

4. 示例


        用户在制作应用程序时,为了使用户界面更加美观,一般都自己设计窗体的外观,以及窗体的最大化、最小化和关闭按钮。本例通过资源文件来存储窗体的外观,以及最大化、最小化和关闭按钮的图片,再通过鼠标移入、移出事件来实现按钮的动态效果。

        本实例首先使用资源文件来存储窗体的外观、“最大化”、“最小化”和“关闭”按钮的图片,然后使用窗体的WindowState属性实现窗体的最大化、最小化和还原操作。

1.资源文件

        在加载图片时,如果是以本地资源进行加载,那么在运行可执行文件时,必须在当前目录下存放指定的图片,这样会给用户带来不必要的麻烦。为了解决这一问题,本实例利用资源文件来存储相关的图片。

        将图片存入资源文件中将图片存入资源文件中的步骤如下:

  • 在“解决方案资源管理器”面板中打开Properties中的Resources.resx文件。
  • 在“添加资源”下拉列表框中选择“添加现有文件”选项,弹出“将现有文件添加到资源中”窗体,在该窗体中将指定的图片添加到资源文件中。

2.读取资源文件中的图片

        读取资源文件中的图片主要是用Properties命名空间下的Resources资源类。实现代码如下:pictureBox.Image =Properties.Resources.最大化按钮;将图片添加到Resources.resx文件后,必须对整个项目进行保存,否则无法在Resources资源类中调用已添加的图片。

3.WindowState属性

        该属性用于获取或设置窗体的窗口状态。语法格式如下:

public FormWindowState WindowState {get;set;}
参数说明
属性值:FormWindowState枚举值之一,表示窗体的窗口状态。

        FormWindowState枚举值及说明如表:

枚   举 值

描   述

Maximized

最大化的窗口

Minimized

最小化的窗口

Normal

默认大小的窗口

4. 示例

// 自定义最小化、最大化、关闭窗体的按钮
namespace _163_2
{
    public partial class Form1 : Form
    {
        private Panel? panel1;
        private Panel? panel2;
        private PictureBox? pictureBox_Close;
        private PictureBox? pictureBox_Maximize;
        private PictureBox? pictureBox_Minimize;

        public Form1()
        {
            InitializeComponent();
            StartPosition = FormStartPosition.CenterScreen;
            Load += Form1_Load;
        }

        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // pictureBox_Close
            // 
            pictureBox_Close = new PictureBox
            {
                Anchor = AnchorStyles.Top | AnchorStyles.Right,
                Image = Properties.Resources.关闭按钮,
                Location = new Point(251, 10),
                Name = "pictureBox_Close",
                Size = new Size(20, 20),
                SizeMode = PictureBoxSizeMode.StretchImage,
                TabIndex = 2,
                TabStop = false,
                Tag = "2"
            };
            pictureBox_Close.Click += PictureBox_Close_Click!;
            pictureBox_Close.MouseEnter += PictureBox_Close_MouseEnter!;
            pictureBox_Close.MouseLeave += PictureBox_Close_MouseLeave!;
            // 
            // pictureBox_Maximize
            // 
            pictureBox_Maximize = new PictureBox
            {
                Anchor = AnchorStyles.Top | AnchorStyles.Right,
                Image = Properties.Resources.最大化按钮,
                Location = new Point(219, 10),
                Name = "pictureBox_Maximize",
                Size = new Size(20, 20),
                SizeMode = PictureBoxSizeMode.StretchImage,
                TabIndex = 1,
                TabStop = false,
                Tag = "1"
            };
            pictureBox_Maximize.Click += PictureBox_Close_Click!;
            pictureBox_Maximize.MouseEnter += PictureBox_Close_MouseEnter!;
            pictureBox_Maximize.MouseLeave += PictureBox_Close_MouseLeave!;
            // 
            // pictureBox_Minimize
            // 
            pictureBox_Minimize = new PictureBox
            {
                Anchor = AnchorStyles.Top | AnchorStyles.Right,
                Image = Properties.Resources.最小化按钮,
                Location = new Point(187, 10),
                Name = "pictureBox_Minimize",
                Size = new Size(20, 20),
                SizeMode = PictureBoxSizeMode.StretchImage,
                TabIndex = 0,
                TabStop = false,
                Tag = "0"
            };
            pictureBox_Minimize.Click += PictureBox_Close_Click!;
            pictureBox_Minimize.MouseEnter += PictureBox_Close_MouseEnter!;
            pictureBox_Minimize.MouseLeave += PictureBox_Close_MouseLeave!;

            // 
            // panel1
            // 
            panel1 = new Panel
            {
                BackgroundImage = Properties.Resources.登录界面标题,
                BackgroundImageLayout = ImageLayout.Stretch,
                Dock = DockStyle.Top,
                Location = new Point(0, 0),
                Name = "panel1",
                Size = new Size(284, 38),
                TabIndex = 0
            };
            panel1.Controls.Add(pictureBox_Close);
            panel1.Controls.Add(pictureBox_Maximize);
            panel1.Controls.Add(pictureBox_Minimize);
            panel1.SuspendLayout();

            // 
            // panel2
            // 
            panel2 = new Panel
            {
                BackgroundImage = Properties.Resources.登录界面下面,
                BackgroundImageLayout = ImageLayout.Stretch,
                Dock = DockStyle.Fill,
                Location = new Point(0, 38),
                Name = "panel2",
                Size = new Size(284, 162),
                TabIndex = 0
            };
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(7F, 17F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(284, 200);
            Controls.Add(panel2);
            Controls.Add(panel1);
            FormBorderStyle = FormBorderStyle.None;
            Name = "Form1";
            Text = "Form1";
            panel1.ResumeLayout(false);
        }

        #region  设置窗体的最大化、最小化和关闭按钮的单击事件
        /// <summary>
        /// 设置窗体的最大化、最小化和关闭按钮的单击事件
        /// </summary>
        /// <param Form_Tem="Form">窗体</param>
        /// <param Tag="int">标识</param>
        public static void FormClickMeans(Form Form_Tem, int Tag)
        {
            switch (Tag)//窗体的操作样式
            {
                case 0://窗体最小化
                    Form_Tem.WindowState = FormWindowState.Minimized;//窗体最小化
                    break;
                case 1://窗体最大化和还原的切换
                    {
                        if (Form_Tem.WindowState == FormWindowState.Maximized)//如果窗体当前是最大化
                            Form_Tem.WindowState = FormWindowState.Normal;//还原窗体大小
                        else
                            Form_Tem.WindowState = FormWindowState.Maximized;//窗体最大化
                        break;
                    }
                case 2:	//关闭窗体
                    Form_Tem.Close();
                    break;
            }
        }

        #endregion

        #region  控制图片的切换状态
        /// <summary>
        /// 控制图片的切换状态
        /// </summary>
        /// <param sender =" object ">要改变图片的对象</param>
        /// <param Tag="int">控件标识</param>
        /// <param ns="int">移出移入标识</param>
        private static PictureBox tem_PictB = new(); //实例化PictureBox控件
        public static PictureBox Tem_PictB { get => tem_PictB; set => tem_PictB = value; }

        public static void ImageSwitch(object sender, int Tag, int MouseState)
        {
            Tem_PictB = (PictureBox)sender;
            switch (Tag)//获取标识
            {
                case 0://当前为最小化按钮
                    {
                        Tem_PictB.Image = null;//清空图片
                        if (MouseState == 0)//鼠标移入
                            Tem_PictB.Image = Properties.Resources.最小化变色;
                        if (MouseState == 1)//鼠标移出
                            Tem_PictB.Image = Properties.Resources.最小化按钮;
                        break;
                    }
                case 1://最大化按钮
                    {
                        Tem_PictB.Image = null;
                        if (MouseState == 0)
                            Tem_PictB.Image = Properties.Resources.最大化变色;
                        if (MouseState == 1)
                            Tem_PictB.Image = Properties.Resources.最大化按钮;
                        break;
                    }
                case 2://关闭按钮
                    {
                        Tem_PictB.Image = null;
                        if (MouseState == 0)
                            Tem_PictB.Image = Properties.Resources.关闭变色;
                        if (MouseState == 1)
                            Tem_PictB.Image = Properties.Resources.关闭按钮;
                        break;
                    }
                default:
                    break;
            }
        }
        #endregion

        private void PictureBox_Close_Click(object sender, EventArgs e)
        {
            FormClickMeans(this, Convert.ToInt16(((PictureBox)sender).Tag!.ToString()));//设置鼠标单击时按钮的图片
        }

        private void PictureBox_Close_MouseEnter(object sender, EventArgs e)
        {
            ImageSwitch(sender, Convert.ToInt16(((PictureBox)sender).Tag!.ToString()), 0);//设置鼠标移入后按钮的图片
        }

        private void PictureBox_Close_MouseLeave(object sender, EventArgs e)
        {
            ImageSwitch(sender, Convert.ToInt16(((PictureBox)sender).Tag!.ToString()), 1);//设置鼠标移出后按钮的图片
        }
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/498693.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】中介者模式的应用

文章目录 1.概述2.中介者模式的适用场景2.1.用户界面事件2.2.分布式架构多模块通信 3.总结 1.概述 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;它用于解决对象间复杂、过度耦合的问题。当多个对象&#xff08;一般是两个以上的对象&…

腾讯云邮件推送功能有哪些?如何有效使用?

腾讯云邮件推送如何设置&#xff1f;怎么用邮件推送做高效营销&#xff1f; 腾讯云作为业界领先的云服务提供商&#xff0c;其邮件推送功能在便捷性、稳定性和安全性上都有着出色的表现。那么&#xff0c;腾讯云邮件推送功能究竟有哪些呢&#xff1f;让AokSend来探个究竟。 腾…

map与set容器常见操作详解(含示例代码及注意事项)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

类与对象中C++

加油&#xff01;&#xff01;&#xff01; 文章目录 前言 一、类的6个默认成员函数 ​编辑 二、构造函数 1.概念 三、析构函数 1.概念 2.特性 四、拷贝构造函数 1.概念 2.特征 拷贝构造函数典型调用场景 五、赋值运算符重载 1.运算符重载 2.赋值运算符重载 赋值运算符重载格式…

【Qt】:坐标

坐标 一.常用快捷键二.使用帮助文档三.Qt坐标体系1.理论2.代码 一.常用快捷键 注释&#xff1a;ctrl / • 运⾏&#xff1a;ctrl R • 编译&#xff1a;ctrl B • 字体缩放&#xff1a;ctrl ⿏标滑轮 • 查找&#xff1a;ctrl F 比特就业课 • 整⾏移动&#xff1a;ctrl …

【Linux】体验一款开源的Linux服务器运维管理工具

今天为大家介绍一款开源的 Linux 服务器运维管理工具 - 1panel。 一、安装 根据官方那个提供的在线文档&#xff0c;这款工具的安装需要执行在线安装&#xff0c; # Redhat / CentOScurl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start…

.NET CORE使用Redis分布式锁续命(续期)问题

结合上一期 .NET CORE 分布式事务(三) DTM实现Saga及高并发下的解决方案(.NET CORE 分布式事务(三) DTM实现Saga及高并发下的解决方案-CSDN博客)。有的小伙伴私信说如果锁内锁定的程序或者资源未在上锁时间内执行完&#xff0c;造成的使用资源冲突&#xff0c;需要如何解决。本…

原创度检测工具分享,文章质量检测方便又简单

文章检测有利于我们了解文章内容的质量高低&#xff0c;而在以往我们检测文章只能依靠手动去检测&#xff0c;这是相当消耗工作时间的&#xff0c;但是在原创度检测工具出来之后&#xff0c;很多人开始检测文章质量就改用原创度检测工具了&#xff0c;因为使用原创度检测工具是…

ES学习日记(三)-------第三方插件选择

前言 在学习和使用Elasticsearch的过程中&#xff0c;必不可少需要通过一些工具查看es的运行状态以及数据。如果都是通过rest请求&#xff0c;未免太过麻烦&#xff0c;而且也不够人性化。 目前我了解的比较主流的插件就三个,head,cerebor和elasticHD 1.head 老牌插件,功能…

vant checkbox 复选框 样式改写

修改前 修改后 基于 vant&#xff1a; 4.8.3 unocss: 0.53.4 <van-checkbox-group v-model"query.zczb" shape"square" class"text-16 w-100% flex flex-wrap"><template v-for"item in registerCapitalOption"><v…

伪原创文章生成软件:自媒体文章写作好神器

自媒体的红利时代&#xff0c;许多人都纷纷参于其中&#xff0c;而文章写作是做自媒体的基本技能&#xff0c;但是随着技术的发展&#xff0c;如今&#xff0c;既使不会写作能力一样可以做起自媒体&#xff0c;方法就是利用伪原创文章生成软件来做内容的输出&#xff0c;其实伪…

PowerBI和Tableau之间该怎么选择?

最近经常看到朋友询问&#xff0c;最近想学习数据分析工具&#xff0c;但是PowerBI和Tableau之间不知道怎么选择? 其实可以从下面几个方面进行参考&#xff0c;Power BI和Tableau哪个更适合你&#xff1f; 共同点&#xff1a; Power BI和Tableau都是强大的数据分析和数据可…

Node爬虫:原理简介

在数字化时代&#xff0c;网络爬虫作为一种自动化收集和分析网络数据的技术&#xff0c;得到了广泛的应用。Node.js&#xff0c;以其异步I/O模型和事件驱动的特性&#xff0c;成为实现高效爬虫的理想选择。然而&#xff0c;爬虫在收集数据时&#xff0c;往往面临着诸如反爬虫机…

QML通过鼠标拖动的位置

当通过鼠标拖动Rectangle 的位置时&#xff0c;可以使用Qt Quick的MouseArea组件来实现 Rectangle {id: rectx:0;y:0width: 200; height: 100color: "lightblue"MouseArea {id: mouseAreaanchors.fill: parentdrag.target: rect//要拖动的项目的IDdrag.axis: Drag.XA…

设计模式 —— 设计原则

在软件开发中&#xff0c;为了提高软件系统的可维护性和可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;程序员要尽量根据6条原则来开发程序&#xff0c;从而提高软件开发效率、节约软件开发成本和维护成本。 开闭原则 对扩展开放&#xff0c;对修改关闭。在程序需…

【Pt】马灯贴图绘制过程 03-制作油渍、积尘效果

目录 效果 一、制作油渍效果 1.1 基本油渍 1.2 流淌的油渍痕迹 二、制作浮尘效果 三、制作积尘效果 效果 一、制作油渍效果 1.1 基本油渍 将上篇制作的“锈迹_深色”和“锈迹_浅色”两个文件夹再次合并为一个文件夹 这里就命名为“锈迹” 添加一个填充图层 设置Base …

【SpringBoot从入门到精通】01_SpringBoot概述

一、Spring与SpringBoot 1.1 Spring Spring 是一款目前主流的 Java EE 轻量级开源框架&#xff0c;是 Java 世界最为成功的框架之一。Spring 由“Spring 之父”Rod Johnson(罗宾约翰逊) 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。 广义…

Windows下安装使用Squirrel

引言 SQuirrel SQL Client是一个用Java写的数据库客户端,用JDBC统一数据库访问接口以后,可以通过一个统一的用户界面来操作MySQL PostgreSQL MSSQL Oracle等等任何支持JDBC访问的数据库。使用起来非常方便。而且,SQuirrel SQL Client还是一个典型的Swing程序。 如果您的工作…

基于单片机锂电池电量检测数码管显示系统设计

**单片机设计介绍&#xff0c;基于单片机锂电池电量检测数码管显示系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机锂电池电量检测数码管显示系统设计的主要目标是实时、准确地检测锂电池的电量&#xff0c;并…

LDL^H分解求逆矩阵与MATLAB仿真(Right-Looking)

通过分解将对称正定厄米特矩阵分解成下三角矩阵L和对角矩阵D来求其逆矩阵 目录 前言 一、LDL^H基本算法 二、LDL^H Right-Looking算法 三、D矩阵求逆 四、L矩阵求逆 五、A矩阵求逆 六、计算量分析 七、MATLAB仿真 八、参考资料 总结 前言 在线性代数中&#xff0c;LDL…