Готовые решения и полезные коды на Visual Basic .NET (Часть-1) - Visual Basic .NET - Ответ 6375281

Глубины WebBrowser и MSHTML.

Рассмотрим несколько простых, но в то же время интересных и полезных трюков с WebBrowser и MSHTML.

Для справок:

MSHTML (он же Trident) - это движок от Internet Explorer, то есть библиотека, работающая с DOM-содержимым - HTML-кодом страницы. MSHTML хранит код страницы, при необходимости редактирует и указывает IWebBrowser2 (на котором основан WebBrowser), как страницу отображать визуально, а он отображает.

1. Как сделать, чтобы форма не зависала, пока WebBrowser загружает страницу?

VB.NETВыделить код

1
2
3
4
5
6
7
8

WebBrowser1.Navigate("http://mail.ru/")
 
While WebBrowser1.Document Is Nothing
    Application.DoEvents()
End While
While WebBrowser1.Document.Body Is Nothing
    Application.DoEvents()
End While

Примечание:

это решение позволяет также убедиться, что:

1) WebBrowser1.Document загружен, после первого цикла

2) WebBrowser1.Document.Body загружено, после второго цикла

И всё это не используя DocumentCompleted.

2. Как по-быстрому сделать визуальный (WYSIWYG) редактор страниц типа очень простого аналога Dreamweaver?

VB.NETВыделить код

1
2
3
4
5
6
7

Imports mshtml
...
Private HtmlDoc2 As IHTMLDocument2
...
' в DocumentCompleted или не раньше, чем после первого цикла из трюка 1!
HtmlDoc2 = DirectCast(WebBrowser1.Document.DomDocument, IHTMLDocument2)
HtmlDoc2.designMode = "on" ' обратно - "off"

Примечание:

условия типа If ...designMode = "on" Then не работают.

3. Как сфокусировать документ в WebBrowser в режиме редактирования, чтобы не тыкать его мышью, прежде чем печатать символы? WebBrowser1.Focus не работает.

VB.NETВыделить код

1
2

' в DocumentCompleted или после второго цикла из трюка 1!
WebBrowser1.Document.Body.Focus()

4. Нет ли в WebBrowser стандартных функций для вставки кнопок, картинок, ссылок и т.д. в режиме редактирования?

В WebBrowser - нет. Как уже говорилось, IWebBrowser2, на котором он основан, не работает с кодом страницы (авторы WebBrowser прикрутили к нему ещё кое-какие выжимки MSHTML, но там только самое основное вроде Cut, Copy, Paste).

А вот в MSHTML - есть.

Используя HtmlDoc2 из трюка 2:

VB.NETВыделить код

1
2
3
4
5
6

'кнопка
HtmlDoc2.execCommand("InsertButton", False, Nothing)
'картинка
HtmlDoc2.execCommand("InsertImage", True, Nothing)
'ссылка
HtmlDoc2.execCommand("CreateLink", True, Nothing)

Примечание:

полный список команд + описание ещё нескольких интересных трюков есть

тут

.

Примечание № 2:

включенный WYSIWYG для этого дела НЕ нужен.

4А. А если я захочу ссылку на локальный файл вставить, мне тоже URL руками вводить?!

VB.NETВыделить код

| | |
| --- | --- |
| 1 | HtmlDoc2.execCommand("CreateLink", False, "URL") |

5. Как же всё-таки уныла эта вставка элементов через execCommand()... По-другому-то никак?

VB.NETВыделить код

1
2
3

Dim img As HtmlElement = WebBrowser1.Document.CreateElement("img")
img.SetAttribute("src", "путь к картинке")
WebBrowser1.Document.Body.AppendChild(img)

Обратите внимание, без MSHTML.

Потому что в WebBrowser, в отличие от нативного IWebBrowser2, включена сыроватая оболочка для части его функционала.

Примечание:

включенный WYSIWYG опять НЕ нужен.

P.S.

Во вложении - проект с трюками 1, 2, 3.

Вернуться к обсуждению:

Готовые решения и полезные коды на Visual Basic .NET (Часть-1) Visual Basic .NET