◆文本元素,类型名称为DesignTextElement,很多文档元素只是简单的显示文本内容,则定义文本元素作为这些简单显示文本内容的元素的共同基础。它派生自DesignRectangleElement , 此外还实现了 ILabelEditable 接口用于直接编辑文本内容。此外还支持文本输出角度控制,此时绘制文本时将以元素中心为原点旋转任意角度进行绘制。文本元素绘制带角度的文本时需要临时修改图形绘制对象Graphics的转换矩阵来设置绘制角度。
◆增强文本元素,类型名称为DesignTextElementExt , 该元素派生自DesignTextElement, 对文本输出格式进行了强化,它支持行间距和字符间距,此外还进行了文本右边缘的对齐操作。显示对于大段文本时,尤其包含中文字符和英文字符,某些程序没有进行文本右边缘对齐操作。例如IE,记事本等,这是因为中文字符和英文字符宽度不一样。每一行文本的内容宽度由于中英字符的个数不一样,很容易导致文本宽度不一样,因此当文本左边缘对齐时,其右边缘很可能是参差不齐的。但MS Word显示大段文本时它的文本左右边缘都是对齐的,它通过在显示文本时插入额外的用户难以察觉字符间距来修正文本显示宽度。增强型文本元素就利用了这个原理来实现文本右边缘对齐。
◆表格元素,类型名称为DesignTableElement,表格元素是一种复杂的容器元素,它包含表格行(DesignTableRowElement),表格列(DesignTableColumnElemetn)和单元格(DesignTableCellElement)对象,其中单元格可以进行横向合并和纵向合并。而表格包含的表格行和单元格也是容器元素,用户不能直接修改单元格的大小位置,而只能调解表格行的高度和表格列的宽度来修改单元格的大小位置。单元格也是容器元素,因此单元格内可以放置若干个子元素。在很多情况下单元格只是显示简单的文本内容,因此单元格定义了一些用于显示文本内容的属性,此外实现了 ILabelEditable 接口来方便直接编辑单元格文本内容。
◆图片元素,类型名称为 DesignImageElement , 它是从DesignRectangleElement 派生的,用于简单的显示一个图片。由于图片对象(System.Drawing.Image)使用了未托管资源,因此图片元素实现了 System.IDisposable 接口。
◆此外还定义了一些元素,这些元素可以模拟绘制Windows基础控件,包括文本标签,按钮,单选框,复选框,文本框,列表,下列列表,组合框,进度条和窗体。可以根据这些元素来很容易的模拟出一个窗体设计器。
设计器的主要工作之一就是绘制文档视图。其绘制过程一般是:
设计器控件重载它的OnPaint成员或绑定Paint事件。
当操作系统需要重新绘制设计器控件时会触发它的Paint事件。
设计器获得绘制图形使用的System.Drawing.Graphics对象和一个表示绘制区域的剪切矩形ClipRectangle,然后将其作为参数调用文档对象的RefreshView函数。
文档对象进行一个初始化工作,然后遍历对象树结构,找到所有和剪切矩形粘边的文档元素,调用它们的RefreshView函数,让各个元素绘制各自内容。
当所有工作完毕,则文档视图绘制完毕。
设计器绘制文档是遇到一个难题就是闪烁,当用户滚动视图和更新视图时,用户界面很容易出现闪烁,过多的闪烁会比较严重的影响使用者的使用。关于闪烁的原理我曾经写过一篇文章讨论了一下(点击查看)。由于设计文档是比较复杂的文档,绘制整个文档视图工作量大,绘制时间长,因此需要采用各种优化来减少绘制时间,减少闪烁。
对于闪烁有一个算是一劳永逸的办法就是使用双缓冲技术。在绘制图形时,首先将图形绘制到一个内存中的BMP图片上,然后将这个BMP图片绘制到用户界面上。这种方法可以最大程度的减少闪烁,而且在.NET中使用双缓冲也比较简单。但我不大使用双缓冲技术,有两个原因
双缓冲实际上增加了整个绘制文档的工作量,延长了绘图时间。当用户滚动视图时,会造成视图很“沉重”的感觉,用户界面响应迟钝。
双缓冲掩盖了程序的不足之处。开发人员可以根据闪烁程度来判断绘图操作是否需要优化,以及优化效果。但双缓冲消灭了闪烁,开发人员也就没有优化绘图操作的迫切需求,助长了开发人员的懒惰。程序绘制图形时缓慢不堪,而很难从表面看出问题的可能原因。
其实可以这样,设计器在开发时不使用双缓冲,但发布时则使用双缓冲。
由于设计器采用直角坐标方式,因此各个元素间存在相互覆盖的关系,当存在大面积的覆盖时,绘制文档时必需要针对这种情况进行优化处理来提高绘制文档的速度,减少计算机屏幕闪烁。针对覆盖现象而进行优化时可以进行矩形覆盖操作,对于矩形覆盖操作,本人有另一篇文章对此进行了说明(点击查看)。设计器绘制某个元素时,首先针对这个元素进行矩形覆盖运算,将运算结果作为RefreshView函数的某个参数来传入,当文档元素内容比较多时,可以根据这个矩形覆盖运算结果来减少绘制量,提高绘制速度。
设计视图还应提供缩放显示功能,可以放大设计视图来更清楚的显示细节,可以缩小设计视图来总体的把握整个文档。GDI+有个转换矩阵,可以很容易的实现设计视图的缩放显示。但此时所有的鼠标坐标数据都得进行相应的缩放处理。
设计视图控件是设计器在用户界面上的展示接口。它是一个标准的Windows控件,该控件派生自System.Windows.Form.UserControl。用户使用鼠标和键盘在这个控件里面编辑文档,它重载了OnMouseDown , OnMouseMove 和 OnMouseUp 成员,对鼠标消息进行了一下包装后供设计文档对象使用。重载了OnPaint 成员来更新文档视图。重载了 OnDoubleClick 来进行试图直接编辑文档元素的文本内容。
当用户设置某个元素为当前元素,则设计视图控件将根据需要来进行滚动以便当前元素出现在可视区域中。若当前元素大小小于可视区域大小,则处理比较简单,只要根据可视区域大小和元素在视图中的位置就可计算滚动位置。若元素宽度或高度大于可视区域的宽度和高度,则需要进行额外的判断,以避免滚动时发生跳跃。
| 共5页: 上一页 [1] [2] [3] 4 [5] 下一页 | ||
|
|
|||
| · 51CTO主编推荐经典专题 · RAID——磁盘阵列基础 · 充电计划之热门IT认证.. · 51CTO技术自测 挑战自.. · CISSP认证成长之路 · AMD Phenom三核处理器.. · 国际文档格式标准开战 · 2007年互联网大会 |
· 我是黑客我怕谁——讲.. · ARP攻击防范与解决方案 · Solaris 10 配置管理 · Solaris基础知识入门 · RIP路由协议专栏 · MPLS路由协议专栏 · OSPF路由协议专栏 · 思科路由器产品 |
||
|
|||
| · Java基础教程 · VPN技术 · ARP攻击防范与解决方案 · SQL Server 2005全解 · SOA 面向服务架构 · SQL Server 2005全解 · Java编程开发手册 · RAID——磁盘阵列基础 |
· 三层交换技术专题 · SQL Server入门到精通 · Windows Server 2003企.. · Windows远程桌面应用 · C#技术开发指南 · VPN技术 · Solaris 10 配置管理 · C#技术开发指南 |
||
|
|||
| · ARP攻击防范与解决方案 · VPN技术 · SQL Server 2005全解 · Java基础教程 · SQL Server入门到精通 · SQL Server 2005全解 · SOA 面向服务架构 · Java编程开发手册 |
· C#技术开发指南 · 三层交换技术专题 · C#技术开发指南 · Windows远程桌面应用 · RAID——磁盘阵列基础 · Windows Server 2003企.. · 邮件服务器专题 · wimax技术与趋势 |
||
| ·DB2 Viper快速入门 ·DB2 9数据库的镜像分割与.. |
·将XML应用程序从DB2 8.x.. ·DB2 9中的pureXML:如何.. |
| ·服务器中的“傻瓜机”在.. ·盖茨也喜欢登录Youtube看.. |
· · |
| ·拯救系统管理员 ·美国选民:我为什么选布什 |
·VMware公司中文命名挑战赛 ·我们真缺乏创新吗? |
| ·J0ker的CISSP之路:复习-.. ·J0ker的CISSP之路:复习-I.. |
·9月第3周安全回顾 内网安.. ·教你几招识别和防御Web网.. |
| · NGN:下一代网络 · 网络访问中断大排查 · FTTx光纤接入 |
· 教你使用Anti ARP Sniff.. · 网络嗅探教程:使用Snif.. · 常见病毒手工清除方法大.. |
| · C++是垃圾语言?! · 2007年IT界七大抄袭事件 · Java实用开发全集 |
· 解析Ajax开发框架 走进A.. · 基于Google Maps与Ajax.. · 基于Google Maps与Ajax.. |
| · 热门 IT 培训认证官方资.. · Ubuntu 中文开源频道 · Solaris基础知识入门 |
· 费力不讨好 数据中心主.. · AMD Phenom三核处理器解.. · 51CTO主编推荐经典专题 |
| · 甲骨文Oracle 11g正式发.. · Oracle数据库开发之PL/S.. · Oracle数据库开发基础教.. |
· 存储2006,一个并购的大.. · IDC宣布浪潮蝉联存储市.. · 双机热备技术 |