Сообщений 2    Оценка 46        Оценить  
Система Orphus

Как изменить параметры загрузки документов?

Автор: Тимофей Чадов
Опубликовано: 21.09.2001
Исправлено: 13.03.2005
Версия текста: 1.0

Демонстрационная программа - 9 KB
Исходные тексты - 39 KB

Родительские свойства контейнера

WebBrowser скрывает большинство глобальных настроек интернета. В действительности это приводит к тому, что Вы, вероятно, не сможете одновременно задать различные параметры подключения для IE и своего приложения, использующего WebBrowser. Однако, все же есть параметры броузера, которыми можно научиться управлять. Так, например, можно заставить броузер не загружать фреймы, рисунки или не выполнять java-аплеты и т.п. Управление этими параметрами реализовано через механизм свойств ActiveX элементов, а именно - через родительские свойства контейнера (ambient properties).

Родительские свойства (или свойства окружения) - это свойства, доступные через интерфейс IDispatch контейнера. Они являются общими для всех элементов внутри контейнера. Стандартные родительские свойства имеют заранее определенные disp идентификаторы. Таким образом, например, элементы могут узнать цвет фона контейнера и подстроиться под него.

WebBrowser, в свою очередь, использует этот механизм, предполагая наличие у контейнера свойства с идентификатором DISPID_AMBIENT_DLCONTROL. Таким образом, реализовав данное свойство, можно управлять параметрами загрузки броузера.

MFC предоставляет удобный способ воздействовать на свойства окружения контейнера. Для этого класс CWnd содержит метод OnAmbientProperty. Его несложно добавить, воспользовавшись ClassWizzard.

BOOL CMyHtmlView::OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar)
// Изменяем родительские свойства 
{
    // Никаких рисунков и ActiveX
    if (dispid == DISPID_AMBIENT_DLCONTROL)
    {
        pvar->vt = VT_I4;
        pvar->lVal = /*DLCTL_DLIMAGES*/ | DLCTL_NO_DLACTIVEXCTLS;

        return TRUE;
    }
    return CHtmlView::OnAmbientProperty(pSite, dispid, pvar);
}

При вызове OnAmbientProperty с dispid = DISPID_AMBIENT_DLCONTROL выходной параметр pvar может принимать комбинацию следующих значений. Эти и некоторые другие идентификаторы описаны в файле MSHTMDID.H

DLCTL_BGSOUNDS Проигрывать фоновые звуки, ассоциированные с документом
DLCTL_DLIMAGES Загружать изображения с сервера
DLCTL_DOWNLOADONLY Загрузить страницу, но не отображать
DLCTL_FORCEOFFLINE Всегда работать в режиме оффлайн. Будет использована версия документа из кеша. Это приведет к установке флага BINDF_OFFLINEOPERATION, даже если компьютер соединен с Интернетом при осуществлении запроса через URLMON.
DLCTL_NO_DLACTIVEXCTLS Не загружать элементы управления ActiveX
DLCTL_NO_FRAMEDOWNLOAD Не загружать содержимое фреймов.
DLCTL_NO_JAVA Не исполнять Java аплеты
DLCTL_NO_METACHARSET Игнорировать набор символов, содержащихся в элементе META документа
DLCTL_NO_RUNACTIVEXCTLS Не запускать на исполнение элементы управления ActiveX
DLCTL_NO_SCRIPTS Не исполнять скрипты
DLCTL_OFFLINE Тоже, что и DLCTL_OFFLINEIFNOTCONNECTED
DLCTL_OFFLINEIFNOTCONNECTED Работать в оффлайне, если нет подключения к Интернет. Это приведет к установке флага BINDF_GETFROMCACHE_IF_NET_FAIL, даже если компьютер соединен с Интернетом при осуществлении запроса через URLMON.
DLCTL_PRAGMA_NO_CACHE Не использовать кеш. Обновить информацию, даже если данные не устарели. Это приведет к установке флага BINDF_PRAGMA_NO_CACHE при осуществлении запроса через URLMON.
DLCTL_RESYNCHRONIZE Игнорировать содержимое кеша. Обновить информацию, если данные устарели. Это приведет к установке флага BINDF_RESYNCHRONIZE при осуществлении запроса через URLMON.
DLCTL_SILENT Не отображать пользовательский интерфейс и не посылать пользовательских уведомлений. Это приведет к установке флага BINDF_SILENTOPERATION при осуществлении запроса через URLMON.
DLCTL_URL_ENCODING_DISABLE_UTF8 Запретить использование кодировки UTF-8.
DLCTL_URL_ENCODING_ENABLE_UTF8 Разрешить использование кодировки UTF-8.
DLCTL_VIDEOS Проигрывать видео, содержащееся в документе.
ПРИМЕЧАНИЕ
Приведенный выше список неполон, а некоторые из констант определены начиная с IE 5.0. За подробностями обращайтесь к Platform SDK.

Итак, мы научились изменять некоторые параметры WebBrowser'а. Однако, если сейчас запустить пример на выполнение можно обнаружить, что вызов CWnd::OnAmbientProperty происходит только один раз для каждого свойства при загрузке очередного документа. А что, если нам захочется менять необходимые нам параметры для текущего документа во время выполнения? Для этого надо научиться уведомлять броузер об изменении родительских свойств. Рычаги управления этим процессом расположены в интерфейсе IOleControl. Элементы управления реагируют на изменение свойств контейнера, реализуя метод IOleControl::OnAmbientPropertyChange. В следующем примере показано, как заставить WebBrowser обновить информацию о параметрах загрузки.

void CMyHtmlView::NotifyControl()
// Сообщаем WebBrowser'у, что родительские свойства изменились
{
    ASSERT( m_pBrowserApp != NULL);

    IOleControl* pOleControl;
    HRESULT hr = m_pBrowserApp->QueryInterface( __uuidof( IOleControl ), (void**)&pOleControl );
    if ( SUCCEEDED( hr ) )
    {
        pOleControl->OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL);
        pOleControl->Release();
    }
}

Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 2    Оценка 46        Оценить