多文档窗体是一种应用非常广泛的窗体类型,即在主窗体中包含多个子窗体,并且子窗体不会显示在主窗体的外面。当子窗体不能完全显示在主窗体中时,主窗体会显示滚动条来调整可视范围。 程序运行后,单击“文件——新建”命令(快捷键:ctrl+N),就可以新建子窗体,如果在主窗体中同时有多个子窗体时,可以利用“窗口”菜单来管理。单击“窗口——层叠”命令,就可以层叠所有子窗体,单击“窗口——横向平铺”命令,就可以横向平铺子窗体,单击“窗口——竖向平铺”命令,就可以竖向平铺子窗体。此外还有“打开”、“保存”、“字体”、“页面设置”、“打印预览”等功能。
制作要点:
1、窗体的IsMdiCotainer属性的应用。
2.下拉菜单MenuStrip控件的应用。
3.状态栏StatusStrip控件的应用。4.打开对话框OpenFileDialog和保存对话框SaveFileDialog的应用。
5.页面设置对话框PageSetupDialog和页面打印控件PrintDocument的应用。
6.打印预览对话框PrintPreviewDialog的应用。
7.字体对话框FontDialog的应用。
8.日期时间对象DateTime的应用。
9.RichTextBox控件的应用。
10.剪贴板对象Clipboard的应用。
11.字符串流对象StringReader的应用。
制作步骤:
1.新建一个Windows窗体应用程序。设置"Text"属性为“MDI应用程序”,为了把该窗体变成多文档(MDI)应用程序的主窗体,就要把窗体的"IsMdiContainer"属性为"True"(注意,只有把普通窗体的IsMdiContainer属性设置为True,才能把窗体变成主窗体,才能设置其他窗体的MdiParent属性为该窗体)。
2.添加MenuStrip控件,在菜单栏中输入“文件(F)”,依次添加如下图:
3.如果要设置菜单的快捷键,只须设置菜单的"ShortcutKeys"属性即可。
4.添加"StatusStrip"控件,添加状态栏。单击左下角的下拉按钮,选择"StatusLabel"命令,在这里添加1个状态栏标签。设置其"Text"为“当前日期:”如图:
5.为了实现文件的动态打开。添加OpenFileDialog控件,为了实现文件的动态保存,添加SaveFileDialog控件。为了实现文件的页面设置功能,要添加PageSetupDialog控件和PrintDocument控件,要实现文件打开预览功能,要添加PrintPreviewDialog控件。为了实现选择文本的格式化设置,要添加FontDialog控件。
6。添加一个子窗体,“项目——添加Windows窗体”,设置其"Text"属性为“子窗体”,单击工具箱中的RichTextBox控件,然后按下鼠标左键在窗体上绘制,就可以添加到应用程序中。为了使其能充满整个窗体,设置"Dock"属性为"Fill",最后设置"Modifiers"属性为"Public",这样在现今Form2窗体对象实例时就可以利用该RichTextBox控件了。
添加代码:
1.双击Form1窗体,导入Sysem.IO命名空间:
using System.IO();
2.定义公用变量:
</pre><pre name="code" class="html">
//新建Form2对象实例
Form2 myf = new Form2();
//字符串流对象,一行一行读取文本
public StringReader MySreader;
//记录新建子窗体个数
public int x = 1;
3.双击窗体,添加:
private void Form1_Load(object sender, EventArgs e)
{
//显示当前日期与时间
toolStripStatusLabel2.Text = " 当前日期: " + DateTime.Now.ToString();
}
4.单击菜单栏总的“新建”等各个命令,添加代码如下:
private void 新建NCtrlNToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 myf = new Form2();
//设置为子窗体
myf.MdiParent = this;
//设置子窗体的标题
myf.Text = "新建文件" + x.ToString();
//状态栏提示信息
toolStripStatusLabel1.Text = "状态:新建文档";
x = x + 1;
//显示子窗体
myf.Show();
}
private void 打开OCtrlOToolStripMenuItem_Click(object sender, EventArgs e)
{
//设置打开对话框的文件类型
openFileDialog1.Filter = "*.txt|*.txt";
//设置打开对话框的标题
openFileDialog1.Title = "打开";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//提取打开文件的文件名
string strname = openFileDialog1.FileName;
//设置子窗体文件名
myf.Text = openFileDialog1.FileName;
//打开文件
myf.richTextBox1.Clear();
myf.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText);
//设置窗体为子窗体
myf.MdiParent = this;
//显示子窗体
myf.Show();
//状态栏提示信息
toolStripStatusLabel1.Text = toolStripStatusLabel1.Text + "打开文件";
}
}
private void 保存SCtrlSToolStripMenuItem_Click(object sender, EventArgs e)
{
//设置保存对话框类型
saveFileDialog1.Filter = "文本文件(*txt)|.txt";
saveFileDialog1.FilterIndex = 2;
//保存文件
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
myf.richTextBox1.SaveFile(saveFileDialog1.FileName,RichTextBoxStreamType.PlainText);
}
}
private void 页面设置VToolStripMenuItem_Click(object sender, EventArgs e)
{
//页面设置的内容
pageSetupDialog1.Document = this.printDocument1;
//页面设置对话框
pageSetupDialog1.ShowDialog();
}
要实现打开预览功能,首先双击printDocument1控件,添加:
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics frmGraphics = e.Graphics;
//设置字体类型
Font frmFont = myf.richTextBox1.Font;
//每一页的行数
float intpage = e.MarginBounds.Height;
frmFont.GetHeight(frmGraphics);
//打印的行数计数
int intPratn = 0;
//打印时的纵坐标
float fYposition = 0;
float fLeft = e.MarginBounds.Left;
float fTop = e.MarginBounds.Top;
string strfrmling = "";
while((intPratn<intpage)&&(strfrmling=MySreader.ReadLine())!=null)
{
fYposition = fTop + intPratn * frmFont.GetHeight(frmGraphics);
frmGraphics.DrawString(strfrmling,frmFont,new SolidBrush(Color.Black),fLeft,fYposition,new StringFormat());
intPratn++;
}
if (strfrmling != null)
{
//没有打印完发出下一页打印事件
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}
}
其他命令:
private void 打印预览PToolStripMenuItem_Click(object sender, EventArgs e)
{
printPreviewDialog1.Document = printDocument1;
//打印预览内容
MySreader = new StringReader(myf.richTextBox1.Text);
try
{
//打印预览对话框
printPreviewDialog1.ShowDialog();
}
catch
{
printDocument1.PrintController.OnEndPrint(printDocument1,new System.Drawing.Printing.PrintEventArgs());
}
}
private void 退出QToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
Application.Exit();
}
private void 剪切TToolStripMenuItem_Click(object sender, EventArgs e)
{
int CutInt = myf.richTextBox1.SelectionStart;
Clipboard.SetDataObject(myf.richTextBox1.SelectedText);
myf.richTextBox1.Text = myf.richTextBox1.Text.Substring(0, CutInt) + myf.richTextBox1.Text.Substring(CutInt,myf.richTextBox1.SelectedText.Length);
myf.richTextBox1.SelectionStart = CutInt;
}
private void 复制ToolStripMenuItem_Click(object sender, EventArgs e)
{
//复制选择文本
Clipboard.SetDataObject(myf.richTextBox1.SelectedText);
}
private void 粘贴PToolStripMenuItem_Click(object sender, EventArgs e)
{
IDataObject idat = Clipboard.GetDataObject();
if (idat.GetDataPresent(DataFormats.Text))
{
string PasteStr = (string)idat.GetData(DataFormats.Text);
int pasteid = myf.richTextBox1.SelectionStart;
myf.richTextBox1.Text = myf.richTextBox1.Text.Substring(0, pasteid) + PasteStr + myf.richTextBox1.Text.Substring(pasteid);
myf.richTextBox1.SelectionStart = pasteid + PasteStr.Length;
}
}
private void 全选AToolStripMenuItem_Click(object sender, EventArgs e)
{
//全选文本
myf.richTextBox1.SelectAll();
}
private void 字体FToolStripMenuItem_Click(object sender, EventArgs e)
{
fontDialog1.ShowDialog();
fontDialog1.AllowVerticalFonts = true;
fontDialog1.FixedPitchOnly = true;
fontDialog1.ShowApply = true;
fontDialog1.ShowEffects = true;
if (myf.richTextBox1.SelectedText == "")
{
//设置所有文本字体属性
myf.richTextBox1.Font = fontDialog1.Font;
}
else
{
//设置选择文本字体属性
myf.richTextBox1.SelectionFont = fontDialog1.Font;
}
}
private void 层叠AToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.Cascade);
}
private void 横向平铺FToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.TileHorizontal);
}
private void 竖向平铺HToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.TileVertical);
}
private void 图标排列TToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.ArrangeIcons);
}