⼩菜学习Winform(四)MDI窗体(附⽰例)
  在做winfrom项⽬的时候我们可能会⽤到嵌套窗体,就是说⼀个容器中有多个窗体,可以分别管理和应⽤这些窗体,中提供了⼀种机制就是MDI,可能⼤家都会⽤,这边就简单的介绍下。
  winfrom中怎么⽤MDI呢,其实只要设置窗体的⼀个属性就可以了:
  IsMdiContainer属性设置为true就表⽰该窗体为MDI窗体,很简单,那我们可以在窗体加载的时候这些写:
1private void Form1_Load(object sender, EventArgs e)
2        {
3            Form childForm1 = new Form();
4            childForm1.Text = "窗⼝1";
5            childForm1.MdiParent = this;
6            childForm1.Show();
7
8            Form childForm2 = new Form();
9            childForm2.Text = "窗⼝2";
10            childForm2.MdiParent = this;
11            childForm2.Show();
12        }
  childForm1.MdiParent = this;这句代码的意思就是设置⼦窗体的MDI⽗窗体为本窗体,看下运⾏效果:
  关于MDI相关的⽅法主要是窗体的布局⽅法LayoutMdi(),参数是MdiLayout枚举:
成员名称说明
ArrangeIcons所有 MDI ⼦图标均排列在 MDI ⽗窗体的⼯作区内。
Cascade所有 MDI ⼦窗⼝均层叠在 MDI ⽗窗体的⼯作区内。
TileHorizontal所有 MDI ⼦窗⼝均⽔平平铺在 MDI ⽗窗体的⼯作区内。
代码编辑器怎么下载TileVertical所有 MDI ⼦窗⼝均垂直平铺在 MDI ⽗窗体的⼯作区内。
  LayoutMdi(MdiLayout.Cascade);效果:
  LayoutMdi(MdiLayout.TileHorizontal);效果:
