Jx Random Quote

"There is no reason anyone would want a computer in their home." -- Ken Olson, president, chairman and founder of Digital Equipment Corp., 1977.
Главная arrow Статьи arrow Как сделать простой собственный Web браузер используя MFC. Часть 1
Как сделать простой собственный Web браузер используя MFC. Часть 1 Версия в формате PDF Версия для печати Отправить на e-mail

Совсем просто, как вы увидите. Далее я опишу  процесс разработки пошагово. 

  1. Для начала нужно создать новый проект.  Выбираем  File –New Project – MFC Application.  Вводим имя приложения  “mybrowser’.  Далее идем в  настройки проекта.  Здесь ставим следующее: “Application Type – Single Type” , “Project style – Windows Explorer”,  “Resource language - English”.(Китайский язык  пусть оставят сами китайцы, если хотят). Затем переходим «Generated Classes” и там  выбираем «Base Class” – «CHtmlView». Это очень важно, потому что  именно этот класс используется как базовый при создании нашего приложения.   CHtmlView  фактически и является  основой  «движка» нашего браузера. Жмем кнопку и переходим  в проект.
  2.  Для начала компилируем проект, и  смотрим что получилось. Мы видим, что загружается страница, ( если компьютер подключен к Интернете)    по адресу «http://www.msdn.microsoft.com/visualc/". Нам конечно такой «браузер» не подходит. Теперь займемся нашим главным делом.
3.    Для начала сменим иконку  приложения. Для этого перейдем в редактор ресурсов проекта и  добавим в качестве  нового ресурса новую иконку. Лично я нашел ее в Интернете, а кто хочет, тот может ее нарисовать вручную или взять уже имеющуюся готовую из тех, что есть в любом компьютере. Добавляем новую иконку в редактор ресурсов, используя опцию «Import». Затем вставим следующий код в файл  «MainFrm.cpp» в метод «int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)»:
         
       SetIcon(LoadIcon(AfxGetInstanceHandle(),(LPCTSTR)IDI_ICON1),false);
      
             Этот код устанавливает новую иконку вместо исходной иконки. Затем мы
             редактируем метод « 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)
{

   SetIcon(LoadIcon(AfxGetInstanceHandle(),(LPCTSTR)IDI_ICON1),false);


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);

    img.Create(IDB_HOT, 22, 0, RGB(255, 0, 255));
    m_toolbar.GetToolBarCtrl().SetHotImageList(&img);
    img.Detach();

    img.Create(IDB_COLD, 22, 0, RGB(255, 0, 255));
    m_toolbar.GetToolBarCtrl().SetImageList(&img);
    img.Detach();

    m_toolbar.ModifyStyle(0, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT);
    m_toolbar.SetButtons(NULL, 6);


    m_toolbar.SetButtonInfo(0, ID_BACK, TBSTYLE_BUTTON, 0);
    m_toolbar.SetButtonText(0, "Back");

    m_toolbar.SetButtonInfo(1, ID_FORWARD, TBSTYLE_BUTTON, 1);
    m_toolbar.SetButtonText(1, "Forward");

    m_toolbar.SetButtonInfo(2, ID_STOP, TBSTYLE_BUTTON, 2);
    m_toolbar.SetButtonText(2, "Stop");

    m_toolbar.SetButtonInfo(3, ID_REFRESH, TBSTYLE_BUTTON, 3);
    m_toolbar.SetButtonText(3, "Refresh");

    m_toolbar.SetButtonInfo(4, ID_HOME, TBSTYLE_BUTTON, 4);
    m_toolbar.SetButtonText(4, "Home");

    m_toolbar.SetButtonInfo(5, ID_SEARCH, TBSTYLE_BUTTON, 5);
    m_toolbar.SetButtonText(5, "Search");

    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::OnNavigationBack()
{
     GoBack();
}

void CmybrowserView::OnNavigationStop()
{
    Stop();
}

void CmybrowserView::OnNavigationReload()
{
    Refresh();
}

void CmybrowserView::OnNavigationHome()
{
      GoHome();
}

void CmybrowserView::OnNavigationSearch()
{
      GoSearch();
}

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
}
опубликовано
Добавить новыйПоиск
Добавить комментарий
Имя:
E-mail:
 
Веб-сайт:
Заголовок:
UBB-Код:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Security Image
Пожалуйста, введите проверочный код, который Вы видите на картинке.

Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved.

 
< Пред.   След. >