C#ToolStrip+StatusStrip 状态栏实时显示系统时间+NotifyIcon系统托盘

该代码基于 C# WinForm 框架开发,核心功能是在窗体的 ToolStrip(工具栏)控件中,动态手动添加【图片+文字按钮】和【纯文字标签】,替代设计师拖拽控件的方式,用代码动态初始化工具栏元素。下面进行逐模块、逐行精细化拆解。

一、整体代码全貌

复制代码
namespace _5toolstrip
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            // 动态创建工具栏按钮,并设置文字、图片,添加至工具栏
            ToolStripButton btn = new ToolStripButton("安全");
            btn.Image = Image.FromFile("C:\\Users\\Administrator\\Desktop\\img\\22.jpg");
            toolStrip1.Items.Add(btn);

            // 动态创建工具栏文字标签,添加至工具栏
            ToolStripLabel label = new ToolStripLabel("防范");
            toolStrip1.Items.Add(label);
        }
    }
}

5. 动态创建工具栏按钮:ToolStripButton btn = new ToolStripButton("安全");

复制代码
ToolStripButton btn = new ToolStripButton("安全");
5.1 类介绍

ToolStripButton:.NET自带工具栏按钮类,专门用于ToolStrip工具栏控件,适配工具栏布局样式,区别于普通的Button按钮。

5.2 代码拆解
  • ToolStripButton btn:声明一个名为btn的ToolStripButton类型变量

  • new ToolStripButton("安全"):实例化对象,调用带参构造方法;参数 安全 为按钮默认显示的文字

5.3 等价拆分写法

也可拆分为两行编写,效果完全一致,更方便新手理解:

复制代码
ToolStripButton btn = new ToolStripButton(); // 无参实例化
btn.Text = "安全"; // 单独设置按钮文字

6. 给按钮设置图片:btn.Image = Image.FromFile("图片路径");

复制代码
btn.Image = Image.FromFile("C:\\Users\\Administrator\\Desktop\\img\\22.jpg");
6.1 逐段解析
  • btn.Image:ToolStripButton控件的Image属性,专门用于存储按钮显示的图片资源

  • Image.FromFile():静态方法,作用是读取本地电脑磁盘中的图片文件,转换为程序可识别的Image图像对象

6.2 路径特殊说明

C#字符串中,反斜杠 \ 为转义字符,单独一个\会被识别为转义符,而非路径分隔符;因此路径中必须写双反斜杠 \\ 代表真实路径的 \。

6.3 常见报错及解决方案
  • 报错1:文件未找到 → 原因:图片路径错误、文件不存在、文件名大小写不一致

  • 报错2:权限不足 → 原因:程序无权限读取桌面文件;解决方案:将图片放入项目文件夹,使用相对路径

  • 报错3:图片格式不支持 → 仅支持jpg、png、bmp、gif格式

7. 将按钮添加至工具栏:toolStrip1.Items.Add(btn);

复制代码
toolStrip1.Items.Add(btn);
7.1 属性与方法解析
  • toolStrip1:窗体上提前拖拽的工具栏控件,默认命名为toolStrip1

  • Items:ToolStrip控件的集合属性,用于存储工具栏内所有子元素(按钮、标签、分割线、下拉框等)

  • Add(btn):集合的添加方法,将我们动态创建的btn按钮对象,加入工具栏元素集合中

7.2 执行效果

窗体运行后,工具栏最左侧会自动出现一个:上方显示图片、下方/侧边显示"安全"文字的工具栏按钮。

8. 动态创建工具栏标签:ToolStripLabel label = new ToolStripLabel("防范");

复制代码
ToolStripLabel label = new ToolStripLabel("防范");
8.1 类功能介绍

ToolStripLabel:工具栏专用文字标签控件,用于在工具栏中展示纯静态文字,无点击交互功能,常用来做功能备注、分类标题;区别于ToolStripButton,该控件默认不可点击。

8.2 代码解析

实例化ToolStripLabel对象,直接初始化标签显示文字为【防范】,逻辑和创建ToolStripButton完全一致。

9. 将标签添加至工具栏:toolStrip1.Items.Add(label);

复制代码
toolStrip1.Items.Add(label);

原理同添加按钮一致,将静态文字标签添加到工具栏元素集合中;最终展示顺序:安全按钮 → 防范文字标签,按照代码添加顺序从左至右排列。

