Стоит Windows 8 Pro, Visual Studio 2010 Express Edition . |
Встраивание возможностей броузера в приложение
Отображение текущего значения URL
Переходя от одной Web -странице к другой по ссылкам, настоящий броузер помещает текущее значение указателя URL в поле адреса. Тем самым дается возможность контролировать маршрут и, в случае необходимости, скопировать или изменить URL. Для получения текущего значения указателя URL нужно вызвать функцию GetLocationURL и передать полученное значение на панель управления.
Проблема в том, чтобы определить момент, когда можно получить текущий URL. Для этого в нашем классе представления CWebBrowseView, который является наследником базового класса CHtmlView, нужно переопределить некоторые функции. Данные функции вызываются, когда управляющий элемент броузера генерирует различные сообщения, в том числе:
- Начало перехода на новую Web -страницу
- Начало загрузки Web -страницы
- Отслеживание процесса загрузки
- Окончание загрузки
Перехватим событие окончания загрузки и переопределим соответствующую функцию 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
-
Установите значения свойств новых пунктов, как показано в таблице
Внешний вид категории 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(); }
-
Запустите приложение и убедитесь, что пункты спроектированного меню работают