频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

C#写所见即所得的设计器(4)

作者: 袁永福 出处:博客园  (  ) 砖  (  ) 好  评论 ( ) 条  进入论坛
更新时间:2006-12-15 17:16
关 键 词:.NET  C#  设计器
阅读提示:本文讨论了如何使用C#编写一个所见即所得的设计器,分析了设计器的基本原理,可能遇到的技术问题,以及如何调用.NET框架来实现一个设计器。

◆文本元素,类型名称为DesignTextElement,很多文档元素只是简单的显示文本内容,则定义文本元素作为这些简单显示文本内容的元素的共同基础。它派生自DesignRectangleElement , 此外还实现了 ILabelEditable 接口用于直接编辑文本内容。此外还支持文本输出角度控制,此时绘制文本时将以元素中心为原点旋转任意角度进行绘制。文本元素绘制带角度的文本时需要临时修改图形绘制对象Graphics的转换矩阵来设置绘制角度。

◆增强文本元素,类型名称为DesignTextElementExt , 该元素派生自DesignTextElement, 对文本输出格式进行了强化,它支持行间距和字符间距,此外还进行了文本右边缘的对齐操作。显示对于大段文本时,尤其包含中文字符和英文字符,某些程序没有进行文本右边缘对齐操作。例如IE,记事本等,这是因为中文字符和英文字符宽度不一样。每一行文本的内容宽度由于中英字符的个数不一样,很容易导致文本宽度不一样,因此当文本左边缘对齐时,其右边缘很可能是参差不齐的。但MS Word显示大段文本时它的文本左右边缘都是对齐的,它通过在显示文本时插入额外的用户难以察觉字符间距来修正文本显示宽度。增强型文本元素就利用了这个原理来实现文本右边缘对齐。

◆表格元素,类型名称为DesignTableElement,表格元素是一种复杂的容器元素,它包含表格行(DesignTableRowElement),表格列(DesignTableColumnElemetn)和单元格(DesignTableCellElement)对象,其中单元格可以进行横向合并和纵向合并。而表格包含的表格行和单元格也是容器元素,用户不能直接修改单元格的大小位置,而只能调解表格行的高度和表格列的宽度来修改单元格的大小位置。单元格也是容器元素,因此单元格内可以放置若干个子元素。在很多情况下单元格只是显示简单的文本内容,因此单元格定义了一些用于显示文本内容的属性,此外实现了 ILabelEditable 接口来方便直接编辑单元格文本内容。

◆图片元素,类型名称为 DesignImageElement , 它是从DesignRectangleElement 派生的,用于简单的显示一个图片。由于图片对象(System.Drawing.Image)使用了未托管资源,因此图片元素实现了 System.IDisposable 接口。

◆此外还定义了一些元素,这些元素可以模拟绘制Windows基础控件,包括文本标签,按钮,单选框,复选框,文本框,列表,下列列表,组合框,进度条和窗体。可以根据这些元素来很容易的模拟出一个窗体设计器。

绘制文档视图

设计器的主要工作之一就是绘制文档视图。其绘制过程一般是:

  1. 设计器控件重载它的OnPaint成员或绑定Paint事件。

  2. 当操作系统需要重新绘制设计器控件时会触发它的Paint事件。

  3. 设计器获得绘制图形使用的System.Drawing.Graphics对象和一个表示绘制区域的剪切矩形ClipRectangle,然后将其作为参数调用文档对象的RefreshView函数。

  4. 文档对象进行一个初始化工作,然后遍历对象树结构,找到所有和剪切矩形粘边的文档元素,调用它们的RefreshView函数,让各个元素绘制各自内容。

  5. 当所有工作完毕,则文档视图绘制完毕。

设计器绘制文档是遇到一个难题就是闪烁,当用户滚动视图和更新视图时,用户界面很容易出现闪烁,过多的闪烁会比较严重的影响使用者的使用。关于闪烁的原理我曾经写过一篇文章讨论了一下(点击查看)。由于设计文档是比较复杂的文档,绘制整个文档视图工作量大,绘制时间长,因此需要采用各种优化来减少绘制时间,减少闪烁。

