Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba HTMLCanvasElement类型不匹配_Vba_Mshtml_Type Mismatch - Fatal编程技术网

Vba HTMLCanvasElement类型不匹配

Vba HTMLCanvasElement类型不匹配,vba,mshtml,type-mismatch,Vba,Mshtml,Type Mismatch,我正在使用VBA编写一个InternetExplorer实例的脚本,该实例上有一个画布。我已经设置好了它,这样我就可以使用VBA中的类,比如圆和线在画布上绘制。这一切都很好,我有一个力定向动画图形工作 然而,现在我试图在VBA中将用户事件(如鼠标单击)捕获为事件,我遇到了一个奇怪的问题我创建了一个类型为HTMLCanvasElement的变量,但是当我尝试将HTMLCanvasElement对象分配给它时,我得到了一个类型不匹配的错误。 注意:您需要为InternetExplorer类对象添加对

我正在使用VBA编写一个InternetExplorer实例的脚本,该实例上有一个画布。我已经设置好了它,这样我就可以使用VBA中的类,比如圆和线在画布上绘制。这一切都很好,我有一个力定向动画图形工作

然而,现在我试图在VBA中将用户事件(如鼠标单击)捕获为事件,我遇到了一个奇怪的问题我创建了一个类型为HTMLCanvasElement的变量,但是当我尝试将HTMLCanvasElement对象分配给它时,我得到了一个类型不匹配的错误。

注意:您需要为
InternetExplorer
类对象添加对“Microsoft Internet控件”的引用,并为MSHTML类对象添加对“Microsoft HTML对象库”的引用

Option Compare Database
Option Explicit

Dim ie As InternetExplorer
Dim document As HTMLDocument
Dim WithEvents window As HTMLWindow2
Dim ctx As ICanvasRenderingContext2D
Dim WithEvents canvas As MSHTML.HTMLCanvasElement

Private Sub Class_Initialize()
    Set ie = New InternetExplorer
    ie.StatusBar = False
    ie.AddressBar = False
    ie.MenuBar = False
    ie.Toolbar = False

    ie.Navigate "about:blank"
    While Not ie.ReadyState = READYSTATE_COMPLETE
        DoEvents
    Wend
    ie.Visible = True
    Set document = ie.document
    document.body.innerHTML = "<div><canvas id='myCanvas' width='10' height='10' style=""border:1px solid #000000;"">" & _
            "Your browser does not support the HTML5 canvas tag" & _
            "</canvas></div>"

    'Set canvas = document.getElementById("myCanvas")  'This line triggers a Type Mismatch!!!

    Set ctx = document.getElementById("myCanvas").getContext("2d")

    Set window = document.parentWindow

    resizeCanvas
End Sub

Private Sub window_onload()
    window_onresize
End Sub

Private Sub window_onresize()
    resizeCanvas
End Sub

Public Sub resizeCanvas()
    ctx.canvas.Width = window.innerWidth - 23
    ctx.canvas.Height = window.innerHeight - 23
    redraw
End Sub

Public Function isClosed() As Boolean
    isClosed = window.closed
End Function

Private Sub redraw()
    'redraw shapes using ctx
End Sub

Public Sub Clear()
    ctx.clearRect 0, 0, ctx.canvas.Width, ctx.canvas.Height
End Sub
选项比较数据库
选项显式
Dim ie作为InternetExplorer
作为HTMLDocument的Dim文档
将事件窗口设置为HTMLWindow2时变暗
将ctx设置为ICanvasRenderingContext2D
使用事件画布作为MSHTML.htmlcanvaseElement进行Dim
私有子类_Initialize()
Set ie=新的InternetExplorer
ie.StatusBar=False
ie.AddressBar=False
ie.MenuBar=False
即工具栏=错误
即,导航“关于:空白”
而不是ie.ReadyState=ReadyState\u完成
多芬特
温德
可见=真实
Set document=ie.document
document.body.innerHTML=”“&_
“您的浏览器不支持HTML5画布标记”&_
""
'Set canvas=document.getElementById(“myCanvas”)'此行触发类型不匹配!!!
设置ctx=document.getElementById(“myCanvas”).getContext(“2d”)
设置窗口=document.parentWindow
调整画布大小
端接头
专用子窗口_onload()
调整窗口大小
端接头
私有子窗口_onresize()
调整画布大小
端接头
公共子大小调整画布()
ctx.canvas.Width=window.innerWidth-23
ctx.canvas.Height=window.innerHeight-23
重画
端接头
公共函数isClosed()为布尔值
isClosed=window.closed
端函数
私有子重绘()
'使用ctx重新绘制形状
端接头
公共分区清除()
ctx.clearRect 0,0,ctx.canvas.Width,ctx.canvas.Height
端接头
我注释掉了带有类型不匹配的行,这样您就可以看到所有操作都是以该异常运行的

我测试了一些不同的东西:

  • 监视窗口将
    document.getElementById(“myCanvas”)
    的类型按预期列出为HTMLCanvasElement
  • ?即时窗口中的TypeName(document.getElementById(“myCanvas”))
    返回“HTMLCanvasElement”
  • ?文档类型。getElementById(“myCanvas”)是HTMLCanvasElement
    ,在即时窗口中返回False。这显然很奇怪,让我想知道是否在mshtml.tlb类型库中对HTMLCanvasElement的定义不正确

您是否尝试将其声明为
IHTMLCanvaseElement


我冒昧地打开tlb,自己看看。这就是它的定义:

    [id(0x00000440)]
    HRESULT getElementById(
                    [in] BSTR v, 
                    [out, retval] IHTMLElement** pel);
请注意,它返回的是接口指针,而不是强类型对象。这可能会影响您的工作,因为
htmlcanvaseElement
不可创建:

[
  uuid(305106E5-98B5-11CF-BB82-00AA00BDCE0B),
  noncreatable
]
coclass HTMLCanvasElement {

tlb中的任何内容都不会返回coclass的实例。这会在用事件声明它时产生一个问题,因为
IHTMLCanvaseElement
没有事件源-这些事件来自
HTMLElementEvents


请注意,在VBA中也没有在
IHTMlement
HTMLCASEElement
之间转换的方法。看起来tlb的布局可能会限制您使用
函数Declare
来欺骗封送员返回强类型对象引用,或者使用某种包装器来实现这一点。

IHTMLCanvasElement
不会生成事件。@Comintern,很好,我完全错过了事件方面。哇,这成了一个很难解决的问题!我正在考虑尝试用一个Div包围画布,然后使用htmldevelment作为捕获事件的方法-有人知道如何确保画布事件在周围的Div中出现吗?查看
文档中的画布。所有的
都是
Variant\Object\HTMLCanvasElement
@ThunderFrame类型,这正是我的原因希望它能起作用,但遗憾的是:(