8.3.1 MenuStrip(菜单)控件
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的
MenuStrip控件提供了程序窗体的主菜单,即显示于窗体顶端部分的菜单。
MenuStrip常用属性:
- ImageScalingSize:菜单上所用图像的大小(单位:像素),默认为(16,16)。注意:如果修改了此值,在窗体编辑模式下还是显示为(16,16),不会立即显示为设置的大小,可以关闭窗体再打开。
【例 8.45】【项目:code8-045】在窗体上建立菜单。
双击添加MenuStrip控件,它会显示在编辑器底部,窗体上部显示菜单区域,并且显示灰色的“请在此处键入”:

图8-62 菜单显示的位置
在“请在此处键入”后部有一个向下的小箭头,单击小箭头可以设置每个菜单项类型:
MenuItem:常规的菜单项。
- ComboBox: 对应ToolStripComboBox类型,组合框,类似于普通的ComboBox。
- TextBox:对应ToolStripTextBox类型,文本框,类似于普通的TextBox。
- Separator:分隔符,在菜单中显示为一横线。
请根据实际需要选择相应的菜单项类型。
在“请在此处键入”位置单击进入文本编辑模式,输入“文件(&F)”,其中“&+字母”用来建立该菜单的快捷键,例如“&F”即快捷键为“ALT+F”,此时可以继续单击右边或者下方“请在此处键入”继续添加菜单或子菜单:

图8-63 在已建菜单项右边或者下方继续添加菜单项
继续建立“文件F”的子菜单:“打开(&O)”、“保存(&S)”、“-”、“关闭(&X)”,以及主菜单项“编辑(&E)”、“视图(&V)”。
在子菜单中可以使用“-”(减号)在菜单中增加一个分隔栏。但是横向的主菜单中不允许使用分隔栏。
如果某个菜单项建立错误,可以直接单击后进行编辑,也可以选中错误的菜单项,按下键盘“DEL”按键删除。
当输入菜单(包括子菜单)项名称后,C#会自动建立一个ToolStripMenuItem类,默认使用“菜单文本”+“ToolStripMenuItem”来命名。例如菜单项“文件F”对应名称“文件FToolStripMenuItem”,单击“文件F”,C#编辑器右侧【属性】窗口将显示“文件FToolStripMenuItem”的属性。
ToolStripMenuItem类的常用属性:
- Image:显示在菜单文本前面的图标。
- CheckOnClick:是否该菜单项被单击时在名称前面显示选中或未选中。如果设置了Image属性时,此属性即使为True也不会显示。
- Checked:设置是否被选中。
- Visible:是否可见。
选中菜单项“打开O”(打开OToolStripMenuItem),将【属性】窗口中Image属性添加一张图片。注意:默认没有*.Ico,但是实际上是可以使用图标文件的。
选中菜单项“保存S”(保存SToolStripMenuItem),将【属性】窗口中的CheckOnClick属性设置为True,运行时,此菜单项被单击时将会自动显示为选中或未选中。