对于闪烁有一个算是一劳永逸的办法就是使用双缓冲技术。在绘制图形时,首先将图形绘制到一个内存中的BMP图片上,然后将这个BMP图片绘制到用户界面上。这种方法可以最大程度的减少闪烁,而且在.NET中使用双缓冲也比较简单。但我不大使用双缓冲技术,有两个原因

  1. 双缓冲实际上增加了整个绘制文档的工作量,延长了绘图时间。当用户滚动视图时,会造成视图很“沉重”的感觉,用户界面响应迟钝。

  2. 双缓冲掩盖了程序的不足之处。开发人员可以根据闪烁程度来判断绘图操作是否需要优化,以及优化效果。但双缓冲消灭了闪烁,开发人员也就没有优化绘图操作的迫切需求,助长了开发人员的懒惰。程序绘制图形时缓慢不堪,而很难从表面看出问题的可能原因。

其实可以这样,设计器在开发时不使用双缓冲,但发布时则使用双缓冲。

由于设计器采用直角坐标方式,因此各个元素间存在相互覆盖的关系,当存在大面积的覆盖时,绘制文档时必需要针对这种情况进行优化处理来提高绘制文档的速度,减少计算机屏幕闪烁。针对覆盖现象而进行优化时可以进行矩形覆盖操作,对于矩形覆盖操作,本人有另一篇文章对此进行了说明(点击查看)。设计器绘制某个元素时,首先针对这个元素进行矩形覆盖运算,将运算结果作为RefreshView函数的某个参数来传入,当文档元素内容比较多时,可以根据这个矩形覆盖运算结果来减少绘制量,提高绘制速度。

设计视图还应提供缩放显示功能,可以放大设计视图来更清楚的显示细节,可以缩小设计视图来总体的把握整个文档。GDI+有个转换矩阵,可以很容易的实现设计视图的缩放显示。但此时所有的鼠标坐标数据都得进行相应的缩放处理。

设计视图控件

设计视图控件是设计器在用户界面上的展示接口。它是一个标准的Windows控件,该控件派生自System.Windows.Form.UserControl。用户使用鼠标和键盘在这个控件里面编辑文档,它重载了OnMouseDown , OnMouseMove 和 OnMouseUp 成员,对鼠标消息进行了一下包装后供设计文档对象使用。重载了OnPaint 成员来更新文档视图。重载了 OnDoubleClick 来进行试图直接编辑文档元素的文本内容。

当用户设置某个元素为当前元素,则设计视图控件将根据需要来进行滚动以便当前元素出现在可视区域中。若当前元素大小小于可视区域大小,则处理比较简单,只要根据可视区域大小和元素在视图中的位置就可计算滚动位置。若元素宽度或高度大于可视区域的宽度和高度,则需要进行额外的判断,以避免滚动时发生跳跃。


共5页: 上一页 [1] [2] [3] 4 [5] 下一页
【内容导航】
发表
查看
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看52473次)
·UML类图详解 (查看46951次)
·Java编程开发手册 (查看25172次)
·UML统一建模语言 (查看24155次)
·C#技术开发指南 (查看22515次)
·Java编程开发手册 (1195个砖)
·Java基础教程 (429个砖)
·C#技术开发指南 (304个砖)
·PB开发教程 (220个砖)
·.NET开发手册 (217个砖)
·Java编程开发手册 (653个好)
·Java基础教程 (569个好)
·.NET开发手册 (251个好)
·PB开发教程 (209个好)
·Delphi开发技术手册 (174个好)
订阅技术快讯
电子杂志下载
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
名称:Vista精品应用黄皮书
简介:《Vista精品应用黄皮书》囊括了Vista的各方面内容。此次的精简版,是将里面的内容做了提取,便于用户下载和使用。内容包含了各种Vista的安装与实施、技巧与解析以及各种Vista相关学习文档和相关软件的安全下载。该电子书是了解和应用Vista人员必备的工具手册,并且也是第一本
名称:2006中国IT论坛精品集合
简介:本书由“51CTO论坛推广联盟”制作完成。书中所有内容均来自各联盟成员的论坛(网站)。制作本书的目的是为了集中大家的优势资源,将更多更精彩的内容带给广大技术爱好者。本书是联盟成立以来制作的第一本书。
关键字阅读
频道精选
主编信箱 热线:010-66476606 告诉我们您想看的:专题 文章
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 意见反馈 | 网站地图
Copyright©2005-2007 51CTO.COM 版权所有