You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
351 lines
12 KiB
351 lines
12 KiB
' A WebBrowser host fashioned as a UserControl. This allows us to:
|
|
' (1) Encapsulate common tasks while using the WebOC (performing actions on DocumentComplete, saving files to
|
|
' disk, etc.).
|
|
' (2) Reuse all the above functionality on different forms - particularly
|
|
' useful for handling NewWindow2.
|
|
|
|
Imports mshtml
|
|
Imports System.Resources
|
|
|
|
Public Class WebOCHostCtrl
|
|
Inherits System.Windows.Forms.UserControl
|
|
|
|
' Expose WebBrowser events so that clients can sink them simply and
|
|
' directly, without exposing the underlying control.
|
|
Public Event CommandStateChange(ByVal Sender As Object, ByVal E As AxSHDocVw.DWebBrowserEvents2_CommandStateChangeEvent)
|
|
Public Event EnableBack(ByVal Sender As Object, ByVal E As System.EventArgs)
|
|
Public Event DisableBack(ByVal Sender As Object, ByVal E As System.EventArgs)
|
|
Public Event EnableForward(ByVal Sender As Object, ByVal E As System.EventArgs)
|
|
Public Event DisableForward(ByVal Sender As Object, ByVal E As System.EventArgs)
|
|
Public Event StatusTextChange(ByVal sender As Object, ByVal e As AxSHDocVw.DWebBrowserEvents2_StatusTextChangeEvent)
|
|
Public Event DocumentComplete(ByVal sender As Object, ByVal e As AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent)
|
|
Public Event TopLevelNavigateComplete2(ByVal sender As Object, ByVal e As AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event)
|
|
|
|
' Instance data.
|
|
Private enableCtxMenu As Boolean
|
|
|
|
' The current instance of MSHTML.
|
|
Private WithEvents doc As HtmlDocument
|
|
|
|
' The GUID we need to invoke FInd, View Source and Options on
|
|
' WebBrowser. Note that the second param is in its two complement
|
|
' representation because the number otherwise outstrips the size
|
|
' of a VB short.
|
|
'Private cmdGUID As New Guid(&HED016940, -17061, &H11CF, &HBA, &H4E, &H0, &HC0, &H4F, &HD7, &H8, &H16)
|
|
|
|
' Constants for the above-named commands
|
|
Private Enum MiscCommandTarget
|
|
Find = 1
|
|
ViewSource
|
|
Options
|
|
End Enum
|
|
|
|
' Constants for regular OLECMDID command targets.
|
|
|
|
|
|
' Constants for forward/back testing.
|
|
Enum CommandState
|
|
UpdateCommands = -1
|
|
Forward = 1
|
|
Back = 2
|
|
End Enum
|
|
|
|
#Region " Windows Form Designer generated code "
|
|
|
|
Public Sub New()
|
|
MyBase.New()
|
|
|
|
'This call is required by the Windows Form Designer.
|
|
InitializeComponent()
|
|
|
|
'Add any initialization after the InitializeComponent() call
|
|
|
|
' Load resources.
|
|
rm = New ResourceManager("WebOCHostCtrl", System.Reflection.Assembly.GetExecutingAssembly())
|
|
End Sub
|
|
|
|
'UserControl overrides dispose to clean up the component list.
|
|
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
|
|
If disposing Then
|
|
If Not (components Is Nothing) Then
|
|
components.Dispose()
|
|
End If
|
|
|
|
rm = Nothing
|
|
End If
|
|
MyBase.Dispose(disposing)
|
|
End Sub
|
|
|
|
'Required by the Windows Form Designer
|
|
Private components As System.ComponentModel.IContainer
|
|
|
|
'NOTE: The following procedure is required by the Windows Form Designer
|
|
'It can be modified using the Windows Form Designer.
|
|
'Do not modify it using the code editor.
|
|
Friend WithEvents webBrowser As AxSHDocVw.AxWebBrowser
|
|
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
|
|
Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(WebOCHostCtrl))
|
|
Me.webBrowser = New AxSHDocVw.AxWebBrowser()
|
|
CType(Me.webBrowser, System.ComponentModel.ISupportInitialize).BeginInit()
|
|
Me.SuspendLayout()
|
|
'
|
|
'webBrowser
|
|
'
|
|
Me.webBrowser.Anchor = (((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
|
|
Or System.Windows.Forms.AnchorStyles.Left) _
|
|
Or System.Windows.Forms.AnchorStyles.Right)
|
|
Me.webBrowser.Enabled = True
|
|
Me.webBrowser.OcxState = CType(resources.GetObject("webBrowser.OcxState"), System.Windows.Forms.AxHost.State)
|
|
Me.webBrowser.Size = New System.Drawing.Size(616, 320)
|
|
Me.webBrowser.TabIndex = 0
|
|
'
|
|
'WebOCHostCtrl
|
|
'
|
|
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.webBrowser})
|
|
Me.Name = "WebOCHostCtrl"
|
|
Me.Size = New System.Drawing.Size(616, 320)
|
|
CType(Me.webBrowser, System.ComponentModel.ISupportInitialize).EndInit()
|
|
Me.ResumeLayout(False)
|
|
|
|
End Sub
|
|
|
|
#End Region
|
|
|
|
'
|
|
' PRIVATE INSTANCE VARIABLES
|
|
'
|
|
Private rm As ResourceManager
|
|
|
|
'
|
|
' PROPERTIES
|
|
'
|
|
|
|
' Obtain a reference to the hosted HTML document.
|
|
Public ReadOnly Property HtmlDocument() As mshtml.HTMLDocument
|
|
Get
|
|
Dim doc As HTMLDocument
|
|
Try
|
|
doc = CType(webBrowser.Document, mshtml.HTMLDocument)
|
|
Catch
|
|
Throw (New Exception(rm.GetString("Err_HtmlDocumentNotReady")))
|
|
End Try
|
|
|
|
HtmlDocument = doc
|
|
End Get
|
|
End Property
|
|
|
|
'
|
|
' METHODS
|
|
'
|
|
|
|
' Define a simple Navigate to handle most navigation circumstances.
|
|
Public Overloads Sub Navigate(ByVal url As String)
|
|
Dim o As New Object()
|
|
|
|
webBrowser.Navigate(url, o, o, o, o)
|
|
End Sub
|
|
|
|
Public Overloads Sub Navigate(ByVal url As String, ByVal o As Object)
|
|
|
|
End Sub
|
|
|
|
' Print a document, telling the WebBrowser whether or not to display
|
|
' the UI. MSHTML exposes a method to print as well, but we want these
|
|
' semantics to work for any document server (Word, Excel, etc.), so we
|
|
' perform the op against the doc host instead.
|
|
Public Sub Print(ByVal doUI As Boolean)
|
|
'Dim doOpt As SHDocVw.OLECMDEXECOPT
|
|
|
|
'If doUI Then
|
|
' doOpt = SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER
|
|
'Else
|
|
' doOpt = SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER
|
|
'End If
|
|
|
|
'webBrowser.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT, doOpt)
|
|
End Sub
|
|
|
|
' Print a document using an MSHTML Print Template.
|
|
Public Sub PrintFormatted(ByVal tmplPath As String)
|
|
'Dim o As New Object()
|
|
|
|
'webBrowser.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, CType(tmplPath, Object), o)
|
|
End Sub
|
|
|
|
' Easy commands to test copy/cut/paste status of the control.
|
|
Public Function IsCutEnabled() As Boolean
|
|
'Dim res As SHDocVw.OLECMDF = webBrowser.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_CUT)
|
|
'If (res And SHDocVw.OLECMDF.OLECMDF_ENABLED) = SHDocVw.OLECMDF.OLECMDF_ENABLED Then
|
|
' IsCutEnabled = True
|
|
'Else
|
|
' IsCutEnabled = False
|
|
'End If
|
|
End Function
|
|
|
|
Public Function IsCopyEnabled() As Boolean
|
|
'Dim res As SHDocVw.OLECMDF = webBrowser.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_COPY)
|
|
'If (res And SHDocVw.OLECMDF.OLECMDF_ENABLED) = SHDocVw.OLECMDF.OLECMDF_ENABLED Then
|
|
' IsCopyEnabled = True
|
|
'Else
|
|
' IsCopyEnabled = False
|
|
'End If
|
|
End Function
|
|
|
|
Public Function IsPasteEnabled() As Boolean
|
|
'Dim qVal As SHDocVw.OLECMDF = webBrowser.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_PASTE)
|
|
'Dim i As Integer
|
|
'If (qVal And SHDocVw.OLECMDF.OLECMDF_ENABLED) = SHDocVw.OLECMDF.OLECMDF_ENABLED Then
|
|
' IsPasteEnabled = True
|
|
'Else
|
|
' IsPasteEnabled = False
|
|
'End If
|
|
End Function
|
|
|
|
' View the source of the current HTML page in Notepad.
|
|
Public Sub ViewSource()
|
|
Dim cmdt As IOleCommandTarget
|
|
Dim o As Object
|
|
|
|
' If the doc object isn't set to anything, or there's
|
|
' some bizarre error in accessing IOleCommandTarget,
|
|
' exit gracefully.
|
|
Try
|
|
cmdt = CType(doc, IOleCommandTarget)
|
|
'cmdt.Exec(cmdGUID, MiscCommandTarget.ViewSource, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, o, o)
|
|
Catch
|
|
Throw (New Exception(Err.GetException().Message))
|
|
End Try
|
|
End Sub
|
|
|
|
Public Sub Find()
|
|
Dim cmdt As IOleCommandTarget
|
|
Dim o As Object
|
|
|
|
' If the doc object isn't set to anything, or there's
|
|
' some bizarre error in accessing IOleCommandTarget,
|
|
' exit gracefully.
|
|
Try
|
|
cmdt = CType(doc, IOleCommandTarget)
|
|
'cmdt.Exec(cmdGUID, MiscCommandTarget.Find, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, o, o)
|
|
Catch
|
|
Throw (New Exception(Err.GetException().Message))
|
|
End Try
|
|
End Sub
|
|
|
|
Public Sub InternetOptions()
|
|
Dim cmdt As IOleCommandTarget
|
|
Dim o As Object
|
|
|
|
' If the doc object isn't set to anything, or there's
|
|
' some bizarre error in accessing IOleCommandTarget,
|
|
' exit gracefully.
|
|
Try
|
|
cmdt = CType(doc, IOleCommandTarget)
|
|
'cmdt.Exec(cmdGUID, MiscCommandTarget.Options, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, o, o)
|
|
Catch
|
|
' Throw (New Exception(Err.GetException().Message))
|
|
End Try
|
|
End Sub
|
|
|
|
' Enable or disable IE's context menu? This allows the parent host
|
|
' to render its own.
|
|
Public Property BrowserContextMenu() As Boolean
|
|
Get
|
|
BrowserContextMenu = enableCtxMenu
|
|
End Get
|
|
Set(ByVal Value As Boolean)
|
|
' Disable it. Note that we'll need to do this for each
|
|
' page navigation, as the event sink is specific to an
|
|
' instance of MSHTML.
|
|
If (True = Value) Then
|
|
DisableContextMenu()
|
|
Else
|
|
EnableContextMenu()
|
|
End If
|
|
|
|
enableCtxMenu = Value
|
|
End Set
|
|
End Property
|
|
|
|
' Some simple thunks
|
|
Public Sub GoBack()
|
|
webBrowser.GoBack()
|
|
End Sub
|
|
|
|
Public Sub GoForward()
|
|
webBrowser.GoForward()
|
|
End Sub
|
|
|
|
Public Sub GoHome()
|
|
webBrowser.GoHome()
|
|
End Sub
|
|
|
|
' Cut/copy/paste methods.
|
|
Public Sub Cut()
|
|
'webBrowser.ExecWB(SHDocVw.OLECMDID.OLECMDID_CUT, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER)
|
|
End Sub
|
|
|
|
Public Sub Copy()
|
|
'webBrowser.ExecWB(SHDocVw.OLECMDID.OLECMDID_COPY, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER)
|
|
End Sub
|
|
|
|
Public Sub Paste()
|
|
'webBrowser.ExecWB(SHDocVw.OLECMDID.OLECMDID_PASTE, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER)
|
|
End Sub
|
|
|
|
'
|
|
' PRIVATE METHODS
|
|
'
|
|
Public Sub DisableContextMenu()
|
|
|
|
End Sub
|
|
|
|
Public Sub EnableContextMenu()
|
|
|
|
End Sub
|
|
|
|
' Multiplex this event, so that hosts don't have to fuss with
|
|
' the CSC_ values or repeat this logic for every hosted
|
|
' instance.
|
|
Private Sub webBrowser_CommandStateChange(ByVal sender As Object, ByVal e As AxSHDocVw.DWebBrowserEvents2_CommandStateChangeEvent) Handles WebBrowser.CommandStateChange
|
|
If CommandState.Back = e.command Then
|
|
If True = e.enable Then
|
|
RaiseEvent EnableBack(sender, New System.EventArgs())
|
|
Else
|
|
RaiseEvent DisableBack(sender, New System.EventArgs())
|
|
End If
|
|
ElseIf CommandState.Forward = e.command Then
|
|
If True = e.enable Then
|
|
RaiseEvent EnableForward(sender, New System.EventArgs())
|
|
Else
|
|
RaiseEvent DisableForward(sender, New System.EventArgs())
|
|
End If
|
|
Else
|
|
RaiseEvent CommandStateChange(sender, e)
|
|
End If
|
|
End Sub
|
|
|
|
' Perform per-document init tasks.
|
|
Private Sub webBrowser_DocumentComplete(ByVal sender As Object, ByVal e As AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent) Handles WebBrowser.DocumentComplete
|
|
Try
|
|
doc = CType(webBrowser.Document, mshtml.HTMLDocument)
|
|
Catch
|
|
' Not a fatal error - we might be hosting a Word doc in-place,
|
|
' e.g.
|
|
End Try
|
|
|
|
' Bubble up to our host.
|
|
RaiseEvent DocumentComplete(sender, e)
|
|
End Sub
|
|
|
|
'Sink the event and raise it to the container.
|
|
Private Sub webBrowser_StatusTextChange(ByVal sender As Object, ByVal e As AxSHDocVw.DWebBrowserEvents2_StatusTextChangeEvent) Handles WebBrowser.StatusTextChange
|
|
RaiseEvent StatusTextChange(sender, e)
|
|
End Sub
|
|
|
|
Private Sub webBrowser_TopLevelNavigateComplete2(ByVal sender As Object, ByVal e As AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event) Handles WebBrowser.NavigateComplete2
|
|
If (webBrowser.LocationURL).Equals(Convert.ToString(e.uRL)) Then
|
|
RaiseEvent TopLevelNavigateComplete2(sender, e)
|
|
End If
|
|
End Sub
|
|
End Class |