银河

SKYIV STUDIO

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

这是“使用 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(33);
 43       this.btnEdit.Name = "btnEdit";
 44       this.btnEdit.Size = new System.Drawing.Size(7220);
 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(843);
 52       this.btnExportOrSave.Name = "btnExportOrSave";
 53       this.btnExportOrSave.Size = new System.Drawing.Size(7220);
 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(1653);
 61       this.btnImportOrCancel.Name = "btnImportOrCancel";
 62       this.btnImportOrCancel.Size = new System.Drawing.Size(7220);
 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(329);
 73       this.cbxGroup.Name = "cbxGroup";
 74       this.cbxGroup.Size = new System.Drawing.Size(23422);
 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(357);
 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(234208);
 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(240268);
 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# 开发智能手机软件:推箱子(二十)
返回目录
posted on 2007-10-17 20:26  银河  阅读(2785)  评论(6编辑  收藏  举报