三、拓展补充(新手必看)

3.1 相对路径写法(推荐,规避路径报错)

绝对路径绑定电脑固定位置,换电脑后图片失效;推荐将图片放入项目img文件夹,使用相对路径:

复制代码
// 获取程序运行目录,拼接图片相对路径
string imgPath = Application.StartupPath + "\\img\\22.jpg";
btn.Image = Image.FromFile(imgPath);

3.2 给工具栏按钮添加点击事件

拓展功能,实现按钮点击触发弹窗:

复制代码
btn.Click += (s,e)=>{
    MessageBox.Show("点击了安全按钮");
};

3.3 控件排列规则

ToolStrip的Items集合遵循先进先出原则,先Add的控件排在工具栏左侧,后Add的控件依次向右排列。

ToolStrip工具栏控件

一、项目简介

本案例基于C# WinForm框架,演示ToolStrip工具栏控件的动态创建与使用,手动添加工具栏按钮、文本标签两类常用子项,并为按钮绑定图片、文字,补充文件读取异常捕获,解决原图路径报错问题,适合新手学习工具栏基础用法。

实现功能:

  • 动态实例化工具栏按钮(ToolStripButton),设置文字+本地图片

  • 动态添加工具栏文本标签(ToolStripLabel),用于提示文字展示

  • 异常处理:捕获图片文件不存在、路径错误等运行异常

  • 优化代码结构,适配WinForm标准开发规范

二、前置准备

  1. 新建Windows窗体应用(.NET Framework)项目;

  2. 从工具箱拖拽1个 ToolStrip 控件到Form1窗体,控件默认命名为 toolStrip1

  3. 准备一张jpg格式图片,自定义存放路径(建议简化路径,避免权限问题);

  4. 引入必备命名空间,用于图像处理与IO异常捕获。

三、完整可运行代码

复制代码
using System;
using System.Drawing;
using System.Windows.Forms;

