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,实现右键托盘图标呼出菜单。