回 帖 发 新 帖 刷新版面

主题:[原创]专业图形引擎  都来看看吧

6.2、VG与开发WEB应用程序的开发
6.2.1、Vbscript
VBScript 使用 VG插件脚本与宿主应用程序对话。使用 VG插件脚本,浏览器和其他宿主应用程序不再需要每个脚本部件的特殊集成代码。VG插件脚本使宿主可以编译 Script、获取和调用入口点及管理开发者可用的命名空间。通过 VG插件脚本,语言厂商可以建立标准脚本运行时语言。Microsoft 将提供 VBScript 的运行时支持。VG插件脚本可用在 Microsoft(R) Internet Explorer使用。
    VBScript 只有一种数据类型,称为 Variant。Variant 是一种特殊的数据类型,根据使用的方式,它可以包含不同类别的信息。因为 Variant 是 VBScript 中唯一的数据类型,所以它也是 VBScript 中所有函数的返回值的数据类型。
    无论使用的是 ActiveX(R) 控件(以前称为 OLE 控件)还是 VG插件对象,Microsoft Visual Basic Scripting Edition 和 Microsoft(R) Internet Explorer 都以相同的方式处理它们。
SCRIPT 元素用于将 VBScript 代码添加到 HTML 页面中。
<SCRIPT> 标记
VBScript 代码写在成对的 <SCRIPT> 标记之间
SCRIPT 块可以出现在 HTML 页面的任何地方(BODY 或 HEAD 部分之中)。然而最好将所有的一般目标脚本代码放在 HEAD 部分中,以使所有脚本代码集中放置。这样可以确保在 BODY 部分调用代码之前所有脚本代码都被读取并解码。
<OBJECT> 标记用来包含对象,<PARAM> 标记用来设置对象属性的初始值。例如,以下代码使用 <OBJECT>标记将 VG 控件添加到页面中: 
<OBJECT classid="clsid:465BBD45-50E1-11D7-8803-00E09876BB62" id="vgctrl1" data="DATA:application/x-oleobject;BASE64,Rb1bRuFQ1xGIAwDgmHa7YhAHAAABRwAAASIAAA==
" width="687" height="490"
></OBJECT>
像对任何窗体控件一样,可以获取属性、设置属性和调用方法。例如,以下代码包含 在<FORM> 控件里面,可用其对标签控件的两个属性进行操作:
<FORM NAME="LabelControls">
<INPUT TYPE="TEXT" NAME="txtNewText" class='9v'>
<INPUT TYPE="BUTTON" NAME="cmdChangeIt" VALUE="更改文本">
<INPUT TYPE="BUTTON" NAME="cmdRotate" VALUE="旋转标签">
</FORM>
通过定义过的窗体,cmdChangeIt 按钮的事件过程可更改标签文本: 
<SCRIPT LANGUAGE="VBScript">
<!--
Sub cmdChangeIt_onClick
   Dim TheForm
   Set TheForm = Document.LabelControls
   lblActiveLbl.Caption = TheForm.txtNewText.Value
End Sub
-->
</SCRIPT>
以下是其Vbscript使用VG插件的图示:
 
其源码HTML与Vbscript的源码如下:
<html><head>
<title>New Page 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<SCRIPT ID=clientEventHandlersVBS LANGUAGE=vbscript>
<!--
Sub window_onload
vgctrl1.Design ""
'取得客户端(VG.dll所在)本地插件路径Path
s = vgctrl1.Execute( "return SystemParams.DefaultPath" )
'运行左边的库列表框,使用户可以增加自定义图元
vgctrl2.Run s + "listview.tbl"
vgctrl2.ActiveSheet.SetPropertyValue "Url", s
vgctrl2.Width = 180
'运行上边的工具条,工具条也是一个VG的图形文件,使用户可以任意操作图形
vgctrl3.Run s + "toolbar.tbl"
'设置工具条里面的变量
vgctrl1_OnSheetChange( vgctrl1.ActiveSheet )
'图形主编辑界面打开一张图形进行编辑,
s = vgctrl1.loadfromfile(s+"应用.tbl")
'右边的属性列表框进行显示编辑
vgctrl3.Execute "btnPaste.Enable=true"
'左边的图库增加一个图库文件“监控设备.tbl”
pathlib="Activesheet.元件列表.Loadlib('"+s+"监控设备.tbl','监控设备.tbl')"
vgctrl2.execute(pathlib) 
End Sub
Sub vgctrl1_OnSheetChange( ASheet )
'响应VG主编辑图形控件的OnSheetChange事件,在页面变化时,就设置一下变量。
if not ( vgctrl2.ActiveSheet is Nothing ) then
  vgctrl2.ActiveSheet.SetPropertyValue "cursheet", vgctrl1.ActiveSheet
