这是“使用 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;
}
}
上述代码片断展示了在推箱子游戏的主窗体上点击“菜单 -> 数据 -> 设计”时发生的事件:
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
几点说明:
- miDesign_Click 方法就是用来处理当用户在程序的主窗体中点击“菜单 -> 数据 -> 设计”时要采取的动作,她首先构造一个 DesignDlg 类(该类表示“设计”对话框),通过初始化该类的一些属性,将必要的参数(从表示“工作环境”的 Env 类中获得,参见“使用 C# 开发手机软件:推箱子(十一)”)传递进去,然后调用 DesignDlg 类的 ShowDialog 方法显示“设计”对话框。最后,如果用户在“设计”对话框中点击了“确定”按钮的话,就根据用户的选择进行相应的动作(调用 DeleteLastLevel 或 CreateOrEditLevel 方法)。
- DeleteLastLevel 方法用于删除最后一关,该方法实际上调用 Env 类的相应方法来进行工作。
- CreateOrEditLevel 方法用于新建一关或者编辑当前关,该方法实际上也是调用 Env 类的相应方法来进行工作。这时,整个程序进入“设计”模式,等待用户的动作。
- Design 方法处理在“设计”模式下, 鼠标点击时要采取的动作,该方法实际上还是调用 Env 类的相应方法来进行工作。
上一篇:
使用 C# 开发智能手机软件:推箱子(二十)
下一篇:
使用 C# 开发智能手机软件:推箱子(二十二)
返回目录