Я использую VBA для создания сценария экземпляра InternetExplorer с Canvas. Я настроил его, чтобы использовать классы VBA, такие как Circle и Line, для рисования на холсте. Все это работает нормально, и у меня работает анимированный график, направленный силой.
Однако теперь я пытаюсь зафиксировать пользовательские события, такие как щелчки мыши, как события в VBA, и столкнулся со странной проблемой. Я создаю переменную типа HTMLCanvasElement, но когда пытаюсь присвоить ей объект HTMLCanvasElement, получаю ошибку "Несоответствие типов".
ПРИМЕЧАНИЕ. Необходимо добавить ссылки на «Microsoft Internet Controls» для объекта класса InternetExplorer
и «Библиотека объектов Microsoft HTML» для объектов класса MSHTML.
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
Я закомментировал строку с несоответствием типов, чтобы вы могли видеть, что все работает с этим исключением.
Я тестировал несколько разных вещей:
- В окне Watch указан тип
document.getElementById("myCanvas")
как HTMLCanvasElement, как и ожидалось. ?TypeName(document.getElementById("myCanvas"))
в окне интерпретации возвращает "HTMLCanvasElement"?typeof document.getElementById("myCanvas") is HTMLCanvasElement
в окне интерпретации возвращает False. Это определенно странно и заставляет меня задуматься, возможно, HTMLCanvasElement неправильно определен в библиотеке типов mshtml.tlb.
document.all
, он относится к типуVariant\Object\HTMLCanvasElement
. - person ThunderFrame   schedule 23.09.2016