end if
if not ( vgctrl3.ActiveSheet is Nothing ) then
  vgctrl3.ActiveSheet.SetPropertyValue "cursheet", vgctrl1.ActiveSheet
end if
End Sub
Sub vgctrl1_OnSelectChange
'响应VG主编辑图形控件的OnSelectChange事件,当鼠标在切换不同图形的时候,就变化工具条与属性列表。
vgctrl3.Execute "OnSelectChange()"
vgctrl3.Execute "btnUndo.Enable=CurSheet.Owner.CanUndo()"
vgctrl3.Execute "btnRedo.Enable=CurSheet.Owner.CanRedo()"
End Sub
Sub vgctrl1_OnModifyChange( m )
'响应VG主编辑图形控件的OnModifyChange事件,使工具条的保存按钮可以使用。
if not ( vgctrl3.ActiveSheet is Nothing ) then
  vgctrl3.Execute "btnSave.Enable=CurSheet.Owner.Modified"
end if
End Sub
Sub vgctrl1_OnRButtonDown( x, y )
'响应VG主编辑图形控件的OnRButtonDown事件,使右键菜单可以使用。
vgctrl1.Execute("doc=Create( Handle,SystemParams.DefaultPath+'popupmenu1.tbl',true,false );p=Point( 0, 0 );GetCursorPos(p);doc.Popup(p.x,p.y);doc.Free()" )
End Sub
Sub vgctrl1_OnError(s) '自定义VG的错误信息自定义
MsgBox s
End Sub
Sub vgctrl2_OnError(s) '自定义VG的错误信息自定义
MsgBox s
End Sub
Sub vgctrl3_OnError(s) '自定义VG的错误信息自定义
MsgBox s
End Sub
Sub Button1_onclick
vgctrl1.CopyToClipboard()'调用VG的Ivgctrl类的接口操作,复制函数调用
End Sub
Sub Button2_onclick
vgctrl1.PasteFromClipboard()'调用VG的Ivgctrl类的接口操作,粘贴函数调用
End Sub
Sub Button3_onclick 
vgctrl1.ZoomIn()'调用VG的Ivgctrl类的接口操作,放大函数调用
End Sub
Sub Button4_onclick 
vgctrl1.ZoomOut()'调用VG的Ivgctrl类的接口操作,缩小函数调用
End Sub
Sub Button5_onclick
vgctrl1.MoveSheet()'调用VG的Ivgctrl类的接口操作,图形漫游函数调用
End Sub
Sub Button6_onclick
vgctrl1.Rotate()'调用VG的Ivgctrl类的接口操作,图形旋转函数调用
End Sub
-->
</SCRIPT>
</head><body bgcolor=#3366cc>
<p align=center><font color=#ffffcc size=6><strong>煤矿监测系统</strong></font></p>
<table border="0" width="916" cellpadding="0" cellspacing="0">
  <tr>
    <td colspan="3" width="915">
      <object id=vgctrl3 
      codeBase=http://localhost/onlinedraw/vgctrl.cab#version=1,0,0,0 height=60 
      width=915 
      data=data:application/x-oleobject;base64,Rb1bRuFQ1xGIAwDgmHa7YhAHAACRXgAANAYAAA== 
      classid=clsid:465BBD45-50E1-11D7-8803-00E09876BB62 
  VIEWASTEXT>
    </object>
    </td>
  </tr>
  <tr>
    <td width="192">
      <object id=vgctrl2 
      codeBase=http://localhost/onlinedraw/vgctrl.cab#version=1,0,0,0 height=463 
      width=182 
      data=data:application/x-oleobject;base64,Rb1bRuFQ1xGIAwDgmHa7YhAHAADPEgAA2i8AAA== 
      classid=clsid:465BBD45-50E1-11D7-8803-00E09876BB62 VIEWASTEXT>
    </object>
    </td>
    <td width="528">
      <object id=vgctrl1 
      codeBase=http://localhost/onlinedraw/vgctrl.cab#version=1,0,0,0 height=464 
      width=518 
      data=data:application/x-oleobject;base64,Rb1bRuFQ1xGIAwDgmHa7YhAHAACJNQAA9S8AAA== 
      classid=clsid:465BBD45-50E1-11D7-8803-00E09876BB62 VIEWASTEXT>
    </object>
    </td>
  </tr>
</table>
 <input id=Button1 type=button value=复制>&nbsp;
 <input id=Button2 type=button value=粘贴>&nbsp;
 <input id=Button3 type=button value=放大>&nbsp;
 <input id=Button4 type=button value=缩小>&nbsp;
 <input id=Button5 type=button value=移动>&nbsp;
 <input id=Button6 type=button value=旋转>
