欢迎光临
我们一直在努力

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标准开发规范

二、前置准备

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

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

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

  • 引入必备命名空间,用于图像处理与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

    六、拓展优化(可选)

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

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

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

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

    一、项目功能介绍

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

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

    二、窗体控件配置步骤

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

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

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

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

  • 属性初始化配置:

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

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

  • 绑定定时器事件:双击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 逐行代码详解
  • //MessageBox.Show("111");:被注释的测试代码,作用:弹窗提示,用于调试,验证关闭事件是否被触发;

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

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

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

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

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

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

  • 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 逐行代码详解
  • if (this.WindowState== FormWindowState.Minimized):条件判断,检测当前窗体状态;WindowState为窗体状态枚举,包含三种状态:

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

  • Minimized:最小化状态;

  • Maximized:最大化状态;

  • 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. 控件依赖说明

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

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

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

  • 四、界面控件配置

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

    控件类型

    控件名称(Name)

    核心属性配置

    作用

    NotifyIcon

    notifyIcon1

    Icon:自定义程序托盘图标;Visible:False(初始隐藏)

    承载系统托盘图标、推送气泡通知

    ContextMenuStrip

    contextMenuStrip1

    添加ToolStripMenuItem项,Text属性设为【退出】

    托盘图标右键弹出的菜单栏

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

    赞(0)
    未经允许不得转载:171主机测评 » C#ToolStrip+StatusStrip 状态栏实时显示系统时间+NotifyIcon系统托盘
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址