当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET可交互式位图窗体设计(2)

ASP.NET
asp.net GridView控件中模板列CheckBox全选、反选、取消
asp.net GridView 删除时弹出确认对话框(包括内容提示)
asp.net DropDownList 三级联动下拉菜单实现代码
asp DataTable添加列和行的三种方法
Asp.net 页面调用javascript变量的值
asp.net 长文章通过设定的行数分页
asp.net 定时间点执行任务的简易解决办法
asp.net 页面延时五秒,跳转到另外的页面
asp.net 动态输出透明gif图片
asp.net DataList与Repeater用法区别
asp.net Javascript获取CheckBoxList的value
asp.net程序在调式和发布之间图片路径问题的解决方法
asp.net下生成英文字符数字验证码的代码
asp.net 页面版文本框智能提示JSCode (升级版)
ASP.NET URL伪静态重写实现方法
ASP.NET 2.0 中Forms安全认证
asp.net 动态添加多个用户控件
asp.net Repeater显示父子表数据,无闪烁
asp.net 无法获取的内部内容,因为该内容不是文本 的解决方法
asp.net GridView排序简单实现

ASP.NET可交互式位图窗体设计(2)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 47 ::
收藏到网摘: n/a

我们的任务
  这个程序的基本思想如下:我们有一个 abstract 基类(在 Microsoft Visual Basic? 中是 MustInherit),其中包含公共数据(如边框)和一套虚拟方法,虚拟方法多数是抽象的(在 Visual Basic 中是 MustOverride),例如 Draw。请注意,Draw 的多态性很重要,因为每个可绘制对象类型(如点、线、矩形、圆等)都是用完全不同的代码绘制的。 
  
  虽然方法可以是多态的,但数据不能。因此,我们只将确实应用于所有可能的可绘制对象的数据放在程序中 -- 在本例中,放置了一个边框和颜色(在其中绘制对象的线)。 
  
  与特定类型的可绘制对象相关的数据(例如圆的中心和半径、矩形相对点的坐标,或者一条线的端点)都应该在与该类型的可绘制对象对应的特定类(从抽象基类中派生)中声明。请注意,可以使用二次派生合并相似的对象。例如,可以从椭圆中派生出圆,因为所有的圆都是椭圆。与此类似,也可以从矩形中派生出方形,因为所有的方形都是矩形(也都是四边形、多边形)。所选择的派生树会反映类之间的关系,以及常用的预期使用模式,这样您经常执行的操作便会非常快速、方便。 
     
  因为构造函数(在 Visual Basic 中为 New)存在的主要原因是用于初始化数据,因此构造函数不是(实际上也不能是)多态的。这意味着初始创建操作不能是多态的,因为数据要求随类型的不同而不同。但是,一个好的设计在对象创建后,可在之后的使用中将对象作为多态处理,这里我们就是这样做的。 
  
  让我们看看这个类集中包含什么,从根抽象基类开始: 
  
  抽象 (MustInherit) 基类
  以下是 C# 中抽象基类的代码。单击此处在新窗口中查看全部源文件。
  
  
  
    C#
  
  public abstract class DShape {
  public abstract void Draw(Graphics g);
  protected Rectangle bounding;
  protected Color penColor; // 还应具有属性
  // 还应具有移动、调整大小等方法。
  }
  
    以下是等同的 Visual Basic .NET 代码。单击此处在新窗口中查看全部源文件。
  
    Visual Basic .NET
  
  Public MustInherit Class DShape
  Public MustOverride Sub Draw(ByVal g As Graphics)
  Protected bounding As Rectangle
  Protected penColor As Color ' 还应具有属性
  ' 还应具有移动、调整大小等方法。
  End Class 
  
  语法虽然不同,但很明显这是相同的类。 
  
  请注意,Draw 方法被暗示为 virtual (Overridable),因为它被声明为 abstract (MustOverride)。还要注意在这个类中我们并没有提供一个实现。因为我们尚不知道在这个类中执行的对象,因此不可能写出绘图代码。 
  
  包含哪些数据?
  另请注意,这里并没有很多数据 -- 但我们已经为这样一个抽象类声明了所有数据。 
  
  每一个可绘制对象(无论其形状如何)都有一个边框 -- 即可以完全包含该对象的最小可能矩形。边框用于绘制点(作为很小的矩形)、长方形和圆 -- 并且对于其他形状,可以作为第一个用于点击或碰撞测试的快速估计。 
  
  适用于所有对象的其他共同点并没有很多;中心对于某些对象有用,例如圆和长方形,对于其他对象(如三角形)则没有意义。并且通常都是使用角来表示矩形,而不是使用中心。但您不能使用角来指定圆,因为圆没有角。Dr. GUI 确信您已经看到了为一个普通可绘制对象指定其他数据的困难之处。 
  
  每个可绘制对象还有一个与绘制它的线相关联的颜色,这里我们也做了声明。 
  
  某些派生类
  如上所述,我们不能真正创建一个抽象基类类型的对象,虽然我们可以将从抽象基类(或任何基类)中派生的任何对象作为基类对象处理。 
   
   所以,为创建一个绘图对象,我们必须从抽象基类中派生一个新类 -- 并确保覆盖所有 abstract/MustOverride 方法。
  
    在本例中我们将使用 DHollowCircle 类。DHollowRectangle 类和 DPoint 类非常相似。
  
    以下是 C# 中的 DHollowCircle。单击此处在新窗口中查看其他类。
  
  
    C#
  public class DHollowCircle : DShape
  {
  public DHollowCircle(Point p, int radiu