namespace _5toolstrip
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            // 初始化窗体及控件
            InitializeComponent();
            // 调用自定义工具栏初始化方法
            InitToolStrip();
        }

        /// <summary>
        /// 初始化工具栏:动态添加按钮、标签
        /// </summary>
        private void InitToolStrip()
        {
            try
            {
                // 1. 实例化工具栏按钮,设置显示文字:安全
                ToolStripButton safetyBtn = new ToolStripButton("安全");

                // 加载本地图片(重点:根据自己的图片实际路径修改!)
                string imgPath = @"C:\Users\Administrator\Desktop\img\22.jpg";
                safetyBtn.Image = Image.FromFile(imgPath);

                // 可选配置:调整图片显示大小,适配工具栏
                safetyBtn.ImageScaling = ToolStripItemImageScaling.SizeToFit;
                safetyBtn.AutoSize = true;

                // 将按钮添加到工具栏中
                toolStrip1.Items.Add(safetyBtn);

                // 2. 实例化工具栏文本标签,设置显示文字:防范
                ToolStripLabel tipLabel = new ToolStripLabel("防范");
                // 设置标签字体、颜色(拓展优化)
                tipLabel.ForeColor = Color.DarkGray;
                tipLabel.Font = new Font("微软雅黑", 9f);
                toolStrip1.Items.Add(tipLabel);

                // 3.【拓展】绑定按钮点击事件
                safetyBtn.Click += SafetyBtn_Click;
            }
            catch (System.IO.FileNotFoundException)
            {
                MessageBox.Show("图片文件未找到,请检查图片存放路径!", "路径错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"工具栏初始化失败:{ex.Message}", "程序异常", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 安全按钮点击事件
        /// </summary>
        private void SafetyBtn_Click(object sender, EventArgs e)
        {
            MessageBox.Show("已点击【安全】工具栏按钮", "操作提示");
        }
    }
}

四、代码逐段详解

1. 命名空间引用

默认自动生成窗体相关引用,额外依赖System.Drawing(图像处理)、System.IO(文件判断),项目已内置无需额外安装。

2. ToolStripButton 工具栏按钮

  • new ToolStripButton("安全"):创建按钮,初始化按钮显示文本;

  • Image.FromFile(路径):读取本地图片绑定到按钮;

  • ImageScaling.SizeToFit:自动适配工具栏尺寸,防止图片过大/过小;

  • toolStrip1.Items.Add():将控件添加至工具栏集合,完成渲染。

3. ToolStripLabel 文本标签

工具栏专用文本控件,无点击交互功能,仅用于展示提示文字、分类标题,常用于分割工具栏功能项。

4. 异常处理机制

针对新手最常见报错:图片路径错误、文件缺失、权限不足,单独捕获文件未找到异常,弹窗提示用户,避免程序直接崩溃。

五、常见报错及解决方案

报错问题 原因 解决方法
文件未找到异常 图片路径错误、图片被删除 修改imgPath为图片真实绝对路径,路径建议加@防止转义字符报错
权限拒绝 C盘桌面文件夹访问权限受限 将图片移动到项目bin/Debug文件夹,使用相对路径
ToolStrip为空 未拖拽ToolStrip控件到窗体 从工具箱拖拽ToolStrip,命名保持为toolStrip1

六、拓展优化(可选)

  1. 使用相对路径:将图片放入项目资源文件,脱离绝对路径限制,适配所有电脑;

  2. 添加分隔符toolStrip1.Items.Add(new ToolStripSeparator()); 分割多个工具栏项;

  3. 设置悬浮提示 :给按钮添加 safetyBtn.ToolTipText = "安全防护功能";

StatusStrip 状态栏实时显示系统时间

一、项目功能介绍

本案例基于 .NET Framework WinForm 开发,核心功能:在窗体底部的 StatusStrip 状态栏中,通过 Timer 定时器控件,实时刷新展示系统当前日期与时间,时间每秒自动更新,是WinForm基础界面开发的经典案例。

涉及控件:Form(主窗体)、StatusStrip(状态栏)、ToolStripStatusLabel(状态栏文本标签)、Timer(定时器)。

二、窗体控件配置步骤

在编写代码前,需要在VS设计界面添加对应控件,配置属性:

  1. 新建项目 :创建【Windows 窗体应用(.NET Framework)】项目,默认命名 _6StatusStrip

  2. 添加状态栏 :从工具箱拖拽 StatusStrip 控件至窗体,控件自动停靠在窗体底部;点击状态栏右侧下拉箭头,添加【StatusLabel】项,命名为 toolStripStatusLabel1

  3. 添加定时器 :拖拽 Timer 控件至窗体,控件会显示在窗体底部组件栏;

  4. 属性初始化配置

    1. timer1:Enabled = true(程序启动立即生效),Interval = 1000(触发间隔1000毫秒=1秒);

    2. toolStripStatusLabel1:默认文本清空,用于动态赋值时间。

  5. 绑定定时器事件:双击timer1控件,自动生成Tick事件方法,用于编写时间刷新逻辑。

三、完整后端代码

替换Form1.cs全部代码,包含命名空间、窗体构造、定时器核心事件,附带详细中文注释:

复制代码
using System;
using System.Windows.Forms;

// 项目命名空间,与项目名称保持一致
namespace _6StatusStrip
{
    /// <summary>
    /// 主窗体类:实现状态栏实时展示系统时间
    /// </summary>
    public partial class Form1 : Form
    {
        /// <summary>
        /// 窗体构造函数
        /// </summary>
        public Form1()
        {
            // 初始化所有控件,自动生成,不可删除
            InitializeComponent();
        }

        /// <summary>
        /// 定时器Tick事件:每1秒执行一次该方法
        /// </summary>
        /// <param name="sender">触发事件的对象(此处为timer1)</param>
        /// <param name="e">事件参数</param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            // 获取系统当前完整时间,并赋值给状态栏标签
            // ToString() 默认格式:yyyy/MM/dd HH:mm:ss 年/月/日 时:分:秒
            toolStripStatusLabel1.Text = DateTime.Now.ToString();
        }
    }
}

四、拓展优化(可选)

1. 自定义时间显示格式

如需修改时间展示样式,替换ToString参数即可,常用格式代码:

  • 仅显示时分秒:DateTime.Now.ToString("HH:mm:ss")

  • 中文日期格式:DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒")

  • 附带星期:DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss dddd")

2. 代码控制定时器启停

可通过按钮事件控制定时器,灵活开关时间刷新功能:

复制代码
// 开启定时器
timer1.Start();
// 关闭定时器
timer1.Stop();

五、运行效果

启动程序后,窗体底部状态栏会自动加载当前系统时间,并且每秒自动更新,同步系统时间;无冗余操作,开箱即用。

