多文档界面 (MDI) 应用程序具有一个主窗口(父窗口),该窗口在其工作区内包含一组窗口(子窗口)。每个子窗口都是一个限制为只能在该父窗口内出现的窗体。这些子窗口通常共享父窗口界面的菜单栏、工具栏以及其他部分。如对话框之类的次要窗口不限制在父窗口的工作区中。
创建 MDI 应用程序
可以按下列步骤创建 MDI 应用程序:
创建一个表示 MDI 父窗口的 Form (MainForm),然后将其 IsMdiContainer 属性设置为 true。下面的代码演示如何设置此属性。
C# this.IsMdiContainer = true;
VB Me.IsMdiContainer = True
创建子窗体,然后设置每个窗体的 MdiParent 属性,以引用该父窗体。
下面的代码演示设置子窗体实例的 MDI 父窗体。
C# doc.MdiParent = this;
VB doc.MdiParent = Me
如果要显示不同类型的数据,可拥有多种类型的子窗体。
若要显示某个子窗体,请创建该子窗体的实例,然后调用其 Show 方法。
标准 MDI 菜单
通常,MDI 应用程序有一个“窗口”菜单,该菜单使用户得以通过平铺或层叠排列打开的子窗口。“窗口”菜单还使您得以定位到任何打开的子窗口。若要创建“窗口”菜单,请将要平铺和层叠的菜单项添加到父窗体的“窗口”菜单中,然后将顶级“窗口”菜单的 MdiList 属性设置为 true。下面的代码演示如何在 MDI 应用程序中创建 Windows(窗口)菜单。
C# ....
//Add Window Menu
MenuItem miWindow = mainMenu.MenuItems.Add("&Window");
miWindow.MenuItems.Add("&Cascade", new EventHandler(this.WindowCascade_Clicked));
miWindow.MenuItems.Add("Tile &Horizontal", new EventHandler(this.WindowTileH_Clicked));
miWindow.MenuItems.Add("Tile &Vertical", new EventHandler(this.WindowTileV_Clicked));
miWindow.MdiList = true ; //Adds the MDI Window List to the bottom of the menu
....
protected void WindowCascade_Clicked(object sender, System.EventArgs e) {
this.LayoutMdi(MdiLayout.Cascade);
}
protected void WindowTileH_Clicked(object sender, System.EventArgs e) {
this.LayoutMdi(MdiLayout.TileHorizontal);
}
protected void WindowTileV_Clicked(object sender, System.EventArgs e) {
this.LayoutMdi(MdiLayout.TileVertical);
}
....
VB
....
'Add Window Menu
Dim miWindow As MenuItem = mainMenu.MenuItems.Add("&Window")
miWindow.MenuItems.Add("&Cascade", AddressOf Me.WindowCascade_Clicked)
miWindow.MenuItems.Add("Tile &Horizontal", AddressOf Me.WindowTileH_Clicked)
miWindow.MenuItems.Add("Tile &Vertical", AddressOf Me.WindowTileV_Clicked)
miWindow.MdiList = true 'Adds the AxHosting Window List to the bottom of the menu
....
'Window->Cascade Menu item handler
Protected Sub WindowCascade_Clicked(sender As object, e As System.EventArgs)
Me.LayoutMdi(MdiLayout.Cascade)
End Sub
'Window->Tile Horizontally Menu item handler
Protected Sub WindowTileH_Clicked(sender As object, e As System.EventArgs)
Me.LayoutMdi(MdiLayout.TileHorizontal)
End Sub
'Window->Tile Vertically Menu item handler
Protected Sub WindowTileV_Clicked(sender As object, e As System.EventArgs)
Me.LayoutMdi(MdiLayout.TileVertical)
End Sub
....
子窗口激活
如果希望在用户激活子窗口时通知父窗体,可以为 MdiChildActivate 事件注册一个事件处理方法。可以使用 Form 类的 ActiveMdiChild 属性确定哪个子窗口是活动的。例如,下面的代码用子窗口的名称更新父窗体上的 StatusBar 控件。
.C# ...
this.MdiChildActivate += new EventHandler(this.MdiChildActivated);
....
protected void MdiChildActivated(object sender, System.EventArgs e) {
statusBar1.Text = this.ActiveMdiChild.Text;
}
....
.VB ...
AddHandler Me.MdiChildActivate, AddressOf Me.MdiChildActivated
....
Protected Sub MdiChildActivated(sender As object, e As System.EventArgs)
If (Me.ActiveMdiChild <> Nothing) Then statusBar1.Text = Me.ActiveMdiChild.Text
End Sub
....
菜单合并
如果子窗口有一组菜单项,您希望这些菜单项都出现在父窗口的主菜单中,则可以创建作为子窗口窗体的一部分的 MainMenu。当激活子窗口时,其 MainMenu 与父窗口的 MainMenu 合并。例如,下面的代码为每个子窗口创建一个 Format 菜单项。
C#
....
MainMenu mainMenu = new MainMenu();
this.Menu = mainMenu;
//Add Formatting Menu
MenuItem miFormat = mainMenu.MenuItems.Add("F&ormat (" + docName + ")");
miFormat.MergeType = MenuMerge.Add ;
//Font Face sub-menu
MenuItem miArial = new MenuItem("&Arial", new EventHandler(this.FormatFont_Clicked));
MenuItem miTimesNewRoman = new MenuItem("&Times New Roman",
new EventHandler(this.FormatFont_Clicked));
MenuItem miTahoma = new MenuItem("&Courier New", new EventHandler(this.FormatFont_Clicked));
miArial.Checked = true ;
miFormatFontChecked = miArial ;
miArial.DefaultItem = true ;
miFormat.MenuItems.Add( "Font &Face"
, new EventHandler(this.FormatFont_Clicked)
, (new MenuItem[]{ miArial, miTimesNewRoman, miTahoma }));
....
VB
....
Dim mainMenu As MainMenu = New MainMenu()
Me.Menu = mainMenu
'Add Formatting Menu
Dim miFormat As MenuItem = mainMenu.MenuItems.Add("F&ormat (" + docName + ")")
miFormat.MergeType = MenuMerge.Add
'Font Face sub-menu
Dim miArial As MenuItem = new MenuItem("&Arial", AddressOf Me.FormatFont_Clicked)
Dim miTimesNewRoman As MenuItem = new MenuItem("&Times New Roman", _
AddressOf Me.FormatFont_Clicked)
Dim miCourier As MenuItem = new MenuItem("&Courier New", AddressOf Me.FormatFont_Clicked)
miArial.Checked = true
miFormatFontChecked = miArial
miArial.DefaultItem = true
miFormat.MenuItems.Add( "Font &Face" _
, new EventHandler(AddressOf Me.FormatFont_Clicked) _
, (new MenuItem() {miArial, miTimesNewRoman, miCourier }))
....
默认情况下,子窗口菜单添加到父窗口中。可以使用 MergeOrder 和 MergeType 属性控制如何进行合并。例如,下面的代码创建名为 File 的子窗口菜单项,该菜单项与父窗口的 File 菜单项合并。
C#
....
Parent Form:
//Add File Menu
MenuItem miFile = mainMenu.MenuItems.Add("&File");
miFile.MergeOrder=0;
miFile.MergeType = MenuMerge.MergeItems;
MenuItem miAddDoc = new MenuItem("&Add Document",
new EventHandler(this.FileAdd_Clicked),
Shortcut.CtrlA);
miAddDoc.MergeOrder=100;
MenuItem miExit = new MenuItem("E&xit",
new EventHandler(this.FileExit_Clicked),
Shortcut.CtrlX);
miExit.MergeOrder=110;
miFile.MenuItems.Add(miAddDoc);
miFile.MenuItems.Add("-"); // Gives us a seperator
miFile.MenuItems.Add(miExit);
....
Child Form:
//Add File Menu
MenuItem miFile = mainMenu.MenuItems.Add("&File");
miFile.MergeType = MenuMerge.MergeItems;
miFile.MergeOrder = 0;
MenuItem miLoadDoc = miFile.MenuItems.Add( "&Load Document (" + docName + ")"
, new EventHandler(this.LoadDocument_Clicked));
miLoadDoc.MergeOrder = 105;
....
VB
....
Parent Form:
'Add File Menu
Dim miFile As MenuItem = mainMenu.MenuItems.Add("&File")
miFile.MergeOrder=0
miFile.MergeType = MenuMerge.MergeItems
Dim miAddDoc As MenuItem = new MenuItem("&Add Document", _
new EventHandler( AddressOf Me.FileAdd_Clicked), _
Shortcut.CtrlA)
miAddDoc.MergeOrder=100
Dim miExit As MenuItem = new MenuItem("E&xit", _
new EventHandler(AddressOf Me.FileExit_Clicked), _
Shortcut.CtrlX)
miExit.MergeOrder=110
miFile.MenuItems.Add(miAddDoc)
miFile.MenuItems.Add("-") ' Gives us a seperator
miFile.MenuItems.Add(miExit)
....
Child Form:
'Add File Menu
Dim miFile As MenuItem = mainMenu.MenuItems.Add("&File")
miFile.MergeType = MenuMerge.MergeItems
miFile.MergeOrder = 0
Dim miLoadDoc As MenuItem = miFile.MenuItems.Add( "&Load Document (" + docName + ")", _
AddressOf Me.LoadDocument_Clicked)
miLoadDoc.MergeOrder = 105
....
一个简单的 MDI 应用程序
Imports System Imports System.ComponentModel
Imports System.Drawing
Imports System.Windows.Forms
Namespace Microsoft.Samples.WinForms.VB.MDI
Public Class MainForm
Inherits System.Windows.Forms.Form
Private windowCount As Integer = 0
Public Sub New()
MyBase.New()
MainForm = Me
'此调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'设置 MDI 资料
Me.IsMdiContainer = True
'添加“文件”菜单
Dim miFile As MenuItem = MainMenu.MenuItems.Add("文件(&F)")
miFile.MergeOrder = 0
miFile.MergeType = MenuMerge.MergeItems
Dim miAddDoc As MenuItem = New MenuItem("添加文档(&A)", New EventHandler(AddressOf Me.FileAdd_Clicked), Shortcut.CtrlA)
miAddDoc.MergeOrder = 100
Dim miExit As MenuItem = New MenuItem("退出(&X)", New EventHandler(AddressOf Me.FileExit_Clicked), Shortcut.CtrlX)
miExit.MergeOrder = 110
miFile.MenuItems.Add(miAddDoc)
miFile.MenuItems.Add("-") ' 提供一个分隔符
miFile.MenuItems.Add(miExit)
'添加“窗口”菜单
Dim miWindow As MenuItem = MainMenu.MenuItems.Add("窗口(&W)")
miWindow.MergeOrder = 10
miWindow.MenuItems.Add("层叠(&C)", New EventHandler(AddressOf Me.WindowCascade_Clicked))
miWindow.MenuItems.Add("水平平铺(&H)", New EventHandler(AddressOf Me.WindowTileH_Clicked))
miWindow.MenuItems.Add("垂直平铺(&V)", New EventHandler(AddressOf Me.WindowTileV_Clicked))
miWindow.MdiList = True '向菜单底部添加 MDI 窗口列表
AddDocument() '添加初始文档
End Sub
'添加浏览器文档
Private Sub AddDocument()
windowCount = windowCount + 1
'创建窗体
Dim doc As Document = New Document("文档" + windowCount.ToString())
doc.MdiParent = Me '向该窗体设置其 MDI 父级
doc.Show() '显示窗体
End Sub
'“文件”->“添加”菜单项处理程序
Private Sub FileAdd_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
AddDocument()
End Sub
'“文件”->“退出”菜单项处理程序
Private Sub FileExit_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
Me.Close()
End Sub
'已激活其中一个 MDI 子窗口 - 将状态栏
'文本设置到窗口标题
Private Sub MDIChildActivated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MainForm.MDIChildActivate
If (Me.ActiveMdiChild Is Nothing) Then
statusBar1.Text = ""
Else
statusBar1.Text = Me.ActiveMdiChild.Text
End If
End Sub
'“窗口”->“层叠”菜单项处理程序
Private Sub WindowCascade_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
Me.LayoutMdi(MdiLayout.Cascade)
End Sub
'“窗口”->“水平平铺”菜单项处理程序
Private Sub WindowTileH_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
Me.LayoutMdi(MdiLayout.TileHorizontal)
End Sub
'“窗口”->“垂直平铺”菜单项处理程序
Private Sub WindowTileV_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
Me.LayoutMdi(MdiLayout.TileVertical)
End Sub
'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
#Region " Windows 窗体设计器生成的代码 "
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.Container
Private WithEvents mainMenu As System.Windows.Forms.MainMenu
Private WithEvents statusBar1 As System.Windows.Forms.StatusBar
Private WithEvents MainForm As System.Windows.Forms.Form
'注意:下面的过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改它。
'不要使用代码编辑器修改它。
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
Me.mainMenu = New System.Windows.Forms.MainMenu()
Me.statusBar1 = New System.Windows.Forms.StatusBar()
Me.Text = "MDI 示例"
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.Menu = mainMenu
Me.ClientSize = New System.Drawing.Size(450, 200)
statusBar1.BackColor = System.Drawing.SystemColors.Control
statusBar1.Location = New System.Drawing.Point(0, 180)
statusBar1.Size = New System.Drawing.Size(450, 20)
statusBar1.TabIndex = 1
Me.Controls.Add(statusBar1)
End Sub
#End Region
'运行此应用程序
'应用程序的主入口点
<STAThread()> Shared Sub Main()
System.Windows.Forms.Application.Run(New MainForm())
End Sub
End Class
End NameSpace
-----Imports System Imports System.ComponentModel
Imports System.Drawing
Imports System.Drawing.Text
Imports System.Windows.Forms
Namespace Microsoft.Samples.WinForms.VB.MDI
Public Class Document
Inherits System.Windows.Forms.Form
Private Class FontSizes
Public Shared Small As Single = 8F
Public Shared Medium As Single = 12F
Public Shared Large As Single = 24F
End Class
Private fontSize As Single = FontSizes.Medium
Private miFormatFontChecked As System.Windows.Forms.MenuItem
Private miFormatSizeChecked As System.Windows.Forms.MenuItem
Private miSmall As MenuItem
Private miMedium As MenuItem
Private miLarge As MenuItem
Private miSansSerif As MenuItem
Private miSerif As MenuItem
Private miMonoSpace As MenuItem
private currentFontFamily As FontFamily
private monoSpaceFontFamily As FontFamily
private sansSerifFontFamily As FontFamily
private serifFontFamily As FontFamily
Public Sub New(ByVal docName As String)
MyBase.New()
Document = Me
'此调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'初始化字体 - 使用一般字体以避免在操作
'系统的不同版本之间出现问题
monoSpaceFontFamily = new FontFamily (GenericFontFamilies.Monospace)
sansSerifFontFamily = new FontFamily (GenericFontFamilies.SansSerif)
serifFontFamily = new FontFamily (GenericFontFamilies.Serif)
currentFontFamily = sansSerifFontFamily
Me.Text = docName
richTextBox1.Text = docName
richTextBox1.Font = New System.Drawing.Font(currentFontFamily, fontSize)
'添加“文件”菜单
Dim miFile As MenuItem = MainMenu.MenuItems.Add("文件(&F)")
miFile.MergeType = MenuMerge.MergeItems
miFile.MergeOrder = 0
Dim miLoadDoc As MenuItem = miFile.MenuItems.Add("加载文档 ((&L)" + docName + ")", new EventHandler(AddressOf Me.LoadDocument_Clicked))
miLoadDoc.MergeOrder = 105
'添加“格式”菜单
Dim miFormat As MenuItem = MainMenu.MenuItems.Add("格式 ((&O)" + docName + ")")
miFormat.MergeType = MenuMerge.Add
miFormat.MergeOrder = 5
'“字体外观”子菜单
miSansSerif = New MenuItem("1.(&1)" + sansSerifFontFamily.Name, new EventHandler(AddressOf Me.FormatFont_Clicked))
miSerif = New MenuItem("2.(&2)" + serifFontFamily.Name, new EventHandler(AddressOf Me.FormatFont_Clicked))
miMonoSpace = New MenuItem("3.(&3)" + monoSpaceFontFamily.Name, new EventHandler(AddressOf Me.FormatFont_Clicked))
miSansSerif.Checked = True
miFormatFontChecked = miSansSerif
miSansSerif.DefaultItem = True
miFormat.MenuItems.Add("字体外观(&F)" _
, (New MenuItem() {miSansSerif, miSerif, miMonoSpace}))
'“字体大小”子菜单
miSmall = New MenuItem("小(&S)", new EventHandler(AddressOf Me.FormatSize_Clicked))
miMedium = New MenuItem("中(&M)", new EventHandler(AddressOf Me.FormatSize_Clicked))
miLarge = New MenuItem("大(&L)", new EventHandler(AddressOf Me.FormatSize_Clicked))
miMedium.Checked = True
miMedium.DefaultItem = True
miFormatSizeChecked = miMedium
miFormat.MenuItems.Add("字体大小(&S)" _
, (New MenuItem() {miSmall, miMedium, miLarge}))
End Sub
'“文件”->“加载文档”菜单项处理程序
Protected Sub LoadDocument_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
MessageBox.Show(Me.Text)
End Sub
'“格式”->“字体”菜单项处理程序
Protected Sub FormatFont_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
Dim miClicked As MenuItem = CType(sender, MenuItem)
miClicked.Checked = True
miFormatFontChecked.Checked = False
miFormatFontChecked = miClicked
If (miClicked Is miSansSerif) Then
currentFontFamily = sansSerifFontFamily
ElseIf (miClicked Is miSerif) Then
currentFontFamily = serifFontFamily
Else
currentFontFamily = monoSpaceFontFamily
End If
richTextBox1.Font = new Font(currentFontFamily, fontSize)
End Sub
'“格式”->“大小”菜单项处理程序
Protected Sub FormatSize_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
Dim miClicked As MenuItem = CType(sender, MenuItem)
miClicked.Checked = True
miFormatSizeChecked.Checked = False
miFormatSizeChecked = miClicked
If (miClicked Is miSmall) Then
fontSize = FontSizes.Small
ElseIf (miClicked Is miLarge) Then
fontSize = FontSizes.Large
Else
fontSize = FontSizes.Medium
End IF
richTextBox1.Font = New Font(currentFontFamily, fontSize)
End Sub
'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
#Region " Windows 窗体设计器生成的代码 "
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.Container
Private WithEvents richTextBox1 As System.Windows.Forms.RichTextBox
Private WithEvents mainMenu As System.Windows.Forms.MainMenu
Private WithEvents Document As System.Windows.Forms.Form
'注意:下面的过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改它。
'不要使用代码编辑器修改它。
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
Me.richTextBox1 = New System.Windows.Forms.RichTextBox()
Me.mainMenu = New System.Windows.Forms.MainMenu()
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.Menu = mainMenu
Me.ClientSize = New System.Drawing.Size(392, 117)
richTextBox1.Size = New System.Drawing.Size(292, 273)
richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill
richTextBox1.TabIndex = 0
Me.Controls.Add(richTextBox1)
End Sub
#End Region
End Class
End Namespace
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
public class MainForm : System.Windows.Forms.Form {
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components;
private System.Windows.Forms.MainMenu mainMenu;
protected internal System.Windows.Forms.StatusBar statusBar1;
private int windowCount = 0 ;
public MainForm() {
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//设置 MDI 资料
this.IsMdiContainer = true;
this.MdiChildActivate += new EventHandler( this.MDIChildActivated);
//添加“文件”菜单
MenuItem miFile = mainMenu.MenuItems.Add("文件(&F)");
miFile.MergeOrder=0;
miFile.MergeType = MenuMerge.MergeItems;
MenuItem miAddDoc = new MenuItem("添加文档(&A)", new EventHandler( this.FileAdd_Clicked), Shortcut.CtrlA);
miAddDoc.MergeOrder=100;
MenuItem miExit = new MenuItem("退出(&X)", new EventHandler( this.FileExit_Clicked), Shortcut.CtrlX);
miExit.MergeOrder=110;
miFile.MenuItems.Add(miAddDoc);
miFile.MenuItems.Add("-"); // Gives us a seperator
miFile.MenuItems.Add(miExit);
//添加“窗口”菜单
MenuItem miWindow = mainMenu.MenuItems.Add("窗口(&W)");
miWindow.MergeOrder = 10;
miWindow.MenuItems.Add("层叠(&C)", new EventHandler( this.WindowCascade_Clicked));
miWindow.MenuItems.Add("水平平铺(&H)", new EventHandler( this.WindowTileH_Clicked));
miWindow.MenuItems.Add("垂直平铺(&V)", new EventHandler( this.WindowTileV_Clicked));
miWindow.MdiList = true ; //向菜单底部添加 MDI 窗口列表
AddDocument(); //添加初始文档
}
//添加文档
private void AddDocument() {
windowCount++ ;
Document doc = new Document("文档" + windowCount);
doc.MdiParent = this;
doc.Show();
}
//“文件”->“添加”菜单项处理程序
protected void FileAdd_Clicked(object sender, System.EventArgs e) {
AddDocument() ;
}
//“文件”->“退出”菜单项处理程序
protected void FileExit_Clicked(object sender, System.EventArgs e) {
this.Close();
}
//已激活其中一个 MDI 子窗口
protected void MDIChildActivated(object sender, System.EventArgs e) {
if ( null == this.ActiveMdiChild) {
statusBar1.Text = "";
} else {
statusBar1.Text = this.ActiveMdiChild.Text;
}
}
//“窗口”->“层叠”菜单项处理程序
protected void WindowCascade_Clicked(object sender, System.EventArgs e) {
this.LayoutMdi(MdiLayout.Cascade);
}
//“窗口”->“水平平铺”菜单项处理程序
protected void WindowTileH_Clicked(object sender, System.EventArgs e) {
this.LayoutMdi(MdiLayout.TileHorizontal);
}
//“窗口”->“垂直平铺”菜单项处理程序
protected void WindowTileV_Clicked(object sender, System.EventArgs e) {
this.LayoutMdi(MdiLayout.TileVertical);
}
/// <summary>
/// 清理正在使用的所有资源。
/// </summary>
protected override void Dispose( bool disposing)
{
if (disposing) {
if (components != null) {
components.Dispose();
}
}
base.Dispose(disposing);
}
/// <summary>
/// 设计器支持所必需的方法,不要使用
/// 代码编辑器修改此方法的内容。
/// </summary>
protected void InitializeComponent()
{
this.components = new System.ComponentModel.Container ();
this.mainMenu = new System.Windows.Forms.MainMenu ();
this.statusBar1 = new System.Windows.Forms.StatusBar ();
this.Text = "MDI 示例";
this.AutoScaleBaseSize = new System.Drawing.Size (5, 13);
this.Menu = this.mainMenu;
this.ClientSize = new System.Drawing.Size (450, 200);
statusBar1.BackColor = System.Drawing.SystemColors.Control;
statusBar1.Location = new System.Drawing.Point (0, 180);
statusBar1.Size = new System.Drawing.Size (450, 20);
statusBar1.TabIndex = 1;
this.Controls.Add ( this.statusBar1);
}
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
public static void Main( string[] args) {
Application.Run(new MainForm());
}
}
}
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Text;
using System.Windows.Forms;
public class Document : System.Windows.Forms.Form {
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components;
private System.Windows.Forms.MainMenu mainMenu;
protected internal System.Windows.Forms.RichTextBox richTextBox1;
private struct FontSizes {
public static float Small = 8f;
public static float Medium = 12f;
public static float Large = 24f;
}
private float fontSize = FontSizes.Medium;
private MenuItem miFormatFontChecked;
private MenuItem miFormatSizeChecked;
private MenuItem miSmall ;
private MenuItem miMedium ;
private MenuItem miLarge ;
private MenuItem miSansSerif ;
private MenuItem miSerif ;
private MenuItem miMonoSpace ;
private FontFamily currentFontFamily ;
private FontFamily monoSpaceFontFamily;
private FontFamily sansSerifFontFamily;
private FontFamily serifFontFamily;
public Document( string docName) : base() {
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
// 初始化字体 - 使用一般字体以避免在操作
// 系统的不同版本之间出现问题
monoSpaceFontFamily = new FontFamily (GenericFontFamilies.Monospace);
sansSerifFontFamily = new FontFamily (GenericFontFamilies.SansSerif);
serifFontFamily = new FontFamily (GenericFontFamilies.Serif);
currentFontFamily = sansSerifFontFamily;
this.Text = docName;
richTextBox1.Font = new System.Drawing.Font(currentFontFamily, fontSize);
richTextBox1.Text = docName;
//添加“文件”菜单
MenuItem miFile = mainMenu.MenuItems.Add("文件(&F)");
miFile.MergeType = MenuMerge.MergeItems;
miFile.MergeOrder = 0;
MenuItem miLoadDoc = miFile.MenuItems.Add("加载文档 ((&L)" + docName + ")", new EventHandler( this.LoadDocument_Clicked));
miLoadDoc.MergeOrder = 105;
//添加“格式”菜单
MenuItem miFormat = mainMenu.MenuItems.Add("格式 ((&O)" + docName + ")");
miFormat.MergeType = MenuMerge.Add;
miFormat.MergeOrder = 5;
//“字体外观”子菜单
miSansSerif = new MenuItem("1.(&1)" + sansSerifFontFamily.Name, new EventHandler( this.FormatFont_Clicked));
miSerif = new MenuItem("2.(&2)" + serifFontFamily.Name, new EventHandler( this.FormatFont_Clicked));
miMonoSpace = new MenuItem("3.(&3)" + monoSpaceFontFamily.Name, new EventHandler( this.FormatFont_Clicked));
miSansSerif.Checked = true ;
miFormatFontChecked = miSansSerif ;
miSansSerif.DefaultItem = true ;
miFormat.MenuItems.Add( "字体外观(&F)"
, (new MenuItem[]{ miSansSerif, miSerif, miMonoSpace })
);
//“字体大小”子菜单
miSmall = new MenuItem("小(&S)", new EventHandler( this.FormatSize_Clicked));
miMedium = new MenuItem("中(&M)", new EventHandler( this.FormatSize_Clicked));
miLarge = new MenuItem("大(&L)", new EventHandler( this.FormatSize_Clicked));
miMedium.Checked = true ;
miMedium.DefaultItem = true ;
miFormatSizeChecked = miMedium ;
miFormat.MenuItems.Add( "字体大小(&S)"
, (new MenuItem[]{ miSmall, miMedium, miLarge })
);
}
//“文件”->“加载文档”菜单项处理程序
protected void LoadDocument_Clicked(object sender, System.EventArgs e)
{
MessageBox.Show( this.Text) ;
}
//“格式”->“字体”菜单项处理程序
protected void FormatFont_Clicked(object sender, System.EventArgs e) {
MenuItem miClicked = (MenuItem)sender;
miClicked.Checked = true;
miFormatFontChecked.Checked = false;
miFormatFontChecked = miClicked ;
if (miClicked == miSansSerif) {
currentFontFamily = sansSerifFontFamily ;
} else if (miClicked == miSerif) {
currentFontFamily = serifFontFamily ;
} else {
currentFontFamily = monoSpaceFontFamily ;
}
richTextBox1.Font = new Font(currentFontFamily, fontSize);
}
//“格式”->“大小”菜单项处理程序
protected void FormatSize_Clicked(object sender, System.EventArgs e) {
MenuItem miClicked = (MenuItem)sender;
miClicked.Checked = true;
miFormatSizeChecked.Checked = false;
miFormatSizeChecked = miClicked;
if (miClicked == miSmall) {
fontSize = FontSizes.Small ;
} else if (miClicked == miLarge) {
fontSize = FontSizes.Large ;
} else {
fontSize = FontSizes.Medium ;
}
richTextBox1.Font = new Font(currentFontFamily, fontSize);
}
/// <summary>
/// 清理正在使用的所有资源。
/// </summary>
protected override void Dispose( bool disposing)
{
if (disposing) {
if (components != null) {
components.Dispose();
}
}
base.Dispose(disposing);
}
/// <summary>
/// 设计器支持所必需的方法,不要使用
/// 代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.mainMenu = new System.Windows.Forms.MainMenu();
richTextBox1.Text = "";
richTextBox1.Size = new System.Drawing.Size(292, 273);
richTextBox1.TabIndex = 0;
richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.Text = "";
this.ClientSize = new System.Drawing.Size(392, 117);
this.Menu = mainMenu;
this.Controls.Add(richTextBox1);
}
}
}