1、运行界面
窗体采用MDI容器模式,所有子窗体依赖于父窗体下
2、子窗体控件触发事件代码
添加 ToolStrip 工具栏,依次添加 Button 和 ComboBox 双击增加触发事件
// 窗体加载时触发事件
private void FrmChild_Load(object sender, EventArgs e)
{
// 加载系统字体
InstalledFontCollection myFonts = new InstalledFontCollection();
// 获取对象数组
FontFamily[] ff = myFonts.Families;
ArrayList list = new ArrayList();
// 获取数组集合长度
int count = ff.Length;
for (int i = 0; i< count;i++)
{
string FontName = ff[i].Name;
// 写入列表字体列表控件
toolStripComboBoxFonts.Items.Add(FontName);
}
}
// 加粗按钮
private void toolStripButtonBold_Click(object sender, EventArgs e)
{
// 判断当前字体是否加粗
if(textBoxNote.Font.Bold == false)
{
textBoxNote.Font = new Font(textBoxNote.Font, FontStyle.Bold);
}
else
{
// 如果是已经是加粗,则改为普通文本
textBoxNote.Font = new Font(textBoxNote.Font, FontStyle.Regular);
}
}
// 倾斜按钮
private void toolStripButtonItalic_Click(object sender, EventArgs e)
{
if(textBoxNote.Font.Italic == false)
{
textBoxNote.Font = new Font(textBoxNote.Font, FontStyle.Italic);
}
else
{
textBoxNote.Font = new Font(textBoxNote.Font, FontStyle.Regular);
}
}
// 改变字体列表索引触发事件
private void toolStripComboBoxFonts_SelectedIndexChanged(object sender, EventArgs e)
{
string fontName = toolStripComboBoxFonts.Text;
float fontSize = float.Parse(toolStripComboBoxSize.Text);
// 改变字体和字号
textBoxNote.Font = new Font(fontName, fontSize);
}
// 改变字号列表索引触发事件
private void toolStripComboBoxSize_SelectedIndexChanged(object sender, EventArgs e)
{
string fontName = toolStripComboBoxFonts.Text;
float fontSize = float.Parse(toolStripComboBoxSize.Text);
// 改变字体和字号
textBoxNote.Font = new Font(fontName, fontSize);
}
// 改变字号触发事件(手动填写)
private void toolStripComboBoxSize_TextChanged(object sender, EventArgs e)
{
string fontName = toolStripComboBoxFonts.Text;
float fontSize = float.Parse(toolStripComboBoxSize.Text);
textBoxNote.Font = new Font(fontName, fontSize);
}
// 保存按钮
private void toolStripButtonSave_Click(object sender, EventArgs e)
{
// 当前内容不为空
if(textBoxNote.Text.Trim() != "")
{
if(this.Text == "新建文本(未保存)")
{
// 创建筛选器,指定保存文件的类型
saveFileDialog1.Filter = ("文本文档(*.txt)|*.txt");
// 判断用户选择的是保存按钮还是取消按钮
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
// 获取用户选择路径
string path = saveFileDialog1.FileName;
// 保存文件到指定路径
StreamWriter sw = new StreamWriter(path, false);
sw.WriteLine(textBoxNote.Text.Trim());
// 清空缓存
sw.Flush();
sw.Close();
// 保存后将窗体标题改为路径,表示当前文件已保存
this.Text = path;
}
}
else
{
string path = this.Text;
// 判断路径前面是否带*
if (path.Substring(0, 1) == "*")
{
path = path.Remove(0, 1);
}
StreamWriter sw = new StreamWriter(path, false);
sw.WriteLine(textBoxNote.Text.Trim());
sw.Flush();
sw.Close();
// 保存后将路径星号去掉,表示当前文件已保存
this.Text = path;
}
}
else
{
MessageBox.Show("当前文本框内容为空!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// 打开按钮
private void toolStripButtonOpen_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = ("文本文档(*.txt)|*.txt");
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
// 获取打开文件的路径
string path = openFileDialog1.FileName;
// 指定打开文件路径及编码
StreamReader sr = new StreamReader(path, Encoding.UTF8);
string text = sr.ReadToEnd();
textBoxNote.Text = text;
sr.Close();
// 将窗体标题改为打开文件路径
this.Text = path;
}
}
// 当文本内容发生改变时触发事件
private void textBoxNote_TextChanged(object sender, EventArgs e)
{
if(this.Text != "新建文本(未保存)" && this.Text.Substring(0,1)!= "*")
{
this.Text = "*" + this.Text;
}
}
// 新建按钮
private void toolStripButtonCreate_Click(object sender, EventArgs e)
{
this.Text = "新建文本(未保存)";
textBoxNote.Text = "";
}
// 窗体关闭事件
private void FrmChild_FormClosing(object sender, FormClosingEventArgs e)
{
if(textBoxNote.Text.Trim() != "")
{
string path = this.Text;
if(path== "新建文本(未保存)" || path.Substring(0, 1) == "*")
{
// 获取弹出框的返回值
DialogResult dr = MessageBox.Show("当前文本内容未保存!请确认是否退出?",
"信息提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if(dr == DialogResult.Yes)
{
// 释放窗体占用的所有资源(退出)
this.Dispose();
}
else
{
// 取消操作
e.Cancel = true;
}
}
}
}
3、父窗体控件触发事件代码
添加 MenuStrip 显示按功能分组的应用程序命令和选项
// 新建
private void ToolStripMenuItemNew_Click(object sender, EventArgs e)
{
// 新建一个子窗体对象
FrmChild child = new FrmChild();
// 设置子窗体的父窗体
child.MdiParent = this;
// 打开子窗体
child.Show();
}
// 关闭
private void ToolStripMenuItemClose_Click(object sender, EventArgs e)
{
// 当前激活窗体对象
Form frm = this.ActiveMdiChild;
frm.Close();
}
// 关闭所有
private void ToolStripMenuItemCloseAll_Click(object sender, EventArgs e)
{
// 历遍所有子窗体对象
foreach(Form form in this.MdiChildren)
{
Form frm = this.ActiveMdiChild;
frm.Close();
}
}
// 退出
private void ToolStripMenuItemExit_Click(object sender, EventArgs e)
{
this.Close();
}
4、总结
理解子窗体中各触发事件的逻辑关系,特别是【保存】功能的实现,需要判断文本是否新增,是否保存过。控件都使用都属于基础知识,纯属入门练手项目。