六、常见问题排查

  • 状态栏无时间显示:检查timer1的Enabled属性是否为true,Interval是否设置为1000;

  • 代码报错:确认控件名称与代码一致(toolStripStatusLabel1、timer1,禁止手动修改控件名);

  • 时间不刷新:确认Tick事件已绑定至timer1控件。

NotifyIcon系统托盘功能

该项目基于 .NET WinForm 开发,核心功能:实现窗体假关闭、最小化隐藏至系统托盘,搭配托盘气泡提示,同时提供右键菜单实现程序真正退出。下面逐模块、逐行拆解全部代码。

一、整体代码结构预览

复制代码
namespace _7NotifyIcon
{
    public partial class Form1 : Form
    {
        // 构造方法
        public Form1(){}
        // 菜单退出点击事件
        private void 退出ToolStripMenuItem_Click(object sender, EventArgs e){}
        // 窗体关闭事件
        private void Form1_FormClosing(object sender, FormClosingEventArgs e){}
        // 窗体大小改变事件
        private void Form1_SizeChanged(object sender, EventArgs e){}
    }
}

二、逐行详细代码解析

4. 退出菜单点击事件(程序真正退出)

复制代码
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
    Application.Exit();// 退出系统
}
4.1 方法参数解析
  • private:私有方法,仅当前Form1类内部可调用;

  • 退出ToolStripMenuItem_Click :事件方法名,由控件名称+事件类型组成;退出ToolStripMenuItem是窗体菜单栏中【退出】选项的控件名称;

  • object sender:触发事件的对象,此处就是点击的【退出】菜单项;

  • EventArgs e:事件参数,存放本次点击事件的附加数据(普通点击事件无额外数据)。

4.2 核心代码解析

Application.Exit();:彻底关闭当前应用程序,释放所有资源、关闭所有窗体、终止程序进程;和普通窗体关闭不同,该方法会直接结束整个程序,是WinForm程序标准退出方式。

5. FormClosing 窗体关闭事件(实现假关闭核心)

触发时机:用户点击窗体右上角【×】关闭按钮、通过快捷键关闭窗体时,优先触发该事件。

复制代码
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    //MessageBox.Show("111");
    this.Hide(); //隐藏窗体
    this.notifyIcon1.BalloonTipIcon = ToolTipIcon.Error;//设置系统托盘的图标 
    notifyIcon1.BalloonTipText = "假关闭";
    notifyIcon1.BalloonTipTitle = "提示";
    notifyIcon1.Visible = true;
    notifyIcon1.ShowBalloonTip(5000); //展示通知并且指定时间

    e.Cancel = true;// 取消事件
}
5.1 专属参数解析

FormClosingEventArgs e :专属关闭事件参数,相比普通EventArgs,多了 Cancel 属性,可拦截窗体关闭行为。

5.2 逐行代码详解
  1. //MessageBox.Show("111");:被注释的测试代码,作用:弹窗提示,用于调试,验证关闭事件是否被触发;

  2. this.Hide();:隐藏当前主窗体。this指代当前Form1窗体;Hide()方法仅隐藏窗体,不会销毁窗体、不会退出程序,程序仍在后台运行;

  3. this.notifyIcon1.BalloonTipIcon = ToolTipIcon.Error;:设置托盘气泡提示的图标。notifyIcon1是窗体添加的系统托盘控件;ToolTipIcon枚举包含4种样式:Error(错误红图标)、Info(信息蓝图标)、Warning(警告黄图标)、None(无图标);

  4. notifyIcon1.BalloonTipText = "假关闭";:设置气泡提示的正文内容,展示给用户的提示文字;

  5. notifyIcon1.BalloonTipTitle = "提示";:设置气泡提示的标题文字,展示在提示框顶部;

  6. notifyIcon1.Visible = true;:设置托盘图标可见。默认部分情况下托盘图标不会自动显示,该代码强制让图标显示在电脑右下角系统托盘内;

  7. notifyIcon1.ShowBalloonTip(5000);:弹出气泡提示框。参数单位为毫秒,5000=5秒,表示气泡提示自动展示5秒后消失;

  8. e.Cancel = true;:核心关键代码。取消本次窗体关闭事件,阻止系统执行默认的关闭销毁逻辑;如果不写该行,窗体会直接被关闭,假隐藏功能失效。

