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

asp.net|交互|设计

我们的任务
    这个程序的基本思想如下:我们有一个 abstract 基类(在 Microsoft Visual Basic? 中是 MustInherit),其中包含公共数据(如边框)和一套虚拟方法,虚拟方法多数是抽象的(在 Visual Basic 中是 MustOverride),例如 Draw。请注意,Draw 的多态性很重要,因为每个可绘制对象类型(如点、线、矩形、圆等)都是用完全不同的代码绘制的。
  
    虽然方法可以是多态的,但数据不能。因此,我们只将确实应用于所有可能的可绘制对象的数据放在程序中 -- 在本例中,放置了一个边框和颜色(在其中绘制对象的线)。
  
    与特定类型的可绘制对象相关的数据(例如圆的中心和半径、矩形相对点的坐标,或者一条线的端点)都应该在与该类型的可绘制对象对应的特定类(从抽象基类中派生)中声明。请注意,可以使用二次派生合并相似的对象。例如,可以从椭圆中派生出圆,因为所有的圆都是椭圆。与此类似,也可以从矩形中派生出方形,因为所有的方形都是矩形(也都是四边形、多边形)。所选择的派生树会反映类之间的关系,以及常用的预期使用模式,这样您经常执行的操作便会非常快速、方便。
  
    以下是我们的类派生图:
  
  
  
  图 3:类派生图
  
    因为构造函数(在 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 radius, Color penColor) {
  p.Offset(-radius, -radius); // 需要转换到左上角
  int diameter = radius * 2;
  bounding = new Rectangle(p, new Size(diameter, diameter));
  this.penColor = penColor;
  }
  
  public override void Draw(Graphics g) {
  using (Pen p = new Pen(penColor)) {
  g.DrawEllipse(p, bounding);
  }
  }
  }
  
  
  以下是等同的 Visual Basic .NET 类。单击此处在新窗口中查看其他类。
  
  
  Visual Basic .NET
  Public Class DHollowCircle
  Inherits DShape
  
  Public Sub New(ByVal p As Point, ByVal radius As Integer, _
  ByVal penColor As Color)
  p.Offset(-radius, -radius) ' 需要转换到左上角
  Dim diameter As Integer = radius * 2
  bounding = New Rectangle(p, New Size(diameter, diameter))
  Me.penColor = penColor
  End Sub
  
  Public Overrides Sub Draw(ByVal g As Graphics)
  Dim p = New Pen(penColor)
  Try
  g.DrawEllipse(p, bounding)
  Finally
  p.Dispose()
  End Try
  End Sub
  End Class
  
  
    请注意,我们没有为这个类声明其他数据 -- 它给出的边框和笔已经足够了。(对于点和矩形是这样,但对于三角形和其他多边形就不够了。)我们的应用程序不需要在设置圆后知道圆的中心或半径,因此将它们忽略掉。(如果需要中心和半径,我们可以存储这些数据,或者根据边框计算得出。)
  
    但我们确实需要边框,因为它是用于绘制圆的 Graphics.DrawEllipse 方法的一个参数。因此我们根据在构造函数中传递的中心点和半径计算边框。
  
    下面我们深入了解每一个方法。

时间: 2024-10-29 16:48:19

ASP.NET可交互式位图窗体设计(2)的相关文章

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

asp.net|交互|设计 构造函数    构造函数传递三个参数:包含圆的中心坐标的点.圆的半径以及一个 System.Drawing.Color 结构(包含用于绘制圆轮廓的颜色).       然后我们根据中心和半径计算边框,并将笔颜色项设置为我们传递的颜色对象.       绘图代码    Draw 方法重载实际上非常简单:它根据我们保存在构造函数中的颜色对象创建一个笔对象,然后使用该笔,调用 Graphics.DrawEllipse 方法绘制圆,同时传递了我们早先创建的边框.      

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

asp.net|交互|设计 在页面和请求之间传递状态    为使应用程序能够工作,它需要能够维护请求之间的状态并将状态传递给绘图页面(如下所示).       维护和传递状态有多种方式.如果应用程序是严格的单页面应用程序(和以前的应用程序一样),则可以使用视图状态,其中数据被编码存储在 Web 页的隐藏输入字段中.       但是我们的图像控件是在单独的页面中进行绘图的,因此需要某些更灵活的东西.最好的选择就是 cookie 和会话状态.会话状态非常灵活,但要求使用服务器资源.浏览器可以保留

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

