李国威,康栋梁
(郑州煤矿机械集团股份有限公司,郑州450000)
摘要:通过研究SVG、HTM L、COM与Delphi之间的联系,提出了一种在Delphi与S VG进行交互的方法。旨在在桌面应用开发过程中重复使用已有的S VG图形,并且为封装一个以事件、属性、方法等面向对象方式提供接口的S VG控件提供了一种可行方案。
关键词:Delphi语言;SVG动画;SVG控件封装
The Research of Delphi Interacting with SVG Animationsvg图形
LI Guo-Wei,KANG Dong-lian g
(Zhengzhou C oal M ining M achinery Group C o,.Ltd.Zhengzhou450000,China)
A bst r act:This paper studies the relation of S VG,HTML,C OM and Delphi,and proposed a m ethod for Delphi interacting with S VG.The m ain purpose is reuse existing S VG graphics in Delphi desktop application developm ent,and provided a feasible solution of how to package a S VG control which has interfaces in event,properties,m ethods,and other object- oriented approach.
K ey w ords:Delphi language;S VG anim ation;S VG control package
1引言
在Delphi中开发一个动画组件需要一定的编程功底并且需要对Windows消息和Delphi的消息处理机制有较为深入的理解。另外,在组件发布后,如果需要对组件进行修改,则必须重新编译并安装组件。如果能够将网页中的SVG动画应用到Delphi中,就可以在Delphi中通过开发SVG图形的方式开发动画(尤其是交互式动画),并且对SVG进行灵活控制,从而将SVG的优点与Delphi的优点相结合,提高软件开发效率。
2在Delphi中显示SVG图形
要在Delphi中显示SVG图形,无需按照SVG规范重新开发出一个控件,用来解析并显示SVG图形。Adodb SVG View- er是Adodb公司针对SVG开发的一个ActiveX控件,IE浏览器本身没有对SVG提供支持,而是通过Adodb S VG Viewer来显示网页中的SVG图形。Delphi中自带了TWebB rowser控件,该控件同IE一样,使用MSHTM L内核解析HTM L文档,使用Adodb S VG Viewer显示HTM L文档中的SVG图形。因此在Delphi中,可以使用TWebBrowser 控件显示SVG图形。
在Delphi中用TWebB rowser控件打开一个SVG文件时,TWebB rowser会在内存中创建一个HTML文档,并将指定的SVG文件嵌入到这个HTML文档中,然后再打开HTML
文档,SVG图形便在TWebB rowser中呈现出来。下面是用TWeb- B rowser打开E盘下的一个circle.svg文件时,TWebB rowser自动生成的HTM L代码。
<html>
<body leftm argin=0topm argin=0scroll=no>
<em bed width=100%height=100%fullscreen=yes src=" file:///E:/circle.svg">
76
</body>
</html>
从上面代码中可以看出,TWebB rowser使用Em bed标
签内嵌了指定的SVG文件。
3Delphi调用SVG内部函数
Delphi可以调用HTM L文档中的函数,无法直接调用HTM L内嵌的SVG文档中的函数。但HTM L可以调用SVG文档中的函数,因此Delphi可以通过HTM L间接地调用SVG内部函数。从上一节可以看到,用TWebBroswer 直接打开SVG 文档,TwebB roswer会创建一个HTM L文档来包含它,这个HTML文档便是Delphi和SVG之间的桥梁。
3.1Delphi调用HTML函数
自动创建的HTML文档中没有任何函数,但是为
HTM L 中的JavaS cript函数提供了一个执行环境,在Delphi中可以通过下面的语句使一段JavaS cript代码在HTM L环境中执行。var
Doc:IHtm lDocum ent2;
HtmlWnd:IHtmlWindow2;
ExecStr:string;
begin
Doc:=WebB rowser1.Do cum ent as IHtm lDocum ent2; HtmlWnd:=Doc.parent Window;
ExecStr:= 'TestFunc  (1,2)';
作者简介:李国威(1987-),男,助理工程师,学士,研究方向:矿山自动化技术;康栋梁(1984-),男、助理工程师,硕士,研究方向:矿山自动化技术。
收稿日期:2013-12-28
2014.06
2014. 06
D elphi
函数调用
事件传递
H TML:A dodbSVGView er
H TML :E xt rna l
函数调用
事件传递
SVG
end;
ExecStr 变量是需要在 HTML  中执行的语句,  可以是HTML  及其他自定义事件 ,  这些事件的参 数个数和参数类型也不尽 相 同 。  所 以 不 能 像 在 Delphi 中定义事件原型那样定义 每 一 个
中 的 一 个 预 定 义 的 JavaScript 函 数 ,  也 可 以 是 一 段 JavaScript
代 码 ,  Script 函数的作用是让 ExecStr 在 HTML 环境中执行。
3.2    Delphi 调用 SVG  函数
需要指明的是,  在 SVG  文档的<script></script>部分声明的 全 局 变 量 、  函 数 都 将 成 为 SVG  文 档 的 window  对 象 的 一 个 属 性。  在 HTML  中,  可以通过 SVG  元 素 的 window  对 象 使 用 这 个 属性。
问 题 的 关键是如何在自动生成的 HTML  中 打 这 个
SVG  元 素 。  从前面自动生成的 HTML  文 档 中 可 以 看 到 ,  SVG
是 HTML  文 档 中 唯 一 的 embed 元 素 ,  所以使用下面的代 码 就 可 以 到 SVG  对 象 ,  并且给它指定一个 Id 值 ,  方 便 以 后 使 用 。
var
ele  : IHTM LElem ent; Doc  : IHtm lDocum ent2; B egin
Doc  := WebB rowser1.Do cum ent  as  IHtm lDocum ent2; ele  := beds.item  (Null  ,0)  as  IHTM LElem ent; ele.id  := 'SVG'; //给 S VG  元素指定一个 id  值:“S V G ” end
HTML  语法允许直接使用 元 素 的 Id 值 来 代 替 getElement - ById  ()  函数 的 返 回 值 。  假 设 SVG  文档中有一个名为 “Func1”
的函数,  可以通过下面的语句调用 “Func1”  函数。
ExecStr:= 'SVG.window.Func1  ()  ';
在 Delphi 中 调 用 SVG  内 部 的 JavaScript 函 数 ,  只 需 在 调
用函数前添加一 个 前 缀 “SVG.window.”  即 可 ,  因 为 ExecStr 是 在 HTML  的环境中被执行的 。  到 此 为 止 ,  已经可以成功地在
Delphi 中调用 SVG  内部的函数了。
4    SVG  事件传递到 D elphi
SVG  完 全 支 持 DOM ,  本身就可以响应 用户的鼠标键盘事
件 和 一 些 DOM  事 件 ,  SVG  文档可以处理一些内部事件 ,  但 是 还有一部分事件需要通知到外部 ,  由 Delphi 进 行 处 理 。  HTML 在提供了一个运行环境的同时 ,  也提供了一个重要的扩展接 口 (al),  SVG  文档中的函数可以 通过该接口调用 外部函数。
TWebBroswer  在在初始化时会向自己的控制站点查询是
否 实 现 了 IDocHostUIHandler 接 口 ,  如果控制站点实现了 IDo -
cHostUIHandler 接 口 ,  JavaScript 脚 本 在 使 用 Windows .external
对 象 时 ,  就 会 使 用 IDocHostUIHandler 接 口 中 的 GetExternal 方 法 获 取 到 Windows .external 对 象 。  要 对 HTML  进 行 扩 展 ,  必 须 自 己 编 写 一 个 COM  对 象 并 注 册 到 系 统 中 ,  在 IDocHostUIHan -
dler 接 口 中 的 GetExternal 中 将 这 个 COM  对 象 作 为 GetExternal
函 数 的 返 回 值 ,  当 SVG  内部的事件触发时 ,  SVG  就 可 以 通 过
Windows .external 将事件传递到这个自定义的 COM  对 象 了 。
由 于 SVG  事 件 众 多 ,  包括鼠标键盘事件 、  DOM  事 件 ,  以
SVG  事 件 。  但可以使用一个统一的事件模型 来定义所有的事
件,  下面的代码提供了一种思路 :
procedure  notifyS VG Event
( const  eventS rc: WideString; const  eventType: WideS tring;
const  eventInfo: WideString)  ; safecall;
参数说明:
(1)  eventSrc :  事 件 源 ,  用 字 符 串 表 示 ,  可以是一个内部 的 SVG  图元、  自定义信息。
( 2)  eventType :  事 件 类 型 ,  用 字 符 串 表 示 ,  例 如 “onClick ”、    “onMouseMov e ”。
(3)  eventInfo :  事 件 附 加 信 息 ,  例 如 当 onMouseMove  事 件 发生时,  eventInfo 可能是 “x=100,y=100,shift=ctrl+alt ”。
自 定 义 的 COM  对 象 提 供 上 述 notifySVGEvent  函 数 供 SVG 调 用 ,  SVG  将 事 件 通 过 notifySVGEvent  函 数 传 递 到 COM  对 象 中 后 ,  COM  对 象 需 要 在 notifySVGEvent  函 数 内 部 再 次 调 用
Delphi 函 数 ,  将事件传递出去 。  在 Delphi 看 来 ,  接 收 SVG  事
件就和接收其他的普通 Delphi 控件的事件一样 。  所 以 ,  自 定 义 的 COM  对象必须是一个可连 接 的 自 动 化 COM  对 象 ( 关 于 如何编写可连接的 COM  对 象 ,  请 参 考 相 关 书 籍 ,  这 里 不 再 赘 述 ),  因 此 ,  必 须 在 Delphi 中编写一个事件接收器 ,  并 注 册 到
COM  对 象 中 ,  当 COM  对 象 被 SVG  调 用 时 ,  COM  便 可 以 将 事
件接收器将调用传递到 Delphi 中。
经 过 上 述 讨 论 ,  可 以 得 出 在 Delphi 中 与 SVG  交 互 的 基 本 原 理 ,  如 图 1 所 示 ,  Delphi 通 过 Adodb SVG  Viewer  显 示 SVG 文档,  SVG  文档通过 external  (自定义的 COM  对象)  调用 Del -
phi 中的函数。
图 1    Delphi  与 SV G  交互原理
5 结语
介 绍 了 一 种 在 Delphi 开 发 环 境 下 与 SVG  进 行 交 互 的 方 法 ,  该方法在其他编程语言中同样适用 。  按 照 介 绍 的 方 法 , 完全可以编写出一个 SVG  控 件 并 注 册 到 Delphi 的 控 件 面 板 中 。  以 后 ,  在 Delphi 中 操 作 SVG  图 形 就 像 使 用 普 通 Delphi 控 件 一 样 简 单 ,  其复杂的通信流程全部隐藏在了控件的内部 。
在桌面应用和网站开发同时进行的项目中 ,  只需开发一次
SVG  图形,  即可在两个项目中同时使用 ,  节约了系统的开发成
本。  另外,  也为在 Delphi 中开发动画提供了一种思路,  先将动 画制作成 SVG  文档,  然后使用 SVG  控件加载并与之进行交互。
(下转第 79 页)
外部提供的插口进行融合,保证可以让艺术创作得更加轻松。虽然除了PhotoShop之外,还有很多其他的软件都可以处理图片,但是大家都没有将其称为插件扩展技术,不同的软件都具有不同的功能,需要不断地进行学习,才能学会安装插件。通过对文件夹中的文件进行添加,可以在进行艺术创作时,让自己变得更加便捷,从而让制作效率得到明显的提升。不同的插件扩展技术在图片处理的过程中,可以进行简化,保证插件能够在制作效果上有所保证。例如从事影视制作业或是广告相关的行业都需要利用到PhotoShop的扩展插件技术,它的功能将会保证图片处理的质量,保证不同的插件具有不同的扩展功能,这样才能在三维场景中进行穿插,保证现实场景的制作,这在多个领域上都有很深入的研究和应用。
2.2    让各方人力资源和技术资源得到互补
无论从功能的角度上进行研究还是从外观上,任何一个图像处理的软件都不能完全令人感到满意,因
为无法保证可以进行灵活而又完美的使用。通常来说,任何一个软件都是由公司进行单独研发,这样由于人力和时间有限,导致在研发的过程中,软件都会有局限的功能和更新速度。正是因为这样,很多软件都会在外部提供一些插件的插口,这样才能保证插件扩展技术可以和别的软件进行融合,从而对自身的功能和更新做到较为完善的处理。通过这样的操作之后,可以让软件具有更好的竞争力,能够保证人力资源和技术资源得到充分的互补。对插件进行研发的公司或是个人在进行技术更新时,就不再需要更多的时间和精力去完善自己的运行平台,也不需要编制新的软件和系统,能够借助于他人的软件而进行运行。这样做可以提升工作的效率,保证可以集中精力完成某项功能,并对这些功能进行改善和加强。在开发全新功能的过程中,需要利用一些插件扩展技术,从而让自己的软件可以获得应用的市场份额,保证软件能够继续在市场上存活下去[5]。这样做或许会影响到软件平台的开发,让很多开发商无法得到自身的利益,不能进行自主的软件扩展技术的研发,而让自己具备了很高的竞争力。虽然这样,但是并没有影响到自己在市场上的竞争力,反而让自己也获得一部分的利益,这是一种双赢。插件扩展技术可以帮助开发商扩展功能的同时,赢得了在市场存在的必要条件、利润,这也是插件扩展技术的生存之首。
3    插件扩展Phot oShop软件在图像处理中的应用
作为强大的图像处理软件,PhotoShop是一个尤为专业的图片处理平台,其插件扩展技术在很多方面都有深入的应用。在图像处理方面上,利用差价扩展PhotoShop软件尤其是彩调整、影像拼接方面
具有不可替代的功能。但是因为图像感应的原因,其功能也具有一些局限性,例如,不能利用Pho- toShop软件进行数据的处理,无法进行再次利用,这对于资源而言是一种浪费,无法保证真正利益的实现。此外,因为PhotoShop在功能上的局限性,使得其无法进行不同格式遥感数据的处理,这样对于资源就会有较大的占用空间,数据量较大,这样就不能在图像处理中有所应用,这些都是Photo- Shop需要进行改进的地方。为了让PhotoShop软件能够更好地在图像处理上进行应用,可以充分利用其插件扩展功能,以便更适合图像专业遥感影像处理的需要[6]。经过多次试验,其中间插件开发可在SDK开发平台下进行。
通过插件扩展技术对PhotoShop在图像处理上的作用,主要表现在图像处理能够弥补一些缺点,可以由技术人员进行自主操作而完成更新。因为PhotoShop对于数据存储空间会有一定的限制,导致在一些功能上无法实现处理,这样一旦数据较大,就不能进行兼容,会让彩处理等相关的PhotoShop 操作无法进行。因为PhotoShop在软件的操作上容易出错,这样就会出现漏洞,导致无法进行恢复,不能根据地理位置进行定位。但是PhotoShop可以在不同软件中进行交叉使用,进而节省了软件数据之间的交换,能够节省工作时间,提高工作效率,尤其是图像具有较多的数据时,更是具有很大的便利。PhotoShop在图像处理上具有一些弊端,但是利用插件扩展技术,就能够解决这些问题,并有很好的应用效果。
伴随着科学技术和软硬件技术的发展,PhotoShop软件对图像的处理应用将越来越广泛,尤其是Photo
Shop软件中插件扩展技术能够充分发挥其优势,为PhotoShop软件在处理图片上提供了更加广阔的应用前景。作为强大的影像和图片处理平台,PhotoShop因为其所具有的性价比,受到很多专业人士的青睐,可以进行简单的操作完成图像的处理工作。不仅仅具有较高的工作效率,还能比其他软件具有更好的处理效果,因此在很多方面使用广泛,功能不可替代。因此插件扩展技术在PhotoShop软件中,需要对算法进行设计和优化,保证实现图像的处理,提高工作效率。
参考文献
[1]黄凤坡.  A uthorware 交互功能介绍及简单的实例设计[J]  .
赤峰学院学报(自然科学版),2011,(02).
[2]刘洋.  多媒体课件界面设计与PhotoShop的探讨[J]  .科技
信息(科学教研),2012,(17).
[3]张胜云.  PhotoShop对其他图形图像处理软件的支持[J]  .
安庆师范学院学报(自然科学版),2011,(04).
[4]张志明,段红玉.  PhotoShop在网页制作中的应用[J]  .
科技信息(学术版),2010,(10).
[5]于洪苹,程朋根,李永胜.  PhotoShop软件在遥感影像处
理中的应用[J]  .  测绘科学,2011,(03).
[6]丁杨.  浅谈如何上好高职PhotoShop图像处理课程[J]  .
教育教学论坛,2011,(05).
(上接第77页)
参考文献[2]潘爱民.  COM原理与应用.  北京:清华大学出版社,
2005.
[1]  Eric Harmon.  Delphi COM深入编程.  北京:机械工业出
版社,2000.[3]弗兰纳根.  JavaScript 权威指南.  北京:机械工业出版社,
2012.
2014.06

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。