6. SizeChanged 窗体大小改变事件

触发时机:窗体最大化、最小化、拉伸缩放时,都会触发该事件,本代码用于拦截窗体最小化操作。

复制代码
private void Form1_SizeChanged(object sender, EventArgs e)
{
    if (this.WindowState== FormWindowState.Minimized) // 当前窗体的状态是窗体最小化
    {
        this.Hide(); //隐藏窗体
        this.notifyIcon1.BalloonTipIcon = ToolTipIcon.Error;//设置系统托盘的图标 
        notifyIcon1.BalloonTipText = "假关闭";
        notifyIcon1.BalloonTipTitle = "提示";
        notifyIcon1.Visible = true;
        notifyIcon1.ShowBalloonTip(5000); //展示通知并且指定时间
    }
}
6.1 逐行代码详解
  1. if (this.WindowState== FormWindowState.Minimized):条件判断,检测当前窗体状态;WindowState为窗体状态枚举,包含三种状态:

    1. Normal:正常大小(默认状态);

    2. Minimized:最小化状态;

    3. Maximized:最大化状态;

  2. if内部代码块:逻辑和FormClosing事件完全一致,实现窗体最小化时,隐藏窗体并弹出托盘提示;

三、核心功能总结与补充误区

1. 整体运行逻辑

  • 点击窗体右上角×:触发FormClosing事件 → 隐藏窗体+弹出托盘提示 → 取消关闭事件,实现假关闭;

  • 点击最小化按钮:触发SizeChanged事件 → 判断为最小化 → 隐藏窗体+弹出托盘提示;

  • 点击菜单栏【退出】:执行Application.Exit(),彻底退出程序。

2. 易混淆知识点(高频误区)

  • Hide() 与 Close() 区别:Hide()仅隐藏窗体,程序后台运行;Close()会销毁窗体,若为主窗体,直接关闭程序;

  • Application.Exit() 与 this.Close():this.Close()仅关闭当前窗体;Application.Exit()关闭整个程序所有窗体;

  • e.Cancel=true生效范围:仅对FormClosing事件有效,无法拦截最小化、最大化事件。

3. 控件依赖说明

该代码必须提前在窗体设计器中添加两个控件,否则运行报错:

  1. NotifyIcon 控件:命名为 notifyIcon1(系统默认名称);

  2. MenuStrip 菜单栏控件:内部添加ToolStripMenuItem菜单项,命名为 退出ToolStripMenuItem。

四、界面控件配置

需在Form1窗体中添加以下2个核心控件,控件属性配置如下:

控件类型 控件名称(Name) 核心属性配置 作用
NotifyIcon notifyIcon1 Icon:自定义程序托盘图标;Visible:False(初始隐藏) 承载系统托盘图标、推送气泡通知
ContextMenuStrip contextMenuStrip1 添加ToolStripMenuItem项,Text属性设为【退出】 托盘图标右键弹出的菜单栏

补充绑定:将notifyIcon1的ContextMenuStrip属性绑定为contextMenuStrip1,实现右键托盘图标呼出菜单。

相关推荐
飞天狗1111 小时前
零基础JavaWeb入门——第五课第一小节:九大内置对象 · 第1个:request(请求对象)
java·开发语言·前端·后端·servlet
插件开发1 小时前
vs2015 cuda c++ 线程号的计算详解
开发语言·c++·算法
石山代码1 小时前
变量与解构
开发语言·前端·javascript
c++之路1 小时前
Bazel C++ 构建系列文档(五):多目标与多包项目
java·开发语言·c++
Hello:CodeWorld1 小时前
【C++ 避坑指南】告别缓冲区溢出!全面解析 std::snprintf 的安全美学与核心陷阱
开发语言·c++·安全
凡人叶枫1 小时前
Effective C++ 条款38:通过复合塑模出 has-a 或 \“根据某物实现出\
linux·开发语言·c++·windows
枫叶丹42 小时前
【HarmonyOS 6.0】MDM Kit:PC/2in1设备用户行为限制策略详解
开发语言·华为·harmonyos
weilaieqi12 小时前
微短剧 + 时代到来,短剧内容正在赋能文旅、品牌与数字文化产业
开发语言
ytttr8732 小时前
航天器姿态控制 MATLAB 仿真程序
开发语言·matlab