</body></html>


比如:控件的事件可以在VG.CHM的ActiveX技术文档里面找到,有
OnAddSheet    void=OnAddSheet(Sheet)    当新增一个页面后执行。Sheet是新的页面。
OnAddUnit    void=OnAddUnit(Unit)    当新增一个图形后执行。Unit是新图形对象。
OnClick    void=OnClick()    鼠标单击时执行。可以用页面的UnitAtCursor函数得到单击的图形。设计时无效。 切勿在此事件里面执行Design或者Run,因为这两个函数执行时,都是先把原来画面上的图形清除,再载入新的图形。这将导致正在执行的程序被释放,出现错误,
OnCommand    void=OnCommand(Unit,String)    当执行DoCommand脚本函数时触发此事件。
OnDblClick    void=OnDblClick()    鼠标双击时执行。
OnDeleteSheet    void=OnDeleteSheet(Sheet)    当删除一个页面时执行。Sheet是要删除的页面。
OnDeleteUnit    void=OnDeleteUnit(Unit)    当删除一个图形时执行。Unit是要删除的图形对象。
OnError    void=OnError(Msg)    捕获软件错误。Msg是错误信息。
OnKeyDown    void=OnKeyDown(Key)    当按下键盘时执行。
OnLButtonDown    void=OnLButtonDown( X, Y )    鼠标左键按下时执行。X,Y表示鼠标的视图坐标。
OnLButtonUp    void=OnLButtonUp( X, Y )    鼠标左键释放时执行。X,Y表示鼠标的视图坐标。
OnModifyChange    void=OnModifyChange(Modified)    当视图被修改或存盘后执行。Modified是逻辑型值。
OnMouseMove    void=OnMouseMove( X, Y )    鼠标移动时执行。X,Y表示鼠标的视图坐标。
OnMouseWhell    void=OnMouseWheel(Forward)    当滚动鼠标滚轮时执行,Forward是逻辑型,表示滚动的方向。
OnOrgChanged    void=OnOrgChanged()    视图原点位置相对屏幕窗口发生改变时执行。比如滚动条位置变化。
OnRButtonDown    void=OnRButtonDown( X, Y )    鼠标右键按下时执行。X,Y表示鼠标的视图坐标。
OnSelectChange    void=OnSelectChange()    当选择组变化时执行,例如选中一个图形或者选中的图形属性发生改变。
OnSheetChange    void=OnSheetChange(Sheet)    页面切换后执行。Sheet表示切换的页面。
OnZoomChange    void=OnZoomChange(Zoom)    视图缩放后执行。Zoom表示当前的放大率。

如何调用他们呢?
在IE里面用Vbscript调用VG的事件是这样调用的:
Html里面的Object标签的ID号+下划线+事件名,就成了,如:


有Object标签
      <object id=vgctrl2 
      codeBase=http://localhost/onlinedraw/vgctrl.cab#version=1,0,0,0 height=463 
      width=182 
      data=data:application/x-oleobject;base64,Rb1bRuFQ1xGIAwDgmHa7YhAHAADPEgAA2i8AAA== 
      classid=clsid:465BBD45-50E1-11D7-8803-00E09876BB62 VIEWASTEXT>
     </object>
那么
OnDblClick    void=OnDblClick()    鼠标双击时执行。
是这样写的:
<SCRIPT LANGUAGE="VBScript">
<!--
 Sub vgctrl2_OnDblclick()


End sub
-->
</SCRIPT>

高级应用:
在用Vbscript控制VG时,会经常用到一个函数:
UnitAtCursor  返回页面中位于当前鼠标所在位置的单元。
语法
var = UnitAtCursor( var )
参数表示一个图形单元,该单元将被排除在判断之外。该值可以为空值。
返回鼠标所在位置的单元,如果没有,返回空值。
Visual Graph脚本示例
当拖动一个图形“Text1”到某一点时,需要判断该点有没有其他单元,可以用这个函数:
d=UnitAtCursor( Text1 )
if d <> 0 then
'这里有其他单元
end if
<SCRIPT LANGUAGE="VBScript">
<!--
 Sub vgctrl2_OnDblclick()
Typestr=””
U=vgctrl2.vg.UnitAtCursor(vgctrl2.vg.ActiveSheet)
’ U返回的是一个Iunit类型。
If not (U=nothing) then
Typestr=U.type
Msgbox Typestr
End if

End sub
-->
</SCRIPT>

回复列表 (共1个回复)

沙发

沙发还是自己来坐

我来回复

您尚未登录,请登录后再回复。点此登录或注册