仿
  我们在办公的时候可能都⽤过Notepad++,很⽅便,其实Notepad++⾥⾯的窗体就有点MDI的感觉:
  我们也可以利⽤MDI做出类似的感效果,Notepad++是⽂本编辑器,⾥⾯每个窗体其实就是单独的Notepad,⾸先我们需要先建⼀个⽂件编辑器的窗体,其实就是⼀个RichTextBox控件,因为RichTextBox控件是富⽂本编辑器,所以我们可以进⾏字体和颜⾊的调整,调整字体和颜⾊⽤的是winfrom的组件,关于⽂本编辑器就不详述了,贴下代码:
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Text;
7using System.Windows.Forms;
8
9namespace MDINotepad
10 {
11public partial class NotepadForm : Form
12    {
13private int _currentCharIndex;
14
15#region Code segment for constructors.
16
17public NotepadForm()
18        {
19            InitializeComponent();
20        }
21
22public NotepadForm(string filePath): this()
23        {
24//判断⽂件的后缀名,不同的⽂件类型使⽤不同的参数打开。
25
26if (filePath.EndsWith(".rtf", true, null))
27                rtbEditor.LoadFile(filePath,
28                    RichTextBoxStreamType.RichText);
29else
30                rtbEditor.LoadFile(filePath,
31                    RichTextBoxStreamType.PlainText);
32
33            Text = filePath;
34        }
35
36#endregion
37
38#region Code segment for private operations.
39
40private void Save(string filePath)
41        {
42try
43            {
44//判断⽂件的后缀名,不同的⽂件类型使⽤不同的参数保存。
45
46if (filePath.EndsWith(".rtf", true, null))
47                    rtbEditor.SaveFile(filePath,
48                        RichTextBoxStreamType.RichText);
49else
50                    rtbEditor.SaveFile(filePath,
51                        RichTextBoxStreamType.PlainText);
52            }
53catch (Exception ex)
54            {
55                MessageBox.Show(ex.ToString());
56            }
57        }
58
59private void SaveAs()
60        {
61            sfdDemo.FilterIndex = Text.EndsWith(".rtf", true, null) ? 1 : 2;
62
63if (sfdDemo.ShowDialog() == DialogResult.OK)
64            {
65                Save(sfdDemo.FileName);
66                Text = sfdDemo.FileName;
67            }
68        }
69
70#endregion
71
72#region Code segment for event handlers.
73
74private void tsmiSaveFile_Click(object sender, EventArgs e)
75        {
76if (!System.IO.File.Exists(Text))
77                SaveAs();
78else
79                Save(Text);
80        }
81
82private void tsmiSaveAs_Click(object sender, EventArgs e)
83        {
84            SaveAs();
85        }
86
87private void tsmiBackColor_Click(object sender, EventArgs e)
88        {
89            cdDemo.Color = rtbEditor.SelectionBackColor;
90if (cdDemo.ShowDialog() == DialogResult.OK)
91            {
92                rtbEditor.SelectionBackColor = cdDemo.Color;
93            }
94        }
95
96private void rtbEditor_SelectionChanged(object sender, EventArgs e) 97        {
98if (rtbEditor.SelectionLength == 0)
99            {
100                tsmiBackColor.Enabled = false;
101                tsmiFont.Enabled = false;
102            }
103else
104            {
105                tsmiBackColor.Enabled = true;
106                tsmiFont.Enabled = true;
107            }
108        }
109
110private void tsmiFont_Click(object sender, EventArgs e)
111        {
112            fdDemo.Color = rtbEditor.SelectionColor;
113            fdDemo.Font = rtbEditor.SelectionFont;
114if (fdDemo.ShowDialog() == DialogResult.OK)
115            {
116                rtbEditor.SelectionColor = fdDemo.Color;
117                rtbEditor.SelectionFont = fdDemo.Font;
118            }
119        }
120
121private void pdEditor_PrintPage(object sender,
122            System.Drawing.Printing.PrintPageEventArgs e)
123        {
124//存放当前已经处理的⾼度
125
126float allHeight = 0;
127//存放当前已经处理的宽度
128
129float allWidth = 0;
130//存放当前⾏的⾼度
131float lineHeight = 0;
132//存放当前⾏的宽度
133float lineWidth = e.MarginBounds.Right - e.MarginBounds.Left;
134
135//当前页没有显⽰满且⽂件没有打印完,进⾏循环
136
137while (allHeight < e.MarginBounds.Height
138                && _currentCharIndex < rtbEditor.Text.Length)
139            {
140//选择⼀个字符
141
142                rtbEditor.Select(_currentCharIndex, 1);
143//获取选中的字体
144
145                Font currentFont = rtbEditor.SelectionFont;
146//获取⽂字的尺⼨
147
148                SizeF currentTextSize =
149                    e.Graphics.MeasureString(rtbEditor.SelectedText, currentFont);
150
151//获取的⽂字宽度,对于字母间隙可以⼩⼀些,
152//对于空格间隙可以⼤些,对于汉字间隙适当调整。
153
154if (rtbEditor.SelectedText[0] == '')
155                    currentTextSize.Width = currentTextSize.Width * 1.5f;
156else if (rtbEditor.SelectedText[0] < 255)
157                    currentTextSize.Width = currentTextSize.Width * 0.6f;
158else
159                    currentTextSize.Width = currentTextSize.Width * 0.75f;
160
161//初始位置修正2个像素,进⾏背景⾊填充
162
163                e.Graphics.FillRectangle(new SolidBrush(rtbEditor.SelectionBackColor), 164                   
e.MarginBounds.Left + allWidth + 2, e.MarginBounds.Top + allHeight, 165                    currentTextSize.Width, currentTextSize.Height);
166
167//使⽤指定颜⾊和字体画出当前字符
168
169                e.Graphics.DrawString(rtbEditor.SelectedText, currentFont,
170new SolidBrush(rtbEditor.SelectionColor),
171                    e.MarginBounds.Left + allWidth, e.MarginBounds.Top + allHeight); 172
173                allWidth += currentTextSize.Width;
174
175//获取最⼤字体⾼度作为⾏⾼
176
177if (lineHeight < currentFont.Height)
178                    lineHeight = currentFont.Height;
179
180//是换⾏符或当前⾏已满,allHeight加上当前⾏⾼度,
181//allWidth和lineHeight都设为0。
182
183if (rtbEditor.SelectedText == "\n"
184                    || e.MarginBounds.Right - e.MarginBounds.Left < allWidth)
185                {
186                    allHeight += lineHeight;
187                    allWidth = 0;
188                    lineHeight = 0;
189                }
190//继续下⼀个字符
191
192                _currentCharIndex++;
193            }
194
195//后⾯还有内容,则还有下⼀页
196
197if (_currentCharIndex < rtbEditor.Text.Length)
198                e.HasMorePages = true;
199else
200                e.HasMorePages = false;
201        }
202
203private void tsmiPrint_Click(object sender, EventArgs e)
204        {
205if (pdDemo.ShowDialog() == DialogResult.OK)
206            {
207//⽤户确定了打印机和设置后,进⾏打印。
208
209                pdEditor.Print();
210            }
211        }
212
213private void tsmiPageSetup_Click(object sender, EventArgs e)
214        {
215            psdDemo.ShowDialog();
216        }
217
218private void tsmiPrintPreview_Click(object sender, EventArgs e)
219        {
220            ppdDemo.ShowDialog();
221        }
222
223private void pdEditor_BeginPrint(object sender,
224            System.Drawing.Printing.PrintEventArgs e)
225        {
226            _currentCharIndex = 0;
227        }
228
229#endregion
230    }
231 }
View Code
  ⽂件编辑器做好了,下⾯就是主窗体,⾸先IsMdiContainer属性设置为true,在上⾯我们加下菜单:
  新建Notepad的代码:
1private void tsmiNewTxt_Click(object sender, EventArgs e)
2        {
3            NotepadForm childForm = new NotepadForm();
4            childForm.Text = "新建⽂本⽂档.txt";
5            childForm.MdiParent = this;
6            childForm.Show();
7        }
  运⾏效果:
  程序下载:
  附录:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。