Лабораторная работа по С++
ЛАБОРАТОРНЫЕ РАБОТЫ
Лабораторный практикум состоит из двух взаимосвязанных работ. В результате выполнения лабораторных занятий необходимо создать приложение на базе диалога и архитектуры документ/вид – «мини браузер». В первой лабораторной работе вы создадите диалоговое приложение для выбора адреса страницы (*.html). Во второй работе вам необходимо будет создать приложение на базе архитектуры документ/вид, класс вида должен быть порожден от класса CHtmlView. В это приложение необходимо будет добавить класс, созданный в первой лабораторной работе, модифицировать его и изменить класс вида приложения.
Класс CHtmlView содержит ряд функций, позволяющих без труда «путешествовать» по сети Интернет. Как класс, CHtmlView инкапсулирует значительное количество функций броузера Internet Explorer. Приложение Internet Explorer может работать не только с web-страницами, оно понимает документы Word, Excel, PowerPoint и многие другие документы, которые понимают продукты фирмы Microsoft.
Лабораторная работа №1 UpdateData(false);
Цель работы: создание диалогового приложения для выбора html-страницы.
Ход выполнения работы:
1. Создайте проект на базе диалогового окна с именем Selector.
2. В ResourceView раскройте пункт Dialog и в нем для IDD_SELECTOR_DIALOG задайте русский язык.
3. Задайте размер окна 305x135.
4. Создайте макет диалогового приложения, так как это приведено на рисунке 8.
5. Измените имена идентификаторов следующим образом: для поля редактирования IDC_EDIT_PAGEADRESS, для списка – IDC_LIST_PAGES; кнопки: IDC_BUTTON_OPEN, ID_ADD, ID_REMOVE.
6. Измените заголовки кнопок «Ok» и «Cancel» на «Применить» и «Отмена» соответственно.
Рис. 8 – Вид приложения Selector
7. С помощью ClassWizard добавите переменные m_listPages типа CListBox и m_strPageAddress типа CString, связав их со списком и полем ввода.
8. Создайте обработчики для всех добавленных кнопок и для кнопки «Применить».
9. В методе OnInitDialog установите строку "<Enter the page address>" в поле ввода, используя переменную m_strPageAddress, и очистите список методом ResetContent.
10. В методе OnAdd получите строку с поля ввода (UpdateData(<параметр>)), проверьте, не равна ли ее длина нулю. Если длина строки равна нулю, то выдать пользователю сообщение о некорректности ввода, в противном случае добавить строку в список (метод InsertString).
11. В методе OnRemove получите индекс выделенной строки списка (метод GetCurSel), проверьте, не равен ли индекс LB_ERR и если равен, то выдайте пользователю сообщение об ошибке, в противном случае удалите строку из списка адресов страниц (метод DeleteString).
12. Создайте обработчик на ON_LBN_SELCHANGE. В нем получите индекс выделенной строки, аналогично пункту 11, проверьте на равенство LB_ERR, установите выделенную строку списка в поле ввода, используя UpdateData(<параметр>).
13. В обработчике на OnOK сохраните полученные данные от пользователя, используя UpdateData(<параметр>).
14. Обработчик OnButtonOpen, должен вызываться по нажатию кнопки «Обзор». Он предназначен для того, чтобы пользователь не задавал адрес страницы вручную, а мог выбрать страницу из имеющихся на диске посредством стандартного диалога. Так как в теоретической части не было рассказано про это средство, то ниже приведен код этого обработчика:
void CSelectorDlg::OnButtonOpen()
{
CFileDialog dlg(TRUE, NULL, NULL,
OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
"Html pages (*.html)|*.html|All files (*.*)|*.*||");
if (dlg.DoModal() == IDOK)
{
m_strPageAddress = dlg.GetPathName();
UpdateData(FALSE);
}
}
В обработчике создаем объект класса CFileDialog. В качестве параметров передается множество параметров, необходимых для указания какие файлы мы будем обрабатывать, т.е. создаем фильтр для отображения файлов. После того как объект создан, вызываем так же, как и для простого диалога, DoModal. Если пользователь выбрал файл и нажал Ok («Открыть»), то получаем значение IDOK (которое и проверяем). Если мы получили IDOK, то переменной, отвечающей за поле ввода, присваиваем значение, содержащее полный путь к странице. После чего вызовом метода UpdateData(FALSE) устанавливаем это значение в поле ввода.
В результате выполнения лабораторной работы вы должны получить приложение, аналогичное виду, приведенному на рисунке 9.
Рис. 9 – Окно приложения Selector в результате
выполнения выбора html страницы
Лабораторная работа №2
Цель работы: создание приложения на базе архитектуры документ/вид. Приложение должно получать данные (адреса html-страниц) с диалогового окна, созданного в первой лабораторной работе, и загружать выбранную страницу.
Работа будет заключаться в создании нового приложения, примером для которого может послужить Sample12 (см. учебное пособие) и модификация диалогового приложения, созданного на первой лабораторной работе.
Ход выполнения работы:
1. Создать приложение на базе архитектуры документ / вид с именем Browser.
2. Указать для класса вида базовый класс CHtmlView.
3. После создания каркаса приложения перейти в редактор ресурсов, добавить диалоговое окно с идентификатором IDD_SELECTOR_DIALOG и заголовком Selector, поместить на шаблон диалога элементы управления, аналогичные лабораторной работе №1 и присвоить им такие же идентификаторы. Отредактировать меню следующим образом: удалить из пункта File все, кроме Exit и добавить в File пункт Select; в меню Edit удалить все, кроме Copy; остальные пункты меню оставить без изменения.
4. Из лабораторной работы №1 (папка Selector) скопировать в папку Browser файлы SelectorDlg.cpp и SelectorDlg.h.
5. Добавить скопированные файлы в пространство проекта. Для этого выполнить команду: Project -> Add To Project -> Files. В диалоге выбрать вышеуказанные файлы.
6. Отредактировать файл SelectorDlg.cpp. Заменить строку #include "Selector.h" на #include "Browser.h". На этом частично редактирование закончено.
7. Для пункта меню Select (идентификатор ID_FILE_SELECT) создать обработчик (в классе вида, а не рамки).
8. В классе вида, в методе OnInitialUpd ate закомментировать или удалить строку:
Navigate2(_T("http://www.microsoft.com/visualc/"),NULL,NULL);.
9. В данной лабораторной работе будет использован класс CList для хранения списка страниц получаемого от диалогового окна. Для его использования необходимо подключить библиотеку #include <afxtempl.h>. Внести эту строку нужно в файл StdAfx.h перед //{{AFX_INSERT_LOCATION}}.
10. Модифицируем класс диалогового окна. В класс добавить поле CList<CString, CString> m_listPageAddress; с модификатором private. Т.е. мы создали переменную списка строк, в которой будем хранить адреса страниц, занесенных пользователем.
Модифицируем метод OnInitDialog. Перед return TRUE нужно внести код, который будет отвечать за перенесения спис-ка строк в элемент управления «список». Для этого создаем переменную pos типа POSITION и присваиваем ей значение, полученное методом m_listPageAddress.GetHeadPosition();. Так мы получили начало списка. Далее «ПОКА pos» и в нем перенести список строк в элемент управления
(m_listPages.InsertString(0, m_listPageAddress.GetNext(pos));).
Модифицируем метод OnOK. Перед вызовом метода UpdateData нужно добавить код, отвечающий за перенос строк из элемента управления в список m_listPageAddress. Первым делом мы очищаем список строк методом RemoveAll. После чего получаем количество строк, находящихся в элементе управления «список» методом GetCount. Далее организовать цикл от нуля до количества строк в элементе управления. В цикле, используя метод GetText(i, strText), получаем значения каждой строки и переносим их список (m_listPageAddress), используя метод AddHead.
11. Добавить к классу диалогового окна два метода для получения списка строк от диалогового окна и задания этого списка. Список строк будет храниться в классе вида и для перенесения его в диалоговое окно потребуется метод, позволяющий задавать список строк диалогового окна. Для возврата в класс вида отредактированного списка строк будет необходим метод получения списка строк диалогового окна. Ниже приведен код этих двух методов:
void CSelectorDlg::SetList(CList<CString, CString> *pLstPages)
{
m_listPageAddress.RemoveAll();
m_listPageAddress.AddTail(pLstPages);
}
void CSelectorDlg::GetList(CList<CString, CString> &lstPages)
{
lstPages.RemoveAll();
lstPages.AddTail(&m_listPageAddress);
}
Метод SetList задает список. В качестве передаваемого параметра является указатель на объект класса CList. Перед тем как добавить список, нужно удалить старые значения. Для этого используется метод RemoveAll класса CList. Для добавления полученного списка используется все тот же метод AddTail, но только в качестве параметра передается не элемент списка (в данном случае строка), а указатель на список, полученный в качестве параметра метода SetList.
Метод GetList аналогичен методу SetList. Но в нем мы очищаем список lstPages (входной параметр) и переносим в него список m_listPageAddress тем же методом AddTail.
12. Отредактировать класс вида. В классе вид добавить переменную m_selDlg типа CSelectorDlg. Также добавить поле CList<CString, CString> m_listPages;. вызвать обработчик ID_FILE_SELECT. Установить список строк методом Se tList (созданным нами для диалогового окна). Отобразить окно методом DoModal. Сделать проверку на IDOK и при положительном результате создать курсор в виде «Песочные часы» созданием объекта класса CWaitCursor; получить от диалогового окна отредактированный список, созданным нами ранее методом GetList; с помощью метода Navigate2 отобразить выделенную страницу. В качестве параметра для Navigate2 передать переменную, связанную с полем ввода диалогового окна.
Результат выполнения лабораторной работы должен быть аналогичным приведенному на рисунке 3:
Рис. 3 – Вид работающего приложения