图8-64 带图标和选择框的菜单项
当需要给某个菜单项添加事件时,直接双击该菜单项,进入此菜单项的事件代码编辑,默认事件是 Click。例如双击“打开O”菜单项添加Click事件代码:
private void 打开OToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
MessageBox.Show(ofd.FileName);
}
由于C#提供给菜单项CheckOnClick属性显示选中或未选中并不好看,可以考虑替换为更漂亮的图片。为菜单项“保存S” (保存SToolStripMenuItem)Image属性选择一张类似“X”的图片(x.png)表示未选中,同时准备一张类似“√”的图片(r.png)表示选中,修改“保存S”的Click事件代码:
private void 保存SToolStripMenuItem_Click(object sender, EventArgs e)
{
//将sender转换为ToolStripMenuItem,并赋值给定义的ToolStripMenuItem
ToolStripMenuItem menuSave = (ToolStripMenuItem)sender;
//当菜单项没有选中,该菜单项图标为x.png,否则为r.png
if (menuSave.Checked == false)
menuSave.Image = Image.FromFile("c:\\lessons\\x.png");
else
menuSave.Image = Image.FromFile("c:\\lessons\\r.png");
}
运行结果如下图所示:
、
图8-65 当“保存S”被选中时显示为“X”图片
【例 8.46】【项目:code8-046】通过代码在窗体上建立菜单。
增加菜单项及其对应事件的代码:
private void button1_Click(object sender, EventArgs e)
{
//定义msMain为MenuStrip类型
MenuStrip msMain = new MenuStrip();
//定义tsmiFile为ToolStripMenuItem类型
ToolStripMenuItem tsmiFile = new ToolStripMenuItem();
//设置菜单项显示的文本
tsmiFile.Text = "文件(&F)";
//定义tsmiFileOpen为ToolStripMenuItem类型
ToolStripMenuItem tsmiFileOpen = new ToolStripMenuItem();
//设置菜单项显示的文本
tsmiFileOpen.Text = "打开(&O)";
//定义tsmiFileSave为ToolStripMenuItem类型
ToolStripMenuItem tsmiFileSave = new ToolStripMenuItem();
tsmiFileSave.Text = "保存(&S)";
//此菜单项显示的图标
tsmiFileSave.Image = Image.FromFile("c:\\lessons\\x.png");
//此菜单项可以被选中或未选中
tsmiFileSave.CheckOnClick = true;
//此菜单项当前未选中
tsmiFileSave.Checked = false;
//将tsmiFileOpen和tsmiFileSave加入tsmiFile下拉菜单项
tsmiFile.DropDownItems.Add(tsmiFileOpen);
tsmiFile.DropDownItems.Add(tsmiFileSave);
//将tsmiFile加入msMain菜单项
msMain.Items.Add(tsmiFile);
//将msMain加入窗体控件中,不用像其它控件一样指定位置
this.Controls.Add(msMain);
//将tsmiFileOpen菜单项的Click事件和mnuFileOpen_Click方法关联
tsmiFileOpen.Click += mnuFileOpen_Click;
//将tsmiFileSave菜单项的Click事件和mnuFileSave_Click方法关联
tsmiFileSave.Click += mnuFileSave_Click;
}
关联的方法:
//实际处理tsmiFileOpen.Click事件
private void mnuFileOpen_Click(Object sender , EventArgs e )
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
MessageBox.Show(ofd.FileName);
}
//实际处理tsmiFileSave.Click事件
private void mnuFileSave_Click(Object sender, EventArgs e) //
{
ToolStripMenuItem menuSave = (ToolStripMenuItem)sender;
if (menuSave.Checked)
menuSave.Image = Image.FromFile("c:\\lessons\\r.png");
else
menuSave.Image = Image.FromFile("c:\\lessons\\x.png");
}
运行结果如下图所示:

