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

这是“使用 C# 开发智能手机软件:推箱子” 系列文章的第十九篇。在这篇文章中,介绍 Window/TranDlg.cs 源程序文件。这个源程序文件包含 TranDlg 类,该类继承自 System.Windows.Forms.Form 类,表示推箱子的“转换”对话框。如下面两幅图所示:

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

我们先看看 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 设计器中的两幅图:

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

左边的就是推箱子程序的 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# 开发智能手机软件:推箱子(二十)
返回目录

你可能感兴趣的:(开发)