Как сделать простой собственный Web браузер используя MFC. Часть 1
Совсем просто, как вы увидите. Далее я опишупроцесс разработки пошагово.
Для начала нужно создать новый проект.ВыбираемFile –New Project – MFC Application.Вводимимяприложения“mybrowser’.Далееидемвнастройкипроекта.Здесьставимследующее: “Application Type – Single Type” , “Project style – Windows Explorer”,“Resource language - English”.(Китайскийязыкпустьоставятсамикитайцы, еслихотят). Затемпереходим «Generated Classes” итамвыбираем «Base Class” – «CHtmlView». Это очень важно, потому чтоименно этот класс используется как базовый при создании нашего приложения.“CHtmlView”фактически и являетсяосновой«движка» нашего браузера. Жмем кнопку и переходимв проект.
Для начала компилируем проект, исмотрим что получилось. Мы видим, что загружается страница, ( если компьютер подключен к Интернете)по адресу «http://www.msdn.microsoft.com/visualc/". Нам конечно такой «браузер» не подходит. Теперь займемся нашим главным делом.
3. Для начала сменим иконку приложения. Для этого перейдем в редактор ресурсов проекта и добавим в качестве нового ресурса новую иконку. Лично я нашел ее в Интернете, а кто хочет, тот может ее нарисовать вручную или взять уже имеющуюся готовую из тех, что есть в любом компьютере. Добавляем новую иконку в редактор ресурсов, используя опцию «Import». Затем вставим следующий код в файл «MainFrm.cpp» в метод «int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)»:
Этот код устанавливает новую иконку вместо исходной иконки. Затем мы редактируем метод « CmybrowserView»
void CmybrowserView::OnInitialUpdate() { CHtmlView::OnInitialUpdate(); Navigate2(_T("about:blank"),NULL,NULL);//удаляем адрес Microsoft //и ставим «about:blank» в качестве стартовой страницы, //хотя можно ставить все что угодно. }
Далее нужно сделать новый toolbar для нашего браузера, чтобы он выглядел как в Internet Explorer. Для этого нужно сделать или где-то раздобыть 2 картинки разрабатываемого ресурса. Лично я опять обнаружил их в Сети. Они являются bitmap файлами и содержать точную копию toolbara копируемого нами браузера. Почему нужны 2 файла? Потому что при наведении курсора мыши, один bitmap файл заменяет другой. Получается красивый спецэффект, почти как в настоящем браузере. Файлы после операции импорта переименуем в IDB_HOT и IDB_COLD. Итак, мы импортировали оба эти 2 файла. Теперь нам нужно вернуться в файл «MainFrm.cpp» и сделать буквально следующие, - во-первых, скрыть старый toolbar и вместо него создать несколько новых контролов, а во-вторых, не совершить ошибок в этих действиях. Сперва мы закомментируем переменную «CToolBar m_wndToolBar» в файле «MainFrm.h». Затем там же мы создадим две новых переменных. «CToolBar m_toolbar» и «CReBar m_rebar». Эти переменный позволят нам создать наши новые контролы. Первая переменная создаст объект класса toolbar, а вторая как вы догадались – класса « ReBar».
Последняя будет служить как бы новым фундаментом для нашего нового toolbara. Переходим в файл ресурсов mybrowser.rc и создаем там следующие новые идентификаторы: «ID_FORWARD», «ID_STOP», «ID_HOME», «ID_BACK» и «ID_SEARCH». В строке ставим эквиваленты для каждой кнопки. Как вы уже поняли, эти новые ресурсы – это идентификаторы кнопок на нашем новом toolbare. Кроме того, нам нужно еще добавить строку ввода веб адреса. Для этого мы создаем переменную класса «CComboBoxEx m_adressbar» типа «public»в файле MainFrm.h или делаем тоже самое с помощью вызова меню в дереве Project Explorer. Затем переключаемся в файл « MainFrm.cpp» во все тот же метод «int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)» и редактируем его таким образом:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
CImageList img; //создаем переменную класса CImageList для создания кнопок
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
m_rebar.Create(this); //создаем новый контрол Rebar m_toolbar.CreateEx(this); создаем новый контрол CToolbar
m_adressbar.Create(CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, 101 );// создаем новый контрол CComboBoxEx
//создаем кнопки, задаем их число, устанавливаем стили и размещаем там, где необходимо m_toolbar.GetToolBarCtrl().SetButtonWidth(50, 150); m_toolbar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } // TODO: Delete these three lines if you don't want the toolbar to be dockable
CRect toolrect;//создаем объект класса CRect для размещаения созданных контролов
m_toolbar.GetItemRect(0, &toolrect); //размещаем там новый toolbar m_toolbar.SetSizes(toolrect.Size(), CSize(30,20)); m_rebar.AddBar(&m_toolbar);//помещаем объект СToolbar на объекте ReBar
m_rebar.AddBar(&m_adressbar, "address:", NULL, RBBS_FIXEDBMP | RBBS_BREAK); //размещаем на контроле Rebar наш вновь созданный CComboBoxEx m_adressbar
return 0; }
Компилируем и смотрим программу. Выглядит почти как настоящий, только ничего не работает. Кроме того, надо изменить меню приложения. Этим мы займемся в следующем шаге. 4. Теперь снова переходим в редактор ресурсов. Открываем пункт «Menu» «IDR_MAINFRAME». Там удаляем полностью пункт меню «Edit», а вместо него создаем новый пункт «Navigation» с пунктами «Forward», «Back», «Stop», «Reload», «Home», «Search». У каждой строки в меню вводим в панели «Properties», в свойстве «Prompt» название пункта меню для отображение. Теперь очень важный момент. Когда мы создаем в новые пункты меню, то в свойстве «ID» пункта меню нужно использовать уже имеющийся идентификатор кнопки нашего toolbara. Такого рода «фокус» позволит нам создать одновременно работающее меню и toolbar. Компилируем программу и видим результат. Однако, из-за того, что мы не назначили никаких обработчиков команд для кнопок на новом toolbare и пунктам меню, то мы видим, что они не активны. (Кто бы сомневался). В следующем шаге займемся именно этим, - заставим браузер реально работать. 5. Чтобы наш браузер начал исполнять команды нужно всего ничего. Открываем редактор ресурсов, выбираем там « Menu» «IDR_MAINFRAME» и там в новом пункте меню «Navigation» выделяем пункт меню «Forward», затем щелкаем правой кнопкой мыши и в открывшемся меню находим пункт «Add Event Handler». Во вновь открывшемся окошке выбираем «Message Type:COMMAND» и там же в списке классов, к которому будет принадлежать обработчик «CmybrowserView». Далее жмем кнопку «Add and edit». После этого мы попадаем в файл «mybrowserView.cpp», прямо в новый обработчик . Теперь надо его отредактировать следующим образом:
void CmybrowserView::OnNavigationForward() { GoForward(); } Повторим аналогичные действия для остальных пунктов меню. После этого получаем такой код:
void CmybrowserView::OnUpdateStop(CCmdUI *pCmdUI) { pCmdUI->Enable(GetBusy()); } Предпоследний обработчик отправляет пользователя на страницу установленной по умолчанию поисковой системы. У меня например, появился Google. Последний же обработчик мы добавляем к пункту меню «Stop», он активирует эту команду , используя обработчик «ON_UPDATE_COMMAND_UI». Снова все компилируем и смотрим, что получилось. Теперь меню «Navigation» работает. Кроме того, работает и toolbar. Что же касается самих методов, как GoHome() и прочие, то они изначально являются доступными для класса «CHtmlView» . То бишь, стоит заглянуть в MSDN и… Надеюсь, всем все понятно. У нас теперь здесь все работает замечательно. 6. Теперь надо добавить еще одну очень важную вещь. Наш браузер пока что не делает самого главного, - собственно говоря, он ни нак какие адреса в Сети не ходит. Так что, сделаем так, чтобы можно было пользоваться строкой ввода веб адреса. Перейдем в файл «MainFrm.cpp». Добавим туда новый метод типа void – OnGoURL(void); void CMainFrame::OnNewURL(void) { CString str; m_adressbar.GetLBText(m_adressbar.GetCurSel(), str); ((CmybrowserView*)GetActiveView())->Navigate2(str, 0, NULL }