asp.net|交互|设计  绘图如何改变    您会注意到,Draw 方法与基类基本相同 -- 主要差别在于它调用了 Fill 方法,因为要完成绘制一个填充对象,所以需要对其进行填充.我们没有为绘制轮廓重写代码,而是再次调用了基类的方法:Visual Basic .NET 中的 MyBase.Draw(g) 或 C# 中的 base.Draw(g);.       因为我们正在指派用于绘制轮廓的笔,因此需要使用 using 或 Try/Finally 和 Dispose 以确保迅速释放 Win

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

asp.net|交互|设计 使我们的对象可序列化    为在 ASP.NET 中使用可绘制对象类,我们需要对其再进行一项更改.这些类需要是可序列化的,以便能够在主要的 Web 页和生成该图像的 Web 页之间传递数据(后面将详述).序列化是这样的过程:将某个类的数据以某种方式写入存储介质,以便存储和/或传递数据并在以后反序列化.反序列化是从序列化数据中重新创建对象的过程.我们会在将来的专栏中深入讨论这个问题.       Dr. GUI 最开始作为 Windows 窗体应用程序编写此应用程序时,

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

asp.net|交互|设计 在 Windows 窗体应用程序中使用可绘制对象    我们已经讨论了可绘制对象类,下面谈谈如何在 Windows 窗体应用程序中使用这些类.首先谈一下 Windows 窗体应用程序是怎样工作的.       Windows 窗体应用程序的主要部分    简单的 Windows 窗体应用程序包含一个主窗口(或窗体),其中包含控件子项.如果您是一位 Visual Basic 程序员,就会发现这个模型非常熟悉.       主窗口    任何 Windows 窗体应用程序

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

asp.net|交互|设计 按钮单击事件处理程序    接下来就是每个按钮的按钮单击事件处理程序.多数仅仅是向绘图列表中添加一个新的可绘制对象,然后调用 PictureBox 上的 Invalidate,从而使用更新的绘图列表进行重绘.典型的按钮事件处理程序代码如下所示:          C#   private void AddPoint_Click(object sender, System.EventArgs e) {   drawingList.Add(new DPoint(GetRa

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

asp.net|交互|设计 维护两个列表    因为我们要改变对象的填充颜色以实现 Change fill to hot pink 按钮,因此维护了两个可绘制对象列表:一个列表是全部对象,另一个列表是可填充对象.我们为这两个列表都使用了 ArrayList 类.ArrayList 对象包含一组 Object 引用 -- 这样一个 ArrayList 可以包含系统中任何类型的混合.       这实际上并没有什么帮助 -- 我们希望 ArrayList 仅仅包括可绘制/可填充对象.为此,我们将 A

ASP.NET创建Web服务之设计方针

asp.net|web|web服务|创建|设计 使用ASP.NET构造一个简单的XML Web服务是相对容易的,然而,XML Web服务的真正的强大的功能只有等你研究了基础结构以后才能领悟.XML Web服务是建立在.NET框架和公共语言运行时间基础上的.一个XML Web服务可以利用这些技术.例如,ASP.NET支持的性能.状态管理和验证全都可被用来构造XML Web服务. XML Web服务的基础结构是构建来符合象SOAP.XML和WSDL这样的行业标准,并且它允许其他的平台的客户端与XML

怎样在asp.net中嵌套winform窗体?

问题描述 怎样在asp.net中嵌套winform窗体?然后通过winform窗体来连接RFID来实现对读卡器进行读卡和写卡 解决方案 解决方案二: 解决方案三:两种方式1.ActiveX前提是浏览器认为你的控件是安全的2.WebBrowser自制浏览器用ObjectForScripting赋予脚本读写卡的方法然后Asp.Net里用脚本的external调用解决方案四:怎样在asp.net中嵌套winform窗体?答:不能.解决方案五:在server端引用之后调用部分功能是可以的.但在serve