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

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

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

Отображение текущего значения URL

Переходя от одной Web -странице к другой по ссылкам, настоящий броузер помещает текущее значение указателя URL в поле адреса. Тем самым дается возможность контролировать маршрут и, в случае необходимости, скопировать или изменить URL. Для получения текущего значения указателя URL нужно вызвать функцию GetLocationURL и передать полученное значение на панель управления.

Проблема в том, чтобы определить момент, когда можно получить текущий URL. Для этого в нашем классе представления CWebBrowseView, который является наследником базового класса CHtmlView, нужно переопределить некоторые функции. Данные функции вызываются, когда управляющий элемент броузера генерирует различные сообщения, в том числе:

  1. Начало перехода на новую Web -страницу
  2. Начало загрузки Web -страницы
  3. Отслеживание процесса загрузки
  4. Окончание загрузки

Перехватим событие окончания загрузки и переопределим соответствующую функцию OnDocumentComplete.

  • Выберите класс CWebBrowseView на панели Class View
  • В панели Properties выберите режим Overrides и найдите в списке имя функции OnDocumentComplete

  • Создайте для OnDocumentComplete функцию замещения, которая будет вызываться после окончания загрузки Web -страницы и которую заполните так

    Замещенная функция забора текущего URL в классе представления и вызова функции записи адреса 
    в поле редактирования из класса фрейма, где и находится панель управления с полем адреса
    void CWebBrowseView::OnDocumentComplete(LPCTSTR lpszURL)
    {
      // TODO: Add your specialized code here and/or call the base class
      // Передать текущий URL в класс фрейма для вывода в поле адреса
      ((CMainFrame*)GetParentFrame())->SetAddress(lpszURL);
      
      CHtmlView::OnDocumentComplete(lpszURL);
    }

    Обратите внимание, что в итоге не пришлось вызывать функцию GetLocationURL(), тем более, нам неизвестно было, когда ее нужно вызывать. Искомый URL мы получили как аргумент lpszURL, который сразу передали во фреймовое окно. Теперь в классе фреймового окна нужно этот URL отобразить в поле адреса с идентификатором IDC_EADDRESS.

  • Чтобы в файле WebBrowseView.cpp компилятор видел описание класса CMainFrame, добавьте в начало этого файла директиву подключения файла MainFrm.h
    Подключение к файлу WebBrowseView.cpp директивы с описанием класса CMainFrame
    // 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"
      
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
      
    ....................................
  • В панели Class View выделите класс CMainFrame и вызовите для него контекстное меню оболочки

  • Заполните мастер добавления метода так

  • Незабудьте нажать кнопку Add перед щелчком по кнопке Finish
  • Заполните заготовку функции SetAddress() следующим кодом (мы помним, что панель управления с полем адреса ассоциирована с переменной m_wndDlgBar )
    Функция класса фреймового окна CMainFrame для заполнения поля адреса 
    текущим значением URL в файле MainFrm.cpp
    // Заполнение поля адреса текущим значением URL
    void CMainFrame::SetAddress(LPCTSTR lpszURL)
    {
      // Сменить значение URL после загрузки новой страницы
      (m_wndDlgBar.GetDlgItem(IDC_EADDRESS))->SetWindowText(lpszURL);
    }

Теперь можно построить приложение и убедиться, что при переходе по ссылкам в поле адреса отображается текущий URL страницы.

Переходы GoBack и GoForward

Добавим к нашему приложению возможности перехода на предыдущую и последующую Web -страницы. Для этого нужно воспользоваться функциями GoBack() и GoForward(), унаследованными нашим классом представления CWebBrowseView от базового MFC -класса CHtmlView. Вызовы этих функций можно связать с пунктами меню, клавишами быстрого вызова ("горячими клавишами"), или с кнопками панели инструментов.

Реализация возможностей перехода через меню
  • В панели Resource View выделите ресурс главного меню

  • В панели свойств Properties русифицируйте ресурс меню

  • Вновь в панели Resource View откройте двойным щелчком ресурс главного меню на редактирование

  • Удалите с панели меню категорию Edit все ее пункты и замените эту категорию на Navi&gate
  • Перетащите эту категорию на новое место перед категорией Help
  • Добавьте два новых пункта в категорию Navigate: один для функции GoBack, а второй - для функции GoForward
  • Установите значения свойств новых пунктов, как показано в таблице
    Значения свойств пунктов меню
    Пункт меню Свойство Значение
    Первый ID ID_NAVIGATE_BACK
    Caption Назад \tCtrl + B
    Prompt Назад на предыдущую Web -страницу \n Назад
    Второй ID ID_NAVIGATE_NEXT
    Caption Вперед \tCtrl + F
    Prompt Вперед на следующую Web -страницу\nВперед

Внешний вид категории Navigate в редакторе меню должен выглядеть так


Для каждого пункта меню необходимо добавить обработчики сообщения о событии COMMAND. Эти сообщения должен принимать и обрабатывать класс представления CWebBrowseView. Обработчики будем создавать не двойным щелчком по соответствующему пункту, а через контекстное меню оболочки для соответствующего пункта нашего проектируемого меню в редакторе. Для меню способ создания обработчика двойным щелчком оболочкой не поддерживается, поскольку неизвестно, какой класс будет принимать и обрабатывать сообщения COMMAND, пришедшие от меню.

  • В редакторе меню щелкните правой кнопкой мыши на первом пункте категории Navigate и выполните команду Add Event Handler...

  • Выберите в списке Class list мастера класс CWebBrowseView, который будет принимать и обрабатывать сообщения COMMAND, поступающие от пункта меню

  • Нажмите кнопку Add and Edit и заполните созданный мастером обработчик следующим кодом
    Обработчик пункта меню "Назад"
    void CWebBrowseView::OnNavigateBack()
    {
      // TODO: Add your command handler code here
      // Идти к предыдущей странице
      GoBack();
    }
  • Подобным образом создайте обработчик для второго пункта меню и заполните его так
    Обработчик пункта меню "Вперед"
    void CWebBrowseView::OnNavigateNext()
    {
      // TODO: Add your command handler code here
      // Перейти на следующую страницу вперед
      GoForward();
    }
  • Запустите приложение и убедитесь, что пункты спроектированного меню работают
< Самостоятельная работа 20 || Самостоятельная работа 21: 123456
Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .