帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统v4.6
栏 目:
 
您的位置:首页 > 技术文档 > ASP.NET编程 >
ASP.NET可交互式位图窗体设计(4)
作者:Microsoft 发布时间:2005-03-12 来源:ASPCOOL
     绘图如何改变
    您会注意到,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
  
  

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·带你走进ASP.NET(3)  (2005-03-12)
 ·带你走进ASP.NET(2)  (2005-03-12)
 ·带你走进ASP.NET(1)  (2005-03-12)
 ·使用ASP.NET开发移动通讯的几种方  (2005-03-12)
 ·ASP.NET可交互式位图窗体设计(9)  (2005-03-12)
 ·ASP.NET可交互式位图窗体设计(8)  (2005-03-12)
 ·ASP.NET可交互式位图窗体设计(7)  (2005-03-12)
 ·ASP.NET可交互式位图窗体设计(6)  (2005-03-12)
 ·ASP.NET可交互式位图窗体设计(5)  (2005-03-12)
 ·ASP.NET应用程序规划与设计(4)  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·帝国网站管理系统采集使用教程
·帝国网站管理系统模板制作教程
·帝国CMS模板下载
·Discuz6.0.1UC版通行证发布
·帝国网站管理系统之网站迁移教程
·帝国网站管理系统实例入门教程下载
·《帝国网站管理系统》实例入门教程
   类别最新
·ASP.NET中为DataGrid添加合计字段
·.text urlRewrite介绍
·利用 ASP.NET 的内置功能抵御 Web
·ASP.NET Cache
·用 WebClient.UploadData 方法 上载
·ASP.NET 程序设计-序
·什么是客户端/伺服端(Client/Serve
·因特网应用程序的开发
·网页的种类
·.NET Framework-Microsoft Visual
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统