Главная
Как сделать простой собственный 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.

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


© www.aurov.com - Личный сайт Александра Юрова 2008 All rights reserved
Tags
afxgetapp мыши fixtures запускает confirm экрана pictdesc отображается const dropdown oninitdialog устройства reduce width join ничего замечательно clogindlg exists lresult браузер dispatch время класса boot laquo адрес caps займемся страницу

Joomla Modul

Главная
Статьи
Творчество
Галерея
Кто он-лайн
Сейчас на сайте:
Гостей - 12
Jx Random Quote
"Things are more like they are now than they have ever been." -- Gerald Ford