实验06 Windows应用编程(2)
【实验目的】
- 掌握控件(Control)的基本属性、事件和方法的使用。
- 掌握消息框、通用对话框的设计。
- 掌握容器类控件的使用。
- 掌握菜单和工具栏的设计。
- 掌握多重窗体和多文档界面。
【实验内容】
以下9道实验题目最终效果,大家可运行“可执行文件”目录中各题。
//
//
//
//
//
1、设计一个如图6-1所示的窗体:该窗体中有一个图片框,显示一副图片。要求:
(1)在窗体打开时,动态加载图片(图片资源Penguins.jpg已经在项目内。大家也可用别的图片替换。方法为:自己找到一副图片,复制后,右击项目,选择“粘贴”命令,再选择粘贴过来的图片文件,右击,选择“属性”命令,修改“复制到输出目录”属性的值为“如果较新则复制”。另外,代码中图片名称也要相应修改);
(2)设置图片显示模式为根据图片框大小缩放图片;
(3)当鼠标停留在图片框时,显示如“北京风光”的文本提示(使用ToolTip控件)。
//鼠标移动上去之后显示的tooltip
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace test6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
pictureBox1.Image = Image.FromFile(Application.StartupPath + @"\timg.jpg");
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
toolTip1.SetToolTip(this.pictureBox1, "北京风光");
}
}
}
2、创建一个如图6-2所示的窗体。在窗体Load事件中动态添加一个文本为“结束”的按钮控件。实现功能:
单击按钮,打开如图中所示对话框。若单击“是”按钮,则程序结束,否则只是关闭消息框。
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace test6
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("确定要结束程序吗?[Yes|No]", "提示",MessageBoxButtons.YesNo,MessageBoxIcon.Warning);
if (DialogResult.No == dr) {
}
if (DialogResult.Yes == dr) {
Application.Exit();
}
}
}
}
3、创建一个如图6-3所示的窗体。在窗体Load事件中动态添加一个saveFileDialog、openFileDialog、文本框、两个按钮控件。文本框要求多行、带垂直滚动条。实现功能:
(1)单击打开按钮,可选择文本文件,并读取文件中内容,显示在文本框中。
(2)单击保存按钮,可将文本框中内容保存到一个文件。
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace test6
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog pd = new OpenFileDialog();
pd.InitialDirectory = "c:\\";
pd.Title = "请选择文本文件";
pd.Filter = "文本文件|*.txt";
pd.RestoreDirectory = true;
pd.FilterIndex = 1;
//pd.ShowDialog();
if (pd.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new StreamReader(pd.FileName,Encoding.GetEncoding("gb2312"));
string str = sr.ReadLine();
while (str != null) {
richTextBox1.AppendText(str);
richTextBox1.AppendText("\n");
str = sr.ReadLine();
}
}
}
private void button2_Click(object sender, EventArgs e)
{
SaveFileDialog sd = new SaveFileDialog();
sd.InitialDirectory = @"d:\";
sd.AddExtension = true;
sd.DefaultExt = ".txt";
sd.Filter = "文本文件|*.txt";
sd.FilterIndex = 1;
sd.Title = "保存文件";
if (sd.ShowDialog() == DialogResult.OK) {
StreamWriter sw = new StreamWriter(sd.FileName, true, Encoding.GetEncoding("gb2312"));
sw.Write(richTextBox1.Text);
sw.Close();
}
}
}
}
4、创建一个如图6-4所示的窗体。在窗体Load事件中动态添加一个colorDialog、一个标题为“颜色”的按钮控件。实现功能:
(1)单击颜色按钮,打开颜色对话框,将选择的颜色作为窗体背景色。
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace test6
{
public partial class Form4 : Form
{
public Form4()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ColorDialog cd = new ColorDialog();
cd.AllowFullOpen = true;
cd.FullOpen = true;
cd.Color = Color.DarkBlue;
if (cd.ShowDialog() != DialogResult.Cancel) {
this.BackColor = cd.Color;
this.button1.BackColor = cd.Color;
}
}
}
}
5、创建一个如图6-5所示的窗体。在窗体Load事件中动态添加一个fontDialog、一个标题为“打开字体对话框”的按钮控件、一个内容为“烟台大学”的标签。实现功能:
(1)单击按钮,打开字体对话框,将选择的字体作为标签字体。
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace test6
{
public partial class Form5 : Form
{
public Form5()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
FontDialog fd = new FontDialog();
fd.ShowColor = true;
fd.ShowApply = true;
fd.ShowDialog();
label1.Font = fd.Font;
label1.ForeColor = fd.Color;
}
}
}
6、创建一个如图6-6所示的窗体,并在窗体上放置一个标签、一个treeviw控件。窗体打开时,动态为treeviw控件添加节点,选择某个节点后,标签上显示所选内容。
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace test6
{
public partial class Form6 : Form
{
public Form6()
{
InitializeComponent();
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
this.label1.Text = e.Node.Text;
}
private void Form6_Load(object sender, EventArgs e)
{
this.treeView1.Nodes.Add("k0", "根节点");//创建根节点
//以下为创建子节点
this.treeView1.Nodes["k0"].Nodes.Add("k1", "n1");
this.treeView1.Nodes["k0"].Nodes.Add("k2", "n2");
this.treeView1.Nodes["k0"].Nodes.Add("k3", "n3");
this.treeView1.Nodes["k0"].Nodes["k1"].Nodes.Add("k11", "n11");
this.treeView1.Nodes["k0"].Nodes["k1"].Nodes.Add("k12", "n12");
this.treeView1.Nodes["k0"].Nodes["k1"].Nodes.Add("k13", "n13");
this.treeView1.ExpandAll();//展开所有节点
this.treeView1.ShowLines = true; //显示连线
}
}
}
7、设计如图6-7所示的窗体,当用户在ritchBox中单击鼠标右键时,弹出一个快捷菜单,单击某一城市,即可在富文本框ritchBox中显示该城市的旅游景点。
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace test6
{
public partial class Form7 : Form
{
public Form7()
{
InitializeComponent();
}
private void richTextBox1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
this.contextMenuStrip1.Show(MousePosition);
}
}
private void 北京ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Text = "天安门,天坛,故宫";
}
private void 南京ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Text = "小笼包";
}
private void 西安ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Text = "兵马俑";
}
private void 青岛ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Text= "啤酒";
}
private void 上海ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Text = "外滩,田子坊,东方明珠,金融中心";
}
}
}
8、设计如图6-8a所示的窗体。单击“开始游戏”按钮,随机给出一个[0,9]之间的整数。然后让你猜是什么数字。你可以随便猜一个数字,游戏会提示大小,从而缩小结果范围。经过几次猜测与提示后,最终猜中答案。
游戏设计思路:
(1)窗体打开时,文本框只读,即禁止在文本框标输入任何内容,且焦点在“开始游戏”按钮上。如图6-8a所示。
(2)点击“开始游戏”按钮,则①取消文本框只读;②但在文本框中只能输入09十种数字;③生成一个099的随机整数作为目标数,供游戏者猜。如图6-8b所示。
(3)游戏者在文本框标输入数字。若没猜中,给出大小提示,可以继续输入数字。如图6-8c所示。
(4)若猜中,也给出提示,清空文本框,且重新设置文本框为只读,如图6-8c所示。
(5)游戏者可以点击“结束”按钮结束程序,也可以点击“开始游戏”按钮开始新的一轮游戏,此时随机产生目标数字被重新生成。
//
//
//
//
//这里我默认输入数字之后按回车才进行确认提交数字的功能 老师给的题目并没有说清楚,输入数字之后,该窗口如何判断输入的数字和随机数的比较,读者们注意一下。
//
//
//
//
//
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace test6
{
public partial class Form8 : Form
{
private int randkey;
private int str;
public Form8()
{
InitializeComponent();
}
private void Form8_Load(object sender, EventArgs e)
{
this.textBox1.ReadOnly = true;
button1.TabIndex = 1;
}
private void button1_Click(object sender, EventArgs e)
{
this.textBox1.ReadOnly = false;
this.textBox1.Text=null;
Random rd = new Random();
randkey = rd.Next(0, 99);
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(e.KeyChar == '\b' || (e.KeyChar >= '0' && e.KeyChar <= '9')))
{
e.Handled = true;
str = Convert.ToInt32(textBox1.Text);
}
if (e.KeyChar == 13) {
if (str == randkey)
{
MessageBox.Show("猜中啦");
this.textBox1.ReadOnly = true;
}
if (str < randkey)
{
MessageBox.Show("小啦");
}
if (str > randkey)
{
MessageBox.Show("大啦");
}
}
}
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
//
//
//
//
//
//最后一个实验相当复杂,请仔细阅读
//
//
//
//
9、本实验要求设计5个窗体。分别为:一个登录窗体(frmLogin)、一个MDI主窗体(frmMain)和三个子窗体(frm子窗体1、frm子窗体2、frmHelp)。
设计思路:
(1)先创建5个窗体,按上面提示修改每个窗体的名称。
(2)按图6-9提示,修改Program.cs文件中Program类。
(3)登录窗体如图6-10所示。具体要求:标题为“登录窗体”、大小不可调;启动后自动位居屏幕中央;没有最小化、最大化、关闭按钮。
在登录窗体中,若输入用户名为“u1”,且密码为“123”(密码显示为),则通过登录。销毁登录窗体,同时打开如图6-11所示的主窗体。
否则,给出错误提示,如“用户名不能空”、“用户名错误”、“密码错误”等提示,如图6-12所示。
(4)主窗体界面如图6-11所示。主窗体中包含菜单(menuStrip1)、工具条、状态栏三个控件。提示:需要设置主窗体的IsMdiContainer属性,使之成为MDI窗体。
(5)当用户单击“打开窗体1”菜单项,或者单击“打开窗体1”工具按钮后,即可打开子窗体1,且该子窗体为主窗体子窗体。如图6-13中黄色窗体所示。
(6)当用户单击“打开窗体2”菜单项,或者单击“打开窗体2”工具按钮后,即可打开子窗体2,且该子窗体为主窗体子窗体。如图6-13蓝色窗体所示。
(6)当用户单击“垂直排列”菜单项,蓝色窗体和黄色窗体排列效果如图6-14所示。
(7)当用户单击“帮助”菜单项,蓝色窗体和黄色窗体随即关闭,同时帮助窗体打开,如图6-15所示。
注意:打开帮助窗体时,会自动关闭其他子窗体。此功能就是要求每次只打开一个子窗体。
(8)当用户单击“退出”菜单项,或者单击“结束程序”工具按钮后,弹出如图6-16所示的消息框。若单击“是”,则程序结束,若单击“否”,只是关闭消息框。
(9)注意:状态条中显示登录时用户名、文件菜单中分隔线、“退出”菜单项的快捷键和图标、三个工具按钮的提示和图标。*
代码实现:
//
//
//
首先
public static string getUser { get; set; }
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
frmLogin loginFrm = new frmLogin();
loginFrm.ShowDialog();
if (loginFrm.DialogResult == DialogResult.OK) {
Application.Run(new frmMain());
}
}
//注意:上述代码是写在program.cs中的 用于控制程序启动的入口
//
//
//
//
所有子窗口程序:
frmLogin.cs:
错误提示:
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace test6
{
public partial class frmLogin : Form
{
public static string str="";
public frmLogin()
{
InitializeComponent();
}
private void Form9_Load(object sender, EventArgs e)
{
this.MaximizeBox = false;
this.MinimizeBox = false;
this.ControlBox = false;
this.FormBorderStyle = FormBorderStyle.FixedDialog;
this.StartPosition = FormStartPosition.CenterScreen;
}
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "u1")
{
str = textBox1.Text;
if (textBox2.Text == "123")
{
this.Dispose();
frmMain FM = new frmMain();
FM.ShowDialog();
}
else
{
DialogResult dr = MessageBox.Show("密码错误", "密码验证", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question);
if (DialogResult.Cancel == dr)
{
}
if (DialogResult.Retry == dr)
{
textBox2.Text = null;
}
}
}
else if (textBox1.Text != "u1"&&textBox1.Text!="")
{
MessageBox.Show("用户名错误!");
}
else if (textBox1.Text == "")
{
MessageBox.Show("用户名不能为空");
}
}
}
}
//
//
//
//
//
frmMain.cs:
//具体窗口内部设计 请看老师给出的文档,这里我就直接上代码了
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace test6
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
private void frmMain_Load(object sender, EventArgs e)
{
toolStripButton1.Image = Image.FromFile(Application.StartupPath + @"\p1.png");
toolStripButton2.Image = Image.FromFile(Application.StartupPath + @"\p2.ico");
toolStripButton3.Image = Image.FromFile(Application.StartupPath + @"\Close.png");
this.退出AltXToolStripMenuItem.Image = Image.FromFile(Application.StartupPath + @"\key.ico");
this.toolStripStatusLabel1.Text = frmLogin.str;
}
private void toolStripButton3_Click(object sender, EventArgs e)
{
DialogResult dr= MessageBox.Show("确认退出吗?", "提示", MessageBoxButtons.YesNo,MessageBoxIcon.Information);
if (DialogResult.No == dr) {
}
if (DialogResult.Yes == dr) {
Application.Exit();
}
}
private void 打开窗体1ToolStripMenuItem_Click(object sender, EventArgs e)
{
frm子窗体1 f1=new frm子窗体1();
f1.MdiParent=this;
f1.Show();
}
private void 打开窗体2ToolStripMenuItem_Click(object sender, EventArgs e)
{
frm子窗体2 f2 = new frm子窗体2();
f2.MdiParent = this;
f2.Show();
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
frm子窗体1 f1 = new frm子窗体1();
f1.MdiParent = this;
f1.Show();
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
frm子窗体2 f2 = new frm子窗体2();
f2.MdiParent = this;
f2.Show();
}
private void 垂直排列ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.TileVertical);
}
private void 水平排列ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.TileHorizontal);
}
private void 退出AltXToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("确认退出吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (DialogResult.No == dr)
{
}
if (DialogResult.Yes == dr)
{
Application.Exit();
}
}
private void frmMain_KeyDown(object sender, KeyEventArgs e)
{
if ( e.Modifiers == Keys.Alt&&e.KeyCode == Keys.X )
{
DialogResult dr = MessageBox.Show("确认退出吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (DialogResult.No == dr)
{
}
if (DialogResult.Yes == dr)
{
Application.Exit();
}
}
}
private void 帮助ToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (var item in this.MdiChildren)
{
item.Dispose();
}
frmHelp f3 = new frmHelp();
f3.MdiParent = this;
f3.Dock = DockStyle.Fill;
f3.Show();
}
}
}
子窗体1和子窗体2.cs:
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace test6
{
public partial class frm子窗体1 : Form
{
public frm子窗体1()
{
InitializeComponent();
}
private void frm子窗体1_Load(object sender, EventArgs e)
{
this.BackColor = Color.Yellow;
}
}
}
//
//
//
//
//子窗体2代码和子窗体1一样 只不过背景颜色设置的不同
//
//
//
//
功能实现:
frmHelp.cs:
//
//
///
//
//
/
/
/
//注意,这体格窗口最重要的知识点是,无论你的窗口被你调节成多大。里面的内容总是同步跟随调节大小的,而不是呆在某一个特定的位置。
这里的这个特殊情况也是研究了很久
具体用到的就是停靠属性
/
//
//
//
///
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace test6
{
public partial class frmHelp : Form
{
public frmHelp()
{
InitializeComponent();
}
private void frmHelp_Load(object sender, EventArgs e)
{
string path=Application.StartupPath+@"/123.rtf";
richTextBox1.LoadFile(path, RichTextBoxStreamType.RichText);
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
}
}