快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

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

绘图如何改变
    您会注重到,Draw 方式与基类基本一样 -- 主要差别在于它调用了 Fill 方式,因为要完成绘制一个填充对象,所以需要对其进行填充。我们没有为绘制轮廓重写代码,而是再次调用了基类的方式:Visual Basic .NET 中的 MyBase.Draw(g) 或 C# 中的 base.Draw(g);。
  
    因为我们正在指派用于绘制轮廓的笔,因此需要使用 using 或 Try/Finally 和 Dispose 以确保快速释放 Windows 笔对象。(同样,假如异常确信所调用的方式不会引发非常,可以在完成笔的处理后,跳过非常处理,而只调用 Dispose。但我们必须调用 Dispose,无论是直接调用,还是通过 using 语句。
  
    实现 Fill 方式
    Fill 方式很简朴:指派一个画笔,然后在屏幕上填充对象 -- 并确保 Dispose 画笔。
  
    请注重,在 Visual Basic .NET 中,您必须明确指定实现一个接口的方式 (... Implements IFillable.Fill);而在 C# 中,实现接口中的方式或属性由方式或属性的签名确定(因为您编写了一个称为 Fill 的方式,该方式不返回任何内容并接受一个 Graphics,因此它必须是 IFillable.Fill 的实现)。异常希奇,Dr. GUI 通常喜欢简洁的编程结构(假如不可能通过简朴的编写完成),但实际上却倾向使用 Visual Basic 的语法,因为这种语法既清楚又灵活(Visual Basic 实现类中的方式名称不必与接口中的名称匹配,并且一个给定方式通常能够实现多个接口方式)。
  
    实现属性
  
    IFillable 接口还包含一个属性,从中可以 set 和 get 画笔颜色。(我们在 Change fills to hot pink [将填充色更改为粉红] 按钮处理程序中使用该属性。)
  
    为实现公开属性,我们需要一个私有或保护的字段。这里我们选择了保护字段,以便能够方便地从派生类(而不答应任何类)对其进行访问。
  
    具有该字段后,我们可以轻松地编写一个很简朴的 set 和 get 方式对以实现属性。
  
    请再次注重,在 Visual Basic .NET 中,必须明确指定所实现的属性。
  
    接口还是抽象 (MustInherit) 基类?
  
    在面向对象的编程中,最常见的争论之一就是,是使用抽象基类还是使用接口。
  
    接口可以提供一些额外的灵活性,但也要付出一定代价:对于实现该接口的每一个类,必须实现其中的所有内容。我们可以使用一个 helper 类来协助这项工作(稍后会提供一个相关示例),但您仍旧必须在所有地方实现所有内容。并且接口不能包含数据(虽然如此,与在 Brand J 的系统中不同,它们可以包含属性,因此它们可以看起来好象包含了数据)。
  
    在本例中,Dr. GUI 为 DShape 选择了使用一个抽象基类而不是一个接口,因为他不想在每个类中将数据作为属性重复实现。此外,还因为从 DShape 派生出的所有内容都是外形,由于可填充对象仍旧是外形,因而也可以进行填充。
  
    您的选择可能有所不同,但 Dr. GUI 认为他在此做出的选择异常准确。
  
    绘图对象的容器
    因为要重复绘制我们的对象(在 Windows 窗体版本中,每次都将绘制图像;在 ASP.NET 版本中,每次都将重新加载 Web 页),因此需要将它们放在一个容器中,以便能够反复访问它们。
  
    Dr. GUI 更进一步,将容器变得智能化,使其知道如何绘制所包含的对象。以下是这个容器类的 C# 代码:
  
  
    C#
  public class DShapeList {
  ArrayList wholeList = new ArrayList();
  ArrayList filledList = new ArrayList();
  
  public void Add(DShape d) {
  wholeList.Add(d);
  if (d is IFillable)
  filledList.Add(d);
  }
  
  public void DrawList(Graphics g) {
  if (wholeList.Count == 0)
  {
  Font f = new Font(\"Arial\", 10);
  g.DrawString(\"没有任何要绘制的内容;列表为空...\",
  f, Brushes.Gray, 50, 50);
  }
  else
  {
  foreach (DShape d in wholeList)
  d.Draw(g);
  }
  }
  
  public IFillable[] GetFilledList() {
  return (IFillable[])filledList.ToArray(typeof(IFillable));
  }
  }
  
  
    以下为等同类的 Visual Basic .NET 代码:
  
  
    Visual Basic
  
  .NET Public Class DShapeList
  Dim wholeList As New ArrayList()
  Dim filledList As New ArrayList()
  Public Sub Add(ByVal d As DShape)
  wholeList.Add(d)
  If TypeOf d Is IFillable Then filledList.Add(d)
  End Sub
  
  Public Sub DrawList(ByVal g As Graphics)
  If wholeList.Count = 0 Then
  Dim f As New Font(\"Arial\", 10)
  g.DrawString(\"没有任何要绘制的内容;列表为空...\", _
  f, Brushes.Gray, 50, 50)
  Else
  Dim d As DShape
  For Each d In wholeList
  d.Draw(g)
  Next
  End If
  End Sub
  
  Public Function GetFilledList() As IFillable()
  Return filledList.ToArray(GetType(IFillable))
  End Function
  End Class 
返回类别: 教程
上一教程: 10天学会ASP.net之第九天
下一教程: 一个用Wsh来控制SqlServer的Dcom的VBs

您可以阅读与"ASP.NET可交互式位图窗体设计(4)"相关的教程:
· ASP.NET可交互式位图窗体设计(6)
· ASP.NET可交互式位图窗体设计(7)
· ASP.NET可交互式位图窗体设计(9)
· ASP.NET可交互式位图窗体设计(3)
· ASP.NET可交互式位图窗体设计(8)
    微笑服务 优质保证 索取样品