Сообщений 5 Оценка 3 Оценить |
Демонстрационная программа для 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 Оценить |