这是“使用 C# 开发智能手机软件:推箱子 ” 系列文章的第十九篇。在这篇文章中,介绍 Window/TranDlg.cs 源程序文件。这个源程序文件包含 TranDlg 类,该类继承自 System.Windows.Forms.Form 类,表示推箱子的“转换”对话框。如下面两幅图所示:
我们先看看 TranDlg.Designer.cs 的源程序代码吧:
1
namespace
Skyiv.Ben.PushBox.Window
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 方法中):
71
this
.cbxGroup.DropDownStyle
=
System.Windows.Forms.ComboBoxStyle.DropDownList;
是我自己动手添加的,而不是 Visual Studio 2005 IDE 自动生成的。这是为什么呢?这里 cbxGroup 是一个用来选择“组”的 ComboBox 控件,我希望她的样式是 DropDownList ,即“用户不能直接编辑文本部分。用户必须单击箭头按钮来显示列表部分”。在 Windows Mobile 平台上这是默认的样式,也就是说 Visual Studio 2005 IDE 是不会自动生成这行语句的。当然,这在 Windows Moblie 平台上是没有问题的,因为这本身就是默认的样式。但是,在 Windows 桌面平台上,默认的样式是 DropDown ,即“文本部分可编辑。用户必须单击箭头按钮来显示列表部分”。因为推箱子程序也需要在 Windows 桌面平台上运行,所以就必须自己动手添加这行语句了。请参阅 MSDN 文档:
ComboBoxStyle 枚举
指定 ComboBox 样式。
命名空间: System.Windows.Forms
程序集: System.Windows.Forms(在 system.windows.forms.dll 中)
语法 (C#) public enum ComboBoxStyle
成员
成员名称
说明
.NET Compact Framework 提供支持
DropDown
文本部分可编辑。用户必须单击箭头按钮来显示列表部分。这是默认样式。
.NET Compact Framework 提供支持
DropDownList
用户不能直接编辑文本部分。用户必须单击箭头按钮来显示列表部分。只有在 AutoCompleteMode 为 Suggest 或 SuggestAppend 时才会显示列表。
Simple
文本部分可编辑。列表部分总可见。
备注
DropDownStyle 属性确定用户能否在文本部分中输入新值以及列表部分是否总显示。
Windows Mobile 2003 for Pocket PC、Windows Mobile 2003 for Smartphone 和 Windows CE 平台说明: 默认样式是 DropDownList 。
另外,请看看 Visual Studio 2005 IDE 设计器中的两幅图:
左边的就是推箱子程序的 Windows Mobile 平台,可以看到 DropDownList 不是粗体,表示她是默认值,Visual Studio 2005 IDE 不会为她生成代码。右边的是用来对照的 Windows 桌面平台,可以看到 DropDownList 是粗体,表示她不是默认值,Visual Studio 2005 IDE 会为她生成代码。
下面来看看 TranDlg.cs 的源程序代码吧:
1
using
System;
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# 开发智能手机软件:推箱子(二十)
返回目录