====== WinForm 窗体与控件开发详解 ======
本章节详细讲解 C# WinForm 开发中窗体(Form)的基础操作、属性设置、MDI 多窗体应用、窗体继承以及常用控件的使用。
===== Form 窗体基础 =====
==== 窗体概念与基本操作 ====
WinForm 是 Windows 窗体应用程序的核心。
* **添加与删除**:在项目中右键 -> 添加 -> Windows 窗体;右键窗体文件 -> 删除。
* **运行第一个窗体**:在 `Program.cs` 中设置 `Application.Run(new Form1());`。
==== 窗体的常用属性 ====
=== ①-0:窗体的显示与隐藏 ===
// 打开窗口
Form2 form2 = new Form2();
form2.Show(); // 显示窗体
// 隐藏窗口 (haɪ d)
// 隐藏当前窗体,但不会关闭它。窗体仍在内存中,可再次调用 Show() 显示。
this.Hide();
// 关闭窗口
// 关闭当前窗体并释放资源。内存移除,若需显示需重新 new 实例。
this.Close();
=== ①-1 ~ ①-5:外观与布局属性 ===
| 属性名 | 说明 | 常用值/备注 |
| **Icon** | 窗体图标 | 用于更换左上角图标 |
| **FormBorderStyle** | 边框样式 | 可用于隐藏标题栏或禁止调整大小 |
| **StartPosition** | 开始显示位置 | **Manual**: 手动
**CenterScreen**: 屏幕居中 (sen tə)
**WindowsDefaultLocation**: Windows默认位置
**CenterParent**: 父窗体居中 |
| **Size** | 窗体大小 | (saɪz) 可通过代码设置或鼠标拉伸 |
| **BackgroundImage** | 背景图片 | (bækɡ raʊn d ɪ mɪdʒ) |
| **BackgroundImageLayout** | 背景布局 | **None**: 无 (nʌn)
**Tile**: 平铺
**Center**: 居中
**Stretch**: 拉伸/铺满 (s tre tʃ)
**Zoom**: 按比例缩放 (zuːm) |
==== 窗体的常用事件 ====
可以通过双击窗体或属性面板的“闪电”图标添加事件。
* **Click**:单击事件。当鼠标单击窗体空白处时触发。
* **Load** (ləʊd):加载事件。当窗体初始化并准备显示时触发(常用于数据初始化)。
* **FormClosing** (Kləʊ zɪŋ):关闭事件。当窗体即将关闭时触发(常用于确认提示或资源释放)。
===== MDI 窗体 (多文档界面) =====
==== ①-0:简介 ====
MDI (Multiple Document Interface) 允许在一个主窗体(父窗体)内部打开多个子窗体。
==== ①-1 & ①-2:父子窗体设置 ====
**1. 父窗体设置**:
将主窗体的属性 `IsMdiContainer` 设置为 `true`。
> 备注:kənˈteɪ nə (容器)
**2. 子窗体设置**:
在代码中打开子窗体时,必须指定其 `MdiParent` 属性。
private void Form1_Load(object sender, EventArgs e)
{
MDI_1 mdi_1 = new MDI_1();
mdi_1.MdiParent = this; // 关键:设置父容器为当前窗体
mdi_1.Show();
// 可以打开多个子窗体
MDI_2 mdi_2 = new MDI_2();
mdi_2.MdiParent = this;
mdi_2.Show();
}
==== ①-3 & ①-4:MDI 窗体排列布局 ====
使用 `LayoutMdi` 方法来自动排列子窗体。
| 排列方式 | 枚举值 | 说明 |
| **水平平铺** | `MdiLayout.TileHorizontal` | (taɪl hɒrɪˈzɒntl) |
| **垂直平铺** | `MdiLayout.TileVertical` | (taɪl vɜːtɪ kl) |
| **层叠排列** | `MdiLayout.Cascade` | (kæˈskeɪd) |
**代码示例**:
// 水平平铺
private void 水平平铺ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.TileHorizontal);
}
// 层叠
private void 叠层ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.Cascade);
}
===== 继承窗体 (Inherit Form) =====
==== ①-1:概念 ====
**Inherit** (ɪnˈhe rɪ t)。
> **白话解释**:类似 HMI 的底层窗口。把底层窗口(基类)当作公共模板,其他窗口继承它之后,天然拥有基类的所有控件和代码,实现复用。
==== ①-2:创建继承窗体 ====
**方法一:编程方式(推荐)**
修改代码中的继承关系。
// 原代码
public partial class Form_Param : Form { ... }
// 修改后:让 Form_Param 继承自 Form_MAX
public partial class Form_Param : Form_MAX { ... }
> 效果:Form_Param 窗体中将自动出现 Form_MAX 中的所有内容。
**方法二:选择器方式**
项目 -> 添加新项 -> Windows Forms -> 继承的窗体 -> 选择基类窗体。
==== ①-3:修改继承控件的属性 ====
默认情况下,基类窗体中的控件在子窗体中是**锁定**的(灰色,不可编辑)。
**解决方法**:
1. 打开基类窗体(父窗体)的设计器。
2. 选中要开放修改权限的控件。
3. 将属性 **Modifiers** (mɒ dɪ faɪ z / 修饰符) 改为 **Public** 或 **Protected**。
4. 重新生成项目。现在子窗体即可修改该控件属性。
===== WinForm 控件 =====
==== 控件基本常识 ====
* **分类与命名**:建议使用规范命名(如 `btnSubmit`, `lblTitle`)以便阅读。
* **锁定位置**:属性 `Locked` 设置为 `True`,防止误拖动。
* **显示与隐藏**:控制属性 `Visible` (`True`/`False`)。
**常用快捷键绑定**:
| 功能 | 属性设置位置 | 说明 |
| **回车键触发** | 窗体属性 `AcceptButton` | 用户按 Enter 键等于点击了指定的按钮 |
| **ESC键触发** | 窗体属性 `CancelButton` | 用户按 Esc 键等于点击了指定的按钮 |
// 代码方式设置快捷键绑定
private void MAX_Load(object sender, EventArgs e)
{
this.AcceptButton = button1; // 回车触发 button1
this.CancelButton = button2; // ESC触发 button2
}
==== 常用文本控件 ====
| 控件名称 | 中文名 | 用途 |
| **Label** | 标签 | 用于显示文本信息,用户不可编辑。 |
| **Button** | 按钮 | 用于触发点击事件。 |
| **TextBox** | 文本框 | 最常用的文本输入控件。 |
| **RichTextBox** | 富文本框 | 支持格式化文本(颜色、字体)的输入与显示。 |