银河

SKYIV STUDIO

  博客园 :: 首页 :: 博问 :: 闪存 :: :: :: 订阅 订阅 :: 管理 ::

这是“使用 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 <= 1return;
52       env.DeleteLastLevel();
53       miPrevLevel2OrSlot_Click(nullnull);
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# 开发智能手机软件:推箱子(二十二)
返回目录
posted on 2007-10-27 11:59  银河  阅读(2223)  评论(3编辑  收藏  举报