位置:海鸟网 > IT > ASP.NET >

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

在上篇文章“使用 C# 开发智能手机软件:推箱子(一)”中,我对推箱子程序作了总体介绍。这次,我先介绍 Common/Fcl.cs 源程序文件。

1 using System;
  2 using System.IO;
  3 using System.Drawing;
  4
  5 namespace Skyiv.Ben.PushBox.Common
  6 {
  7 /// 
  8 /// 这里是 .NET Framework 支持,而 .NET Compact Framework 不支持的东东
  9 /// 
  10 static class Fcl
  11 {
  12 /// 
  13 /// 获取为此环境定义的换行字符串。-- Environment
  14 /// 
  15 public static string NewLine { get { return "\r\n"; } }
  16
  17 /// 
  18 /// 打开一个文本文件,将文件的所有行读入一个字符串,然后关闭该文件。-- File
  19 /// 
  20 /// 要打开以进行读取的文件
  21 /// 包含文件所有行的字符串
  22 public static string ReadAllText(string path)
  23 {
  24 string text = "";
  25 if (File.Exists(path))
  26 {
  27 using (StreamReader sr = new StreamReader(path, Pub.Encode))
  28 {
  29 text = sr.ReadToEnd();
  30 }
  31 }
  32 return text;
  33 }
  34
  35 /// 
  36 /// 创建一个新文件,在其中写入指定的字符串,然后关闭该文件。-- File
  37 /// 
  38 /// 要写入的文件
  39 /// 要写入文件的字符串
  40 public static void WriteAllText(string path, string contents)
  41 {
  42 using (StreamWriter sw = new StreamWriter(path, false, Pub.Encode))
  43 {
  44 sw.Write(contents);
  45 }
  46 }
  47
  48 /// 
  49 /// 将指定的 Size 添加到指定的 Point。-- Point
  50 /// 
  51 /// 要添加的 Point
  52 /// 要添加的 Size
  53 /// 加法运算的结果
  54 public static Point Add(Point point, Size size)
  55 {
  56 return new Point(point.X + size.Width, point.Y + size.Height);
  57 }
  58
  59 /// 
  60 /// 将一维数组的大小更改为指定的新大小。-- Array
  61 /// 
  62 /// 数组元素的类型
  63 /// 要调整大小的一维数组
  64 /// 新数组的大小
  65 public static void Resize(ref T[] array, int newSize)
  66 {
  67 if (array != null && array.Length == newSize) return;
  68 if (array == null) array = new T[0];
  69 T[] newArray = new T[newSize];
  70 Array.Copy(array, newArray, Math.Min(array.Length, newArray.Length));
  71 array = newArray;
  72 }
  73 }
  74 }

  俗话说,工欲善其事,必先利其器。我们知道,Microsoft .NET Compact Framework 只是 Microsoft .NET Framework 的一个子集,她省略了一些不常用的功能。但是,如果我们恰好需要这些功能,只好自己重新实现一下了。这个 Fcl 静态类就是起这个作用的。源程序代码的注释已经写得很清楚了。

  Fcl.NewLine 我原本是想写成这样的:

static class Fcl
  {
  static static string newLine;
  /// 
  /// 获取为此环境定义的换行字符串。-- Environment
  /// 
  public static string NewLine
  {
  get
  {
  if (newLine == null)
  {
  newLine = (Environment.OSVersion.Platform != PlatformID.Unix) ? "\r\n" : "\n";
  }
  return newLine;
  }
  }
  }

  可惜的是,这段代码无法在 .NET Compact Framework 下通过编译(如果是 .NET Framework 则没有问题)。原因是 PlatformID 枚举的成员:

  Unix 操作系统为 Unix。

  Win32NT 操作系统为 Windows NT 或较新的版本。

  Win32S 操作系统为 Win32s(Win32 子集)类型。

  Win32Windows 操作系统为 Windows 95 或较新的版本。

  WinCE 操作系统为 Windows CE。

  PlatformID.Unix 并不被 .NET CF 所支持。这实在是一件很奇怪的事,既然 .NET CF 都支持 PlatformID 的 Win32NT、Win32S、Win32Windows、WinCE 成员,为什么就不能支持 Unix 成员呢?这样,这个程序将来要移植到 Linux 操作系统时就有些小麻烦了。

  要知道,这在主窗体的代码中用以下一段代码来实现在智能手机上禁用“前端显示”功能。

public partial class MainForm : Form
  {
  protected override void OnLoad(EventArgs e)
  {
  base.OnLoad(e);
  miTopMost.Enabled = (Environment.OSVersion.Platform != PlatformID.WinCE);
  env.LoadConfig();
  env.LoadGroup();
  LoadLevel(true);
  if (env.IsSave) Restore(env.Steps);
  }