Стоит Windows 8 Pro, Visual Studio 2010 Express Edition . |
Встраивание возможностей броузера в приложение
Дополнительные возможности управления браузером
Рассмотрим возможности прерывания загрузки, обновления страницы и перехода на начальную страницу браузера.
Если Web-страница большого объема или пропускная способность соединения слабая, то у пользователя может возникнуть необходимость прервать загрузку страницы броузером. Для этого в класса CHtmlView предусмотрена функция Stop().
Когда пользователь перемещается кнопками "Назад" и "Вперед" по уже посещенным Web-страницам, то он фактически использует информацию, которую броузер хранит в своем внутреннем кэше. Чтобы заставить броузер перегрузить страницу, а не просто отобразить версию из кэша, существует функция Refresh().
И последнее... Чтобы быстро переместиться на домашнюю страницу броузера, а это как правило стартовая страница с именем Home или Index, можно использовать встроенную в класс CHtmlView функцию GoHome(). При выполнении этой функции внутренний кэш броузера очищается.
Прежде всего нужно дополнить меню Navigate нашего приложения соответствующими пунктами.
- Отредактируйте меню приложения, добавив сепаратор и три пункта в соответствии с рисунком
- Откорректируйте свойства новых пунктов меню, используя информацию из таблицы
- Создайте обработчики для каждого нового пункта меню через контекстное меню пункта и команду Add Event Handler. Обработчики нужно размещать в классе CWebBrowseView, который и выбирайте в списке Class list мастера
-
Заполните обработчики следующим кодом
Обработчики для дополнительных возможностей броузера void CWebBrowseView::OnNavigateStop() { // TODO: Add your command handler code here // Остановить текущую загрузку Stop(); } void CWebBrowseView::OnNavigateRefresh() { // TODO: Add your command handler code here // Перезагрузить текущую страницу Refresh(); } void CWebBrowseView::OnNavigateGohome() { // TODO: Add your command handler code here // Идти на начальную страницу GoHome(); }
- Постройте приложение - все должно работать!
Отображение заголовка текущей Web-страницы в заголовке окна приложения
Чтобы получить заголовок текущей Web -страницы и установить его в заголовке окна приложения воспользуемся свойством Title и функцией (средством доступа к свойству) get_title() интерфейса IHTMLDocument2. Для этого выполним несколько пошаговых инструкций.
- Добавьте к приложению новый класс, выполнив команду Add/Add Class через контекстное меню корневого узла любой из приведенных ниже панелей оболочки, поскольку новый класс будет принадлежать всему приложению
- В появившемся окне Add Class выберите шаблон MFC Class From TypeLib для вызова соответствующего мастера создаваемого класса
- После щелчка по кнопке Open появится окно мастера, которое настройте так, как показано на рисунке
-
Для настройки мастера Add Class From TypeLib Wizard выполните следующее:
- Из раскрывающегося списка Available type libraries выберите значение Microsoft HTML Object Library <4.0>
- В списке Interfaces найдите строку IHTMLDocument2 и выделите ее
- Нажмите верхнюю кнопку со значком угловой стрелки ">", чтобы создать в правом списке Generated classes имя создаваемого класса, соответствующее выбранному интерфейсу
-
Щелкните по кнопке Finish для создания класса
В результате мастер создаст исходный код интерфейсного класса для интерфейса IHTMLDocument2, который полностью разместится в заголовочном файле CHTMLDocument2.h приложения и нам остается только воспользоваться кодом этого класса для решения поставленной задачи загрузки заголовка текущей Web -страницы.
-
В файле WebBrowseView.cpp класса представления CWebBrowseView найдите уже использованную нами ранее функцию OnDocumentComplete() и дополните ее кодом, как показано ниже
Код, добавленный в функцию OnDocumentComplete() файла WebBrowseView.cpp void CWebBrowseView::OnDocumentComplete(LPCTSTR lpszURL) { // TODO: Add your specialized code here and/or call the base class // Передать текущий URL в класс фрейма для вывода в поле адреса ((CMainFrame*)GetParentFrame())->SetAddress(lpszURL); // Создать экземпляр интерфейса класса CHTMLDocument2 CHTMLDocument2* pHDoc = new CHTMLDocument2(GetHtmlDocument()); // Получить заголовок текущей страницы CString strTitle = pHDoc->get_title(); // Получить указатель на класс документа CWebBrowseDoc* pDoc = GetDocument(); // Установить заголовок окна приложения pDoc->SetTitle(strTitle); // Удалить экземпляр интерфейса на куче delete pHDoc; CHtmlView::OnDocumentComplete(lpszURL); }
-
Добавьте директиву #include в начало файла WebBrowseView.cpp для подключения описания нового класса CHTMLDocument2
Подключение класса интерфейса к файлу представления WebBrowseView.cpp // WebBrowseView.cpp : implementation of the CWebBrowseView class // #include "stdafx.h" #include "WebBrowse.h" #include "WebBrowseDoc.h" #include "WebBrowseView.h" #include ".\webbrowseview.h" #include "MainFrm.h" #include "CHTMLDocument2.h" #ifdef _DEBUG #define new DEBUG_NEW #endif .........................................
-
Постройте приложение и убедитесь, что заголовок текущей страницы отображается в заголовке окна приложения
Если при построении приложения Ваш компилятор выдает ошибки в коде добавленного нами файла интерфейса CHTMLDocument2.h (мой выдает!), то сделайте следующее
-
Откройте в оболочке на редактирование файл CHTMLDocument2.h, найдите в нем функции write() и writeln() и внесите в них следующие изменения
Корректируем "Ошибки Билла" ...................................... void write(SAFEARRAY * psarray) { // static BYTE parms[] = VTS_NONE ; static BYTE* parms = (BYTE*)VTS_NONE ; InvokeHelper(0x41e, DISPATCH_METHOD, VT_EMPTY, NULL, parms, psarray); } void writeln(SAFEARRAY * psarray) { // static BYTE parms[] = VTS_NONE ; static BYTE* parms = (BYTE*)VTS_NONE ; InvokeHelper(0x41f, DISPATCH_METHOD, VT_EMPTY, NULL, parms, psarray); } ......................................
- Теперь опять постройте приложение (ошибок больше быть не должно) и убедитесь, что заголовок текущей страницы отображается в заголовке окна приложения