在上篇文章“使用 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);
}