⼩菜学习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小时内删除。
发表评论