以前做过几个小例子放家里了,明天如果还没有朋友拿到那99分,我再来试试看。我记得有这么几个方面的东西需要了解,也算是线索吧。你试过在VB里面引用接口么?解决了这个问题,剩下的步骤和vc来做没什么区别了。
首先,解决这个问题需要用到一点vb里面不常用的东西。你查一下 Implements 这个 statement ,vb用它可以引入interface,还可以一定程度上模拟“继承”。其次,需要查一下IE编程需要调用哪几个接口(不好意思,我不大记得,MSDN Library上有的东西我都不记——piggybrain)。然后用 implements引入这几个interface,并实现必需的方法。另外可能还需要用到CallByName这个方法,因为你需要在你的vb程序中创建一个 class,然后传递这个class的一个instance给IE的接口作为callback的方法的载体来响应DHTML中的事件,例如:onmousemove。
首先,解决这个问题需要用到一点vb里面不常用的东西。你查一下 Implements 这个 statement ,vb用它可以引入interface,还可以一定程度上模拟“继承”。其次,需要查一下IE编程需要调用哪几个接口(不好意思,我不大记得,MSDN Library上有的东西我都不记——piggybrain)。然后用 implements引入这几个interface,并实现必需的方法。另外可能还需要用到CallByName这个方法,因为你需要在你的vb程序中创建一个 class,然后传递这个class的一个instance给IE的接口作为callback的方法的载体来响应DHTML中的事件,例如:onmousemove。
Reusing the WebBrowser Control
Reusing MSHTML新版本的MSDNLib真麻烦,基本都是.net framework的东西,卸载,重装之...
首先建立一个新工程,在Form1中加入一个Webbrowser控件,然后在Form1中加入以下代码: Option Explicit Public Sub Some_Procedure()
MsgBox "你点击了按钮."
End Sub Private Sub Form_Load()
'下载空页面
WebBrowser1.Navigate2 "about:blank"
End Sub Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
'建立事件响应类
Dim cfForward As clsForward '定义在浏览器中显示的HTML代码,其中包含一个按钮btnMyButton
Dim sHTML As String
sHTML = "<P>This is some text.</P>"
sHTML = sHTML & "<P>And here is a button.</P>"
sHTML = sHTML & "<BUTTON ID=btnMyButton>"
sHTML = sHTML & "Click this button.</BUTTON>" '将HTML代码写入浏览器
WebBrowser1.Document.body.innerHTML = sHTML '将事件响应类连接到页面的按钮btnMyButton上
Set cfForward = New clsForward
cfForward.Set_Destination Me, "Some_Procedure"
WebBrowser1.Document.All("btnMyButton").onclick = cfForward
End Sub 向工程中添加一个Class Module,Class Module的Name属性设定为clsForward,在clsForward中添加以下代码: Option Explicit Dim oObject As Object
Dim sMethod As String
Dim bInstantiated As Boolean Private Sub Class_Initialize()
bInstantiated = False
End Sub Public Sub Set_Destination(oInObject As Object, sInMethod As String)
Set oObject = oInObject
sMethod = sInMethod
bInstantiated = True
End Sub Public Sub My_Default_Method()
If bInstantiated Then
CallByName oObject, sMethod, VbMethod
End If
End Sub 运行程序,点击Webbrowser中的“Click this button”按钮。程序就会弹出消息框提示“你点击了按钮.”
代码:
<HTML>
<HEAD></HEAD>
<BODY>
<script language="VBScript">function IntoIT()
On error resume next
Set MyIT = Window.document
for each oEles in MyIT.all
if typename(oEles)="HTMLFormElement" then
for each oInput in oEles.all
Select Case oInput.Type
case "radio"
if oInput.checked then
astr=astr+oInput.Value+"Is selected <br>"
else
astr=astr+oInput.Value+"Is not selected <br>"
end if
case "text"
astr="<p> text is "+astr+oInput.Value+"</p>"
case else
end select
next
end if
next
MyIT.write astr
end function
</SCRIPT><form method="POST" action="--WEBBOT-SELF--">
<p><input type="radio" value="V1" checked name="R1"></p>
<p><input type="radio" name="R1" value="V2"></p>
<p><input type="text" name="T1" size="20"></p>
<p><select size="1" name="D1">
<option>A1</option>
<option>A2</option>
<option>A3</option>
</select></p>
<p><input type="submit" value="提交" name="B1"><input type="reset" value="全部重写" name="B2"></p>
<p><b><a href="VBScript:IntoIT()" ><br>
加入收藏夹</a></b></span></p>
</form>
</BODY>
</HTML>
基本上就是通过遍历访问页面中的元素来实现的
Set cfForward = New clsForward
cfForward.Set_Destination Me, "Some_Procedure"
WebBrowser1.Document.All("btnMyButton").onclick = cfForward 核心代码就这两句。
cfForward.Set_Destination object, Method_of_object (好比传递函数指针,这样的使用方式有点像c#里面的delegate,或者java中传递一个object的instance,并invoke某个method)。完全可以绑定另外的object的method,clsForward内部用 CallByName 来调用比如Form1(传入Me) 这个对象(你自己的其他对象也可以)的 Some_Procedure(Some_Procedure不需要参数,你可以传递其它方法,甚至调用事件处理方法如From1_OnUnload,并传递需要的参数)。
WebBrowser1.Document.All("btnMyButton").onclick = cfForward
绑定DHTML的event object到clsForward的实例。不过WebBrowser不具备InternetExplorer的部分功能。我前面说需要引用几个interface说错了,不好意思。你的要求不用引用接口,那些interface是用来控制InternetExplorer的instance的,比如监控浏览器下载的内容如果是flash,就忽略(现在很多广告flash的循环做得不好,非常消耗cpu资源,而且flash存在恶意攻击的可能)...
我认为 CallByName 就“是” VB 的 Delegate,只是需要像delegate那样通过interface来约束项目中几个模块(比如不同的人写的)之间用这样的方法进行一些高级的refactory工作。不过眼下有个问题不明白,Public Sub My_Default_Method()
If bInstantiated Then
CallByName oObject, sMethod, VbMethod
End If
End Sub 将某个方法设置为该类的默认方法,除了在vb的类生成工具中设置,还能怎么做呢?
比如除了手工修改 cls文件中,在该方法中加入
Attribute disConnect.VB_UserMemId = 0,有没有办法在写cls的代码的时候将该方法标注为默认方法(属性也是如此)呢?
set procedure id=(default)
呵呵,俺对vb还是不熟啊..