图8-66 运行时增加菜单项
学习更多vb.net知识,请参看vb.net 教程 目录
学习更多C#知识,请参看C#教程 目录
相关文章:
8.3.1 MenuStrip(菜单)控件
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 MenuStrip控件提供了程序窗体的主菜单,即显示于窗体顶端部分的菜单。 MenuStrip常用属性: ImageScalingSize…...
STM32单片机入门学习——第29节: [9-5] 串口收发HEX数据包串口收发文本数据包
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.09 STM32开发板学习——第29节: [9-5] 串口收发HEX数据包&串口收发文本数据包 前…...
【Springboot知识】Springboot进阶-Micrometer指标监控深入解析
文章目录 Micrometer 核心概念与标准指标详解**Micrometer 核心概念与标准指标详解****一、Micrometer 核心概念****二、Micrometer 标准指标****1. JVM 监控指标****2. 系统资源监控****3. HTTP 请求监控****4. 数据库监控****5. 缓存监控** **三、配置与自定义指标****1.…...
Skyline配置指南-微信小程序
Skyline 是微信小程序推出的新一代渲染引擎,提供了更强大的渲染能力和更流畅的性能体验。以下是配置 Skyline 的详细步骤: 一、app.json文件配置 "componentFramework": "glass-easel", "lazyCodeLoading": "requi…...
Go 微服务框架 | 中间件
文章目录 定义中间件前置中间件后置中间件路由级别中间件 定义中间件 中间件的作用是给应用添加一些额外的功能,但是不会影响原有应用的编码方式,想用的时候直接添加,不想用的时候也可以轻松去除,实现所谓的可插拔。中间件的实现…...
Spring MVC 重定向(Redirect)详解
Spring MVC 重定向(Redirect)详解 1. 核心概念与作用 重定向(Redirect) 是 Spring MVC 中一种客户端重定向机制,通过 HTTP 302 状态码(默认)将用户浏览器重定向到指定 URL。 主要用途…...
项目开发流程总结
目录 1. 项目启动阶段(需求分析) 2. 项目设计阶段 3. 开发阶段 4. 测试阶段 5. 打包和发布阶段 6. 运维和监控阶段 7. 版本迭代和维护阶段 项目生命周期中的管理要点: 总结: 一个完整的项目开发流程通常包括以下几个阶段…...
window上 docker使用ros2开发并usbip共享usb设备
曾经参考 https://blog.csdn.net/laoxue123456/article/details/138339029 来共享windows上的usb 发现没有办法成功总是出现 tcp 错误。telnet测试能够正常连接 很是奇怪,window上换成低版本的usbipd仍然是同样的错误,没有办法的情况下参考了docker官方文…...
基于MATLAB/simulink的信号调制仿真--AM调制
实验内容: 假设y(t)(20.5*2cos(2*pi*1000*t))*5cos(2*pi*2*1e4*t)调幅系统,请将一个频率为1000HZ的余弦波信号,通过进行AM调制,载波信号频率为20kHZ的余弦波,调制度ma0.…...
Vue3+Ts封装ToolTip组件(2.0版本)
本组件支持hover和click两种触发方式,需要更多的触发方式,可自行去扩展!!! 1.传递三个参数: content:要展示的文本 position:文本出现的位置("top" | "t…...
Latex语法入门之数学公式
Latex是一种高质量的排版系统,尤其擅长于数学公式的排版。本文我将带大家深入了解Latex在数学公式排版中的应用。从基础的数学符号到复杂的公式布局,我们都会一一讲解,通过本文的学习,你将能够轻松编写出清晰、美观的数学公式&…...
shell脚本 - Linux定时温度监控-软硬件检测 - 服务器温度监控 - 写入日志
效果图 脚本 vi auto.sh (chmod x ./auto.sh) #!/bin/bash # 按照日期创建一个文件或目录 https://blog.csdn.net/shoajun_5243/article/details/83539069 datetimedate %Y%m%d-%H%M%S |cut -b1-20 dirpath/systemMonitor/$datetime file1$dirpath/sensors.log file2$dirpa…...
Linux驱动开发进阶(六)- 多线程与并发
文章目录 1、前言2、进程与线程3、内核线程4、底半步机制4.1、软中断4.2、tasklet4.3、工作队列4.3.1、普通工作项4.3.2、延时工作项4.3.3、工作队列 5、中断线程化6、进程6.1、内核进程6.2、用户空间进程 7、锁机制7.1、原子操作7.2、自旋锁7.3、信号量7.4、互斥锁7.5、comple…...
买不起了,iPhone 或涨价 40% ?
周知的原因,新关税对 iPhone 的打击,可以说非常严重。 根据 Rosenblatt Securities分析师的预测,若苹果完全把成本转移给消费者。 iPhone 16 标配版的价格,可能上涨43%。 iPhone 16 标配的价格是799美元,上涨43%&am…...
Axure 列表滚动:表头非常多(横向滚动方向)、分页(纵向滚动) | 基于动态面板的滚动方向和取消调整大小以适合内容两个属性进行实现
文章目录 引言I 列表滚动的操作说明see also共享原型引言 Axure RP9教程 【数据传输】(页面值传递)| 作用域 :全局变量、局部变量 https://blog.csdn.net/z929118967/article/details/147019839?spm=1001.2014.3001.5501 基于动态面板的滚动方向和取消调整大小以适合内容两…...
RBAC 权限控制:深入到按钮级别的实现
RBAC 权限控制:深入到按钮级别的实现 一、前端核心思路 1. 大致实现思路 后端都过SELECT连表查询把当前登录的用户对应所有的权限返回过来,前端把用户对应所有的权限 存起来to(vuex/pinia) 中 ,接着前端工程师需要知道每个按钮对应的权限代…...
大模型格式化输出的几种方法
大模型格式化输出的几种方法 在开发一些和LLM相关的应用的时候,如何从大模型的反馈中拿到结构化的输出数据是非常重要的,那么本文就记录几种常用的方法。 OpenAI提供的新方法 在 OpenAI 的 Python 库中,client.beta.chat.completions.parse 是一个用于生成结构化输出的方法…...
【区间贪心】合并区间 / 无重叠区间 / 用最少数量的箭引爆气球 / 俄罗斯套娃信封问题
⭐️个人主页:小羊 ⭐️所属专栏:贪心算法 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 合并区间无重叠区间用最少数量的箭引爆气球俄罗斯套娃信封问题 合并区间 合并区间 class Solution { public:vector<vecto…...
JBDC java数据库连接(2)
目录 JBDC建立 获得PrepareStatement执行sql语句 形式: PrepareStatement中的方法: 实例 PreparedStatement和Statement 基于以下的原因: JBDC建立 获得PrepareStatement执行sql语句 在sql语句中参数位置使用占位符,使用setXX方法向sql中设置参数 形式&…...
es --- 集群数据迁移
目录 1、需求2、工具elasticdump2.1 mac安装问题解决 2.2 elasticdump文档 3、迁移 1、需求 迁移部分新集群没有的索引和数据 2、工具elasticdump Elasticdump 的工作原理是将输入发送到输出 。两者都可以是 elasticsearch URL 或 File 2.1 mac安装 前置:已经安装…...
Redis高频面试题及深度解析(20大核心问题+场景化答案)
摘要:Redis作为高性能缓存与内存数据库,是后端开发的核心技术栈之一。本文整理20大高频Redis面试题,结合真实场景与底层源码逻辑,助你彻底掌握Redis核心机制。涵盖单线程模型、集群方案、分布式锁、持久化等核心知识点。 一、Redi…...
事件处理程序
事件处理程序 一、事件处理程序的定义 事件处理程序是一段代码,用于响应特定的事件。在网页开发中,事件是在文档或浏览器窗口中发生的特定交互瞬间,如用户点击按钮、页面加载完成等。事件处理程序则是针对这些事件执行的函数,它能…...
stable diffusion部署ubuntu
stable-diffusion webui: https://github.com/AUTOMATIC1111/stable-diffusion-webui python3.10 -m venv venv(3.11的下torch会慢得要死) source venv/bin/activate 下载checkpoint模型放入clip_version"/home/chen/软件/stable-diffusion-webu…...
Qt的window注册表读写以及删除
Qt的window注册表读写以及删除 1. 使用 QSettings(Qt推荐方式)基本操作关键点限制 2. 调用Windows原生API示例:创建/读取键值常用API注意事项 3. 高级场景(1) 递归删除键(2) 注册表权限修改 4. 安全性建议总结其他QT文章推荐 在Qt中操作Windo…...
聊一聊接口测试时遇到上下游依赖时该如何测试
目录 一、手工测试时的处理方法 1.1沟通协调法 1.2模拟数据法 二、自动化测试时的处理方法 2.1 数据关联法(变量提取) 2.2 Mock数据法 2.3自动化框架中的依赖管理 三、实施示例(以订单接口测试为例) 3.1Mock依赖接口&…...
C++ 排序(1)
以下是一些插入排序的代码 1.插入排序 1.直接插入排序 // 升序 // 最坏:O(N^2) 逆序 // 最好:O(N) 顺序有序 void InsertSort(vector<int>& a, int n) {for (int i 1; i < n; i){int end i - 1;int tmp a[i];// 将tmp插入到[0,en…...
【有啥问啥】深入浅出讲解 Teacher Forcing 技术
深入浅出讲解 Teacher Forcing 技术 在序列生成任务(例如机器翻译、文本摘要、图像字幕生成等)中,循环神经网络(RNN)以及基于 Transformer 的模型通常采用自回归(autoregressive)的方式生成输出…...
zk基础—zk实现分布式功能
1.zk实现数据发布订阅 (1)发布订阅系统一般有推模式和拉模式 推模式:服务端主动将更新的数据发送给所有订阅的客户端。 拉模式:客户端主动发起请求来获取最新数据(定时轮询拉取)。 (2)zk采用了推拉相结合来实现发布订阅 首先客户端需要向服务端注册自己关…...
mySQL数据库和mongodb数据库的详细对比
以下是 MySQL 和 MongoDB 的详细对比,涵盖优缺点及适用场景: 一、核心特性对比 特性MySQL(关系型数据库)MongoDB(文档型 NoSQL 数据库)数据模型结构化表格,严格遵循 Schema灵活的文档模型&…...
ubuntu wifi配置(命令行版本)
1、查询当前设备环境的wifi列表 nmcli dev wifi list2、连接wifi nmcli dev wifi connect "MiFi-SSID" password "Password" #其中MiFi-SSID是wifi的密码,Password是wifi的密码3、查看连接情况 nmcli dev status...
