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

Как использовать событие OnNewWindow2?

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

Демонстрационная программа для SDI- 150 KB
Демонстрационная программа для MDI - 153 KB
Исходные тексты для SDI - 34 KB
Исходные тексты для MDI - 36 KB


Это событие возникает, когда WebBrowser пытается открыть страницу в новом окне. Например, это может случится, если пользователь выбрал команду Открыть в новом окне (щелкнул по ссылке с нажатой клавишей Shift) или в результате выполнения скрипта window.open .., и т.п. Понятно, что такое поведение броузера не всегда нас устраивает. Пользователь наверняка будет в недоумении, если вместо вашей программы откроется окно IE. Эту проблему можно решить, переопределив реакцию на событие NewWindow2.

Обработчик сообщения принимает на вход два параметра.

OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel);
ppDisp Указатель на интерфейс IDispatch броузера, который будет использован в качестве объекта назначения, т.е. Вы можете перенаправить команду Открыть в новом окне в свой объект.
Cancel Указатель на булевскую переменную. Если нужно запретить открытие нового окна, достаточно установить Cancel в значение VARIANT_TRUE. При этом переход будет отменен.

Итак, чтобы запретить открытие новых окон, достаточно написать следующее.

void CMyHtmlView::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel) 
{
    *Cancel = VARIANT_TRUE;
}

Теперь предположим, что мы решили реализовать многооконный режим. Т.е. будем открывать страницу в новом окне, но не в IE, а в своем. В случае диалогового приложения код может выглядеть следующим образом.

void CMyDlg::OnNewWindow2(LPDISPATCH FAR* ppDisp, BOOL FAR* Cancel)
{
    m_dlgNewWB = new CMyDlg;
    m_dlgNewWB->Create(IDD_WEBBROWSER);
    
    m_dlgNewWB->m_webBrowser.put_RegisterAsBrowser(VARIANT_TRUE);

    *ppDisp = m_dlgNewWB->m_webBrowser.GetApplication();
}

При использовании SDI или MDI приложений код выглядит схожим образом. Все сложности с корректным созданием нового фрейма. Следующий пример работает в случае и SDI, и MDI приложений.

IWebBrowser2* CMyHtmlView::GetBrowser() 
{ 
    ASSERT(m_pBrowserApp != NULL); 
    return m_pBrowserApp; 
}

void CMyHtmlView::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel) 
{
    CWinApp* pApp = AfxGetApp();

    // Получаем шаблон документа
    CDocTemplate* pDocTemplate;
    POSITION pos = pApp->GetFirstDocTemplatePosition();
    pDocTemplate = pApp->GetNextDocTemplate(pos);
    ASSERT(pDocTemplate);

    // Создаем новый фрейм
    CFrameWnd* pNewFrame = pDocTemplate->CreateNewFrame(GetDocument(),
        (CFrameWnd*)AfxGetMainWnd());
    ASSERT(pNewFrame);

    pDocTemplate->InitialUpdateFrame(pNewFrame, NULL);

    CMyHtmlView* pWBVw = (CMyHtmlView*)pNewFrame->GetActiveView();
    ASSERT(pWBVw);    
    
    // Указываем на новый броузер
    pWBVw->GetBrowser()->put_RegisterAsBrowser(VARIANT_TRUE);    
    *ppDisp = pWBVw->GetApplication();
}

Вызов put_RegisterAsBrowser регистрирует вновь созданное окно в качестве целевого объекта. Это необходимо для корректного разрешения имен. Например, если это имя окна используется где-нибудь еще с скрипте, то имеющийся экземпляр будет использоваться вместо вновь создаваемого.


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