(小仙妹) | 发表于:2002-03-18 09:40:26 由于这个问题不一定有人回答出来,所以暂时是1分。如果有圆满答案肯定加分。 最近以VB制作程序,以WebBrowser做输出显示还可以(比如输出个报表),但是不能捕捉事件。比如我以WebBrowser打开一个web页,当我用鼠标指向一个IMG时候在网页里会产生一个onmouseover事件,但是这个事件如何让VB程序获得?不知道有什么办法能捕捉HTML元素的事件? 只要能实现如下目的,就算解决了! 1、在WebBrowser里打开一个有两个IMG的网页。 2、当鼠标移动到第一个IMG上的时候,VB程序的Text1显示“A” 3、当鼠标移动到第二个IMG上的时候,VB程序的Text1显示“B” 4、当鼠标点击第一个IMG上的时候,VB程序的Text2的数值加一 5、当鼠标点击第二个IMG上的时候,VB程序的Text2的数值减一 如果真的可以捕捉HTML事件,那将可以制作出极其美观的程序。同时可以省掉很多控件。 另外,是否可以把HTML元素直接放到Form窗体上呢?如果有办法也请给出一个例子。 |
(想吃老虎的小猪) | 以前做过几个小例子放家里了,明天如果还没有朋友拿到那99分,我再来试试看。我记得有这么几个方面的东西需要了解,也算是线索吧。 你试过在VB里面引用接口么?解决了这个问题,剩下的步骤和vc来做没什么区别了。 首先,解决这个问题需要用到一点vb里面不常用的东西。你查一下 Implements 这个 statement ,vb用它可以引入interface,还可以一定程度上模拟“继承”。 其次,需要查一下IE编程需要调用哪几个接口(不好意思,我不大记得,MSDN Library上有的东西我都不记——piggybrain)。然后用 implements引入这几个interface,并实现必需的方法。 另外可能还需要用到CallByName这个方法,因为你需要在你的vb程序中创建一个 class,然后传递这个class的一个instance给IE的接口作为callback的方法的载体来响应DHTML中的事件,例如:onmousemove。 |
(想吃老虎的小猪) | 我记得好像需要引用 IWebBrowser2 这个接口(shdocvw.dll),如果要处理DHTML中的events,引用 DWebBrowserEvents2 这个接口。 对了,我查了一下 MSDN Library,有这么两个标题对你可能有帮助: Reusing the WebBrowser Control Reusing MSHTML 新版本的MSDNLib真麻烦,基本都是.net framework的东西,卸载,重装之... |
(陈锐) | tips:程序中如何监控网页中元素的事件 对编写脚本熟悉的读者都知道页面中可以添加脚本响应元素的事件,例如超链接的OnClick事件,图片的OnMouseMove事件,我们也可以使VB程序响应这些事件。下面是一个VB响应页面中按钮的Click事件的代码: 首先建立一个新工程,在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”按钮。程序就会弹出消息框提示“你点击了按钮.” |
(陈锐) | 上面的范例是监控一个有name属性的按钮,对于像图片这样的元素,你可以给它一个Name,或者遍历页面元素获得Img元素,下面是一个遍历页面元素的范例: 怎么用vb script脚本读出网页中radio选的值? 代码: <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> 基本上就是通过遍历访问页面中的元素来实现的 |
(想吃老虎的小猪) | tips:程序中如何监控网页中元素的事件 这段代码很眼熟,从MSDN翻译的吧,呵呵 '将事件响应类连接到页面的按钮btnMyButton上 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存在恶意攻击的可能)... |
(想吃老虎的小猪) | #6楼 得分:0回复于:2002-03-18 11:27:09 另外请教 TechnoFantasy(www.applevb.com) 我认为 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的代码的时候将该方法标注为默认方法(属性也是如此)呢? |
联系客服