这是“使用 C# 开发智能手机软件:推箱子” 系列文章的第二十一篇。在这篇文章中,介绍 Window/MainForm.Design.cs 源程序文件。这个源程序文件是 MainForm 类的一部分,该类继承自 System.Windows.Forms.Form 类,表示推箱子的主窗体。而本篇文章讲述的是推箱子“设计”的实际工作,如下图所示:
我们先看看 MainForm.Designer.cs 源程序文件(该文件是由 Visual Studio 2005 IDE 自动生成的)中和“设计”工作相关的部分:
namespace Skyiv.Ben.PushBox.Window
{
partial class MainForm
{
// 注意:省略了很多代码,仅保留和 miDesign 相关的部分。
private void InitializeComponent()
{
this.miDesign = new System.Windows.Forms.MenuItem();
this.miData.MenuItems.Add(this.miDesign);
this.miDesign.Text = "设计";
this.miDesign.Click += new System.EventHandler(this.miDesign_Click);
}
private System.Windows.Forms.MenuItem miDesign;
}
}
{
partial class MainForm
{
// 注意:省略了很多代码,仅保留和 miDesign 相关的部分。
private void InitializeComponent()
{
this.miDesign = new System.Windows.Forms.MenuItem();
this.miData.MenuItems.Add(this.miDesign);
this.miDesign.Text = "设计";
this.miDesign.Click += new System.EventHandler(this.miDesign_Click);
}
private System.Windows.Forms.MenuItem miDesign;
}
}
上述代码片断展示了在推箱子游戏的主窗体上点击“菜单 -> 数据 -> 设计”时发生的事件:
this.miDesign.Click += new System.EventHandler(this.miDesign_Click);
也就是弹出一个“设计”对话框(在上篇文章“使用 C# 开发智能手机软件:推箱子(二十)”中已经介绍过了),让用户选择“新建”、“编辑”、“删除”推箱子游戏的关卡。当用户选择完毕点击“确定”按钮后,实际发生的动作是在主窗体中完成的,由下面的 MainForm.Design.cs 源程序代码来实现:
1 using System;
2 using System.Drawing;
3 using System.Windows.Forms;
4 using Skyiv.Ben.PushBox.Common;
5
6 namespace Skyiv.Ben.PushBox.Window
7 {
8 partial class MainForm
9 {
10 void miDesign_Click(object sender, EventArgs e)
11 {
12 using (DesignDlg dlg = new DesignDlg(TopMost))
13 {
14 dlg.MaxLevelSize = env.MaxLevelSize;
15 dlg.LevelSize = env.LevelSize;
16 dlg.Level = env.Level;
17 dlg.MaxLelvel = env.MaxLevel;
18 if (dlg.ShowDialog() == DialogResult.OK)
19 {
20 env.Active = dlg.Active;
21 if (env.Active == Action.Delete) DeleteLastLevel();
22 else CreateOrEditLevel(dlg.IsCopy, dlg.LevelSize);
23 }
24 }
25 }
26
27 /// <summary>
28 /// 新建一关或者编辑当前关
29 /// </summary>
30 /// <param name="isCopy">新建时是否复制当前关</param>
31 /// <param name="size">新建关的尺寸</param>
32 void CreateOrEditLevel(bool isCopy, Size size)
33 {
34 if (env.Active == Action.Create)
35 {
36 env.NewLevel(isCopy, size);
37 if (Environment.OSVersion.Platform != PlatformID.WinCE)
38 ClientSize = env.GetClientSize(sbrMain.Visible ? sbrMain.Height : 0);
39 ClientSizeChanged();
40 }
41 env.Pen = Block.Land;
42 UpdateStatus();
43 }
44
45 /// <summary>
46 /// 删除最后一关
47 /// </summary>
48 void DeleteLastLevel()
49 {
50 env.Active = Action.None;
51 if (env.Level != env.MaxLevel - 1 || env.MaxLevel <= 1) return;
52 env.DeleteLastLevel();
53 miPrevLevel2OrSlot_Click(null, null);
54 }
55
56 /// <summary>
57 /// “设计”模式下, 鼠标点击时要采取的动作
58 /// </summary>
59 void Design()
60 {
61 Rectangle invalid;
62 if (!env.Design(out invalid)) return;
63 Invalidate(invalid);
64 UpdateStatus();
65 }
66 }
67 }
68
2 using System.Drawing;
3 using System.Windows.Forms;
4 using Skyiv.Ben.PushBox.Common;
5
6 namespace Skyiv.Ben.PushBox.Window
7 {
8 partial class MainForm
9 {
10 void miDesign_Click(object sender, EventArgs e)
11 {
12 using (DesignDlg dlg = new DesignDlg(TopMost))
13 {
14 dlg.MaxLevelSize = env.MaxLevelSize;
15 dlg.LevelSize = env.LevelSize;
16 dlg.Level = env.Level;
17 dlg.MaxLelvel = env.MaxLevel;
18 if (dlg.ShowDialog() == DialogResult.OK)
19 {
20 env.Active = dlg.Active;
21 if (env.Active == Action.Delete) DeleteLastLevel();
22 else CreateOrEditLevel(dlg.IsCopy, dlg.LevelSize);
23 }
24 }
25 }
26
27 /// <summary>
28 /// 新建一关或者编辑当前关
29 /// </summary>
30 /// <param name="isCopy">新建时是否复制当前关</param>
31 /// <param name="size">新建关的尺寸</param>
32 void CreateOrEditLevel(bool isCopy, Size size)
33 {
34 if (env.Active == Action.Create)
35 {
36 env.NewLevel(isCopy, size);
37 if (Environment.OSVersion.Platform != PlatformID.WinCE)
38 ClientSize = env.GetClientSize(sbrMain.Visible ? sbrMain.Height : 0);
39 ClientSizeChanged();
40 }
41 env.Pen = Block.Land;
42 UpdateStatus();
43 }
44
45 /// <summary>
46 /// 删除最后一关
47 /// </summary>
48 void DeleteLastLevel()
49 {
50 env.Active = Action.None;
51 if (env.Level != env.MaxLevel - 1 || env.MaxLevel <= 1) return;
52 env.DeleteLastLevel();
53 miPrevLevel2OrSlot_Click(null, null);
54 }
55
56 /// <summary>
57 /// “设计”模式下, 鼠标点击时要采取的动作
58 /// </summary>
59 void Design()
60 {
61 Rectangle invalid;
62 if (!env.Design(out invalid)) return;
63 Invalidate(invalid);
64 UpdateStatus();
65 }
66 }
67 }
68
几点说明:
- miDesign_Click 方法就是用来处理当用户在程序的主窗体中点击“菜单 -> 数据 -> 设计”时要采取的动作,她首先构造一个 DesignDlg 类(该类表示“设计”对话框),通过初始化该类的一些属性,将必要的参数(从表示“工作环境”的 Env 类中获得,参见“使用 C# 开发手机软件:推箱子(十一)”)传递进去,然后调用 DesignDlg 类的 ShowDialog 方法显示“设计”对话框。最后,如果用户在“设计”对话框中点击了“确定”按钮的话,就根据用户的选择进行相应的动作(调用 DeleteLastLevel 或 CreateOrEditLevel 方法)。
- DeleteLastLevel 方法用于删除最后一关,该方法实际上调用 Env 类的相应方法来进行工作。
- CreateOrEditLevel 方法用于新建一关或者编辑当前关,该方法实际上也是调用 Env 类的相应方法来进行工作。这时,整个程序进入“设计”模式,等待用户的动作。
- Design 方法处理在“设计”模式下, 鼠标点击时要采取的动作,该方法实际上还是调用 Env 类的相应方法来进行工作。
上一篇:使用 C# 开发智能手机软件:推箱子(二十)
下一篇:使用 C# 开发智能手机软件:推箱子(二十二)
返回目录