这是“使用 C# 开发智能手机软件:推箱子” 系列文章的第十九篇。在这篇文章中,介绍 Window/TranDlg.cs 源程序文件。这个源程序文件包含 TranDlg 类,该类继承自 System.Windows.Forms.Form 类,表示推箱子的“转换”对话框。如下面两幅图所示:
我们先看看 TranDlg.Designer.cs 的源程序代码吧:
2 {
3 partial class TranDlg
4 {
5 /// <summary>
6 /// 必需的设计器变量。
7 /// </summary>
8 private System.ComponentModel.IContainer components = null;
9 private System.Windows.Forms.MainMenu mnuMain;
10
11 /// <summary>
12 /// 清理所有正在使用的资源。
13 /// </summary>
14 /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
15 protected override void Dispose(bool disposing)
16 {
17 if (disposing && (components != null))
18 {
19 components.Dispose();
20 }
21 base.Dispose(disposing);
22 }
23
24 #region Windows 窗体设计器生成的代码
25
26 /// <summary>
27 /// 设计器支持所需的方法 - 不要
28 /// 使用代码编辑器修改此方法的内容。
29 /// </summary>
30 private void InitializeComponent()
31 {
32 this.mnuMain = new System.Windows.Forms.MainMenu();
33 this.btnEdit = new System.Windows.Forms.Button();
34 this.btnExportOrSave = new System.Windows.Forms.Button();
35 this.btnImportOrCancel = new System.Windows.Forms.Button();
36 this.cbxGroup = new System.Windows.Forms.ComboBox();
37 this.tbxMsg = new System.Windows.Forms.TextBox();
38 this.SuspendLayout();
39 //
40 // btnEdit
41 //
42 this.btnEdit.Location = new System.Drawing.Point(3, 3);
43 this.btnEdit.Name = "btnEdit";
44 this.btnEdit.Size = new System.Drawing.Size(72, 20);
45 this.btnEdit.TabIndex = 0;
46 this.btnEdit.Text = "编辑";
47 this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);
48 //
49 // btnExportOrSave
50 //
51 this.btnExportOrSave.Location = new System.Drawing.Point(84, 3);
52 this.btnExportOrSave.Name = "btnExportOrSave";
53 this.btnExportOrSave.Size = new System.Drawing.Size(72, 20);
54 this.btnExportOrSave.TabIndex = 1;
55 this.btnExportOrSave.Text = "导出";
56 this.btnExportOrSave.Click += new System.EventHandler(this.btnExportOrSave_Click);
57 //
58 // btnImportOrCancel
59 //
60 this.btnImportOrCancel.Location = new System.Drawing.Point(165, 3);
61 this.btnImportOrCancel.Name = "btnImportOrCancel";
62 this.btnImportOrCancel.Size = new System.Drawing.Size(72, 20);
63 this.btnImportOrCancel.TabIndex = 2;
64 this.btnImportOrCancel.Text = "导入";
65 this.btnImportOrCancel.Click += new System.EventHandler(this.btnImportOrCancel_Click);
66 //
67 // cbxGroup
68 //
69 this.cbxGroup.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
70 | System.Windows.Forms.AnchorStyles.Right)));
71 this.cbxGroup.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
72 this.cbxGroup.Location = new System.Drawing.Point(3, 29);
73 this.cbxGroup.Name = "cbxGroup";
74 this.cbxGroup.Size = new System.Drawing.Size(234, 22);
75 this.cbxGroup.TabIndex = 3;
76 //
77 // tbxMsg
78 //
79 this.tbxMsg.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
80 | System.Windows.Forms.AnchorStyles.Left)
81 | System.Windows.Forms.AnchorStyles.Right)));
82 this.tbxMsg.Location = new System.Drawing.Point(3, 57);
83 this.tbxMsg.Multiline = true;
84 this.tbxMsg.Name = "tbxMsg";
85 this.tbxMsg.ReadOnly = true;
86 this.tbxMsg.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
87 this.tbxMsg.Size = new System.Drawing.Size(234, 208);
88 this.tbxMsg.TabIndex = 4;
89 //
90 // TranDlg
91 //
92 this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
93 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
94 this.AutoScroll = true;
95 this.ClientSize = new System.Drawing.Size(240, 268);
96 this.Controls.Add(this.tbxMsg);
97 this.Controls.Add(this.cbxGroup);
98 this.Controls.Add(this.btnImportOrCancel);
99 this.Controls.Add(this.btnExportOrSave);
100 this.Controls.Add(this.btnEdit);
101 this.Menu = this.mnuMain;
102 this.Name = "TranDlg";
103 this.Text = "转换 - 推箱子";
104 this.ResumeLayout(false);
105
106 }
107
108 #endregion
109
110 private System.Windows.Forms.Button btnEdit;
111 private System.Windows.Forms.Button btnExportOrSave;
112 private System.Windows.Forms.Button btnImportOrCancel;
113 private System.Windows.Forms.ComboBox cbxGroup;
114 private System.Windows.Forms.TextBox tbxMsg;
115 }
116 }
注意上面的源程序代码第 71 行(这一行语句也可以放在 TranDlg 类的 OnLoad 方法中):
是我自己动手添加的,而不是 Visual Studio 2005 IDE 自动生成的。这是为什么呢?这里 cbxGroup 是一个用来选择“组”的 ComboBox 控件,我希望她的样式是 DropDownList ,即“用户不能直接编辑文本部分。用户必须单击箭头按钮来显示列表部分”。在 Windows Mobile 平台上这是默认的样式,也就是说 Visual Studio 2005 IDE 是不会自动生成这行语句的。当然,这在 Windows Moblie 平台上是没有问题的,因为这本身就是默认的样式。但是,在 Windows 桌面平台上,默认的样式是 DropDown ,即“文本部分可编辑。用户必须单击箭头按钮来显示列表部分”。因为推箱子程序也需要在 Windows 桌面平台上运行,所以就必须自己动手添加这行语句了。请参阅 MSDN 文档:
另外,请看看 Visual Studio 2005 IDE 设计器中的两幅图:
左边的就是推箱子程序的 Windows Mobile 平台,可以看到 DropDownList 不是粗体,表示她是默认值,Visual Studio 2005 IDE 不会为她生成代码。右边的是用来对照的 Windows 桌面平台,可以看到 DropDownList 是粗体,表示她不是默认值,Visual Studio 2005 IDE 会为她生成代码。
下面来看看 TranDlg.cs 的源程序代码吧:
2 using System.IO;
3 using System.Windows.Forms;
4 using Skyiv.Ben.PushBox.Common;
5
6 namespace Skyiv.Ben.PushBox.Window
7 {
8 /// <summary>
9 /// “转换”对话框
10 /// </summary>
11 public partial class TranDlg : Form
12 {
13 bool isEdit; // 是否处于编辑状态
14 int maxLevelSize;
15 DataFile db;
16
17 public string[] Groups { set { cbxGroup.DataSource = value; } }
18 public int MaxLevelSize { set { maxLevelSize = value; } }
19
20 public TranDlg(bool isTopMost)
21 {
22 InitializeComponent();
23 TopMost = isTopMost;
24 }
25
26 protected override void OnLoad(EventArgs e)
27 {
28 base.OnLoad(e);
29 db = new DataFile();
30 if (cbxGroup.Items.Count <= 0)
31 {
32 btnEdit.Enabled = btnExportOrSave.Enabled = btnImportOrCancel.Enabled = cbxGroup.Enabled = false;
33 tbxMsg.Text = "请先做“菜单 -> 数据 -> 配置”";
34 }
35 }
36
37 protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
38 {
39 if (isEdit)
40 {
41 MessageBox.Show("正在编辑,不能退出。请先“保存”或“放弃”。", "提醒");
42 e.Cancel = true;
43 }
44 else if (db != null) db.Dispose();
45 base.OnClosing(e);
46 }
47
48 private void btnEdit_Click(object sender, EventArgs e)
49 {
50 tbxMsg.Text = Fcl.ReadAllText(Path.Combine(Pub.TextDirectory, cbxGroup.SelectedItem + Pub.TextExtName));
51 cbxGroup.Enabled = false;
52 tbxMsg.ReadOnly = false;
53 isEdit = true;
54 btnEdit.Enabled = false;
55 btnExportOrSave.Text = "保存";
56 btnImportOrCancel.Text = "放弃";
57 }
58
59 private void btnExportOrSave_Click(object sender, EventArgs e)
60 {
61 SetEnable(false);
62 try
63 {
64 if (isEdit) Save(true);
65 else db.Export(cbxGroup.SelectedItem.ToString(), tbxMsg);
66 }
67 catch (Exception ex)
68 {
69 tbxMsg.Text += Pub.GetMessage(ex, false);
70 }
71 tbxMsg.Select(tbxMsg.Text.Length, 0);
72 tbxMsg.ScrollToCaret();
73 SetEnable(true);
74 }
75
76 private void btnImportOrCancel_Click(object sender, EventArgs e)
77 {
78 SetEnable(false);
79 try
80 {
81 if (isEdit) Save(false);
82 else db.Import(cbxGroup.SelectedItem.ToString(), maxLevelSize, tbxMsg);
83 }
84 catch (Exception ex)
85 {
86 tbxMsg.Text += Pub.GetMessage(ex, false);
87 }
88 tbxMsg.Select(tbxMsg.Text.Length, 0);
89 tbxMsg.ScrollToCaret();
90 SetEnable(true);
91 }
92
93 void SetEnable(bool isEnable)
94 {
95 btnEdit.Enabled = btnExportOrSave.Enabled = btnImportOrCancel.Enabled = cbxGroup.Enabled = isEnable;
96 Update();
97 }
98
99 void Save(bool isSave)
100 {
101 if (isSave)
102 {
103 if (!Directory.Exists(Pub.TextDirectory)) Directory.CreateDirectory(Pub.TextDirectory);
104 Fcl.WriteAllText(Path.Combine(Pub.TextDirectory, cbxGroup.SelectedItem + Pub.TextExtName), tbxMsg.Text);
105 }
106 tbxMsg.Text = isSave ? "游戏数据文本文件已经保存完毕" : "已经放弃编辑";
107 isEdit = false;
108 btnEdit.Enabled = true;
109 btnExportOrSave.Text = "导出";
110 btnImportOrCancel.Text = "导入";
111 cbxGroup.Enabled = true;
112 tbxMsg.ReadOnly = true;
113 }
114 }
115 }
几点说明:
- 覆盖基类 OnClosing 虚方法有两个目的:1.防止在“编辑”状态下关闭本对话框。2.关闭本对话框时清理在本对话框装入时(OnLoad 方法)分配的资源(DataFile 类)。
- “导出”和“导入”的实际工作都是在 DataFile 类中做的,分别调用了该类的 Export 和 Import 方法。请参阅“使用 C# 开发智能手机软件:推箱子(十)”。
上一篇:使用 C# 开发智能手机软件:推箱子(十八)
下一篇:使用 C# 开发智能手机软件:推箱子(二十)
返回目录