Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 1000 / 59 | Оценка: 4.11 / 3.89 | Длительность: 29:38:00
Самостоятельная работа 21:

Встраивание возможностей броузера в приложение

< Самостоятельная работа 20 || Самостоятельная работа 21: 123456

Дополнительные возможности управления браузером

Рассмотрим возможности прерывания загрузки, обновления страницы и перехода на начальную страницу браузера.

Если Web-страница большого объема или пропускная способность соединения слабая, то у пользователя может возникнуть необходимость прервать загрузку страницы броузером. Для этого в класса CHtmlView предусмотрена функция Stop().

Когда пользователь перемещается кнопками "Назад" и "Вперед" по уже посещенным Web-страницам, то он фактически использует информацию, которую броузер хранит в своем внутреннем кэше. Чтобы заставить броузер перегрузить страницу, а не просто отобразить версию из кэша, существует функция Refresh().

И последнее... Чтобы быстро переместиться на домашнюю страницу броузера, а это как правило стартовая страница с именем Home или Index, можно использовать встроенную в класс CHtmlView функцию GoHome(). При выполнении этой функции внутренний кэш броузера очищается.

Прежде всего нужно дополнить меню Navigate нашего приложения соответствующими пунктами.

  • Отредактируйте меню приложения, добавив сепаратор и три пункта в соответствии с рисунком

  • Откорректируйте свойства новых пунктов меню, используя информацию из таблицы
    Свойства дополнительных пунктов меню
    Свойство Значение
    ID ID_NAVIGATE_STOP
    Caption &Stop
    Prompt Остановить загрузку\nСтоп
    ID ID_NAVIGATE_REFRESH
    Caption &Refresh
    Prompt Обновить текущую страницу\nОбновить
    ID ID_NAVIGATE_GOHOME
    Caption GoHome
    Prompt Перейти на начальную страницу\nДомой
  • Создайте обработчики для каждого нового пункта меню через контекстное меню пункта и команду 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);
      }
    ......................................
  • Теперь опять постройте приложение (ошибок больше быть не должно) и убедитесь, что заголовок текущей страницы отображается в заголовке окна приложения
< Самостоятельная работа 20 || Самостоятельная работа 21: 123456
Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .