使用 C# 开发智能手机软件:推箱子(二十一)

这是“使用 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# 开发智能手机软件:推箱子(二十二)
返回目录
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值