《C#编程实例精解宝典》是一本全面解析C#编程语言的经典教程,通过丰富的示例代码帮助读者深入理解并掌握C#开发技巧。
### C#程序开发范例宝典 - 窗体与界面设计之菜单应用实例
#### 1.1 菜单应用实例
在C#程序开发中,菜单是非常重要的界面元素之一,它不仅可以帮助用户方便地操作程序的功能,还能提高程序的效率,使程序更加人性化。本章节将通过具体的实例来详细介绍菜单的设计方法和技术。
#### 实例001 带历史信息的菜单
**实例说明**
在开发图纸管理软件或其他类型的文档管理软件时,为了方便用户快速访问最近打开的文档或图纸,可以在菜单中集成一项功能,即记录用户最近打开的文件路径。当用户再次启动软件时,这些路径会出现在“文件”菜单下的“历史”子菜单中,让用户可以快速打开之前的文档。
**技术要点**
- **INI文件存储**:为了实现这一功能,可以通过将最近打开的文件路径写入一个预先创建的*.ini文件来实现。在程序启动时,读取这个文件并根据其中的数据构建一个包含历史记录的菜单。
- **MenuStrip控件**:为了创建这样的菜单,需要使用MenuStrip控件,并确保主窗体的`IsMdiContainer`属性被设置为`True`,这样可以支持多文档界面(MDI)。
**实现过程**
1. 创建一个新的C#项目,命名为Ex01_01,默认窗体为Form1。
2. 向Form1添加MenuStrip控件和OpenFileDialog控件。
3. 在MenuStrip中创建一个名为“文件”的主菜单,并在其下创建“打开”、“关闭所有”和“退出”等子菜单项。
4. 编写代码实现将打开的文件路径记录到INI文件以及从INI文件读取历史信息并加入菜单的功能:
- **写入INI文件**:
```csharp
private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
StreamWriter s = new StreamWriter(address + Menu.ini, true);
s.WriteLine(openFileDialog1.FileName); // 写入文件路径至ini
s.Flush();
s.Close();
ShowWindows(openFileDialog1.FileName);
}
```
- **读取INI文件**:
```csharp
private void Form1_Load(object sender, EventArgs e)
{
StreamReader sr = new StreamReader(address + Menu.ini);
int i = this.文件ToolStripMenuItem.DropDownItems.Count - 2;
while (sr.Peek() >= 0) // 从ini中读取历史记录并加入菜单项
{
ToolStripMenuItem menuItem = new ToolStripMenuItem(sr.ReadLine());
this.文件ToolStripMenuItem.DropDownItems.Insert(i, menuItem);
i++;
menuItem.Click += new EventHandler(menuitem_Click);
}
sr.Close();
}
```
5. 定义一个方法`ShowWindows()`用于加载背景图片并显示窗体:
```csharp
public void ShowWindows(string fileName)
{
Image p = Image.FromFile(fileName);
Form f = new Form();
f.MdiParent = this;
f.BackgroundImage = p;
f.Show();
}
```
**举一反三**
基于本实例,读者可以进一步开发以下程序:
- **记录用户操作菜单日志的程序**:在用户点击菜单时,记录用户的操作信息到INI文件中,以便日后查询。
- **通过数据库保存菜单历史信息的程序**:使用数据库来替代INI文件存储历史记录,以提供更好的可靠性和扩展性。
- **菜单使用频率统计程序**:统计用户对菜单的使用频率,并据此调整菜单布局。
#### 实例002 菜单动态合并
**实例说明**
在MDI窗体应用程序中,通常需要支持多个弹出菜单。当MDI子窗体最大化时,子窗口和主窗口的菜单可以自动合并。本实例将展示如何实现这种功能。
**技术要点**
- **ContextMenuStrip控件**:C# 2.0版本中的`ContextMenuStrip`控件封装了弹出菜单,并通过其Items属性轻松操作菜单项。
- **ToolStripMenuItem**:Items属性返回的是ToolStripItem集合,因此可以添加ToolStripMenuItem类型的菜单项以实现所需功能。
**实现过程**
1. 创建一个新的C#项目并命名。
2. 向窗体中添加ContextMenuStrip控件设计好所需的菜单结构。
3. 编写代码来实现动态合并的逻辑。