Сейчас на сайте

Сейчас 5 гостей онлайн

Поиск

Tag Cloud

Twitter oAuth и Cod... Баллада о г... сихи лирик... стихи лири... Динамическ... Домашняя с... Использова... Использова... Отправка с... Создание ф... Шепот посл... TinyMCE в Rails стихи лири... Быстрая ра... Пишем собс... Создание с... Установка ... Ностальгия... Москва-Бел... стихи лири... Стихи про п... Крылья сти... Создание п... Простой по... Создание п... Одинокий в... Гражданин ... Несчастный... Сонет стих... Отрезок ст... Врагу не сд... Предчувств... Поиск в ст... Использова... Смерть дву... Использова... Как сделат... Как сделат... Облако тег... Южная сере... Программна... Codeigniter в де... CodeIgniter: фор... проверка в... стихи лири... WEB fetcher(scrappe... Простой Twitt... стихи твор... стихи лири... Проверка п... Создание и ... Побег с Сол... Отправка SMS... MS VSTO 2007/Infusio... Установка R... Fckeditor в при... Степные тр... моя любовь. К твоим оз... Сомкнуть л... чтоб отдат... вот – вот ... еще не расс... Снег тишина и лу... и мира пово... что мой пос... Лишь ты. И т... ты любима ты чиста. Экспорт да... Я пью до дн... что нам теп... -Наш первый... Социальные... Социальные... Спит в можж... Воздух про... Стены рожденные ... эхо умрет. Неотправле... стихи лири... Он порезал... Боясь шагн... не осталос... Услышать з... Программир...

Как сделать простой собственный Web браузер используя MFC. Часть 2 PDF Печать E-mail
01.06.2011 14:00
Во второй, главной части статьи, мы закончим наш браузер. Нам нужен  сейчас еще один метод OnNewURLEnter(void). 
Он, собственно говоря и делает этот переход на новый веб адрес:
void CMainFrame::OnNewURLEnter(void)
{
    CString str;

    m_adressbar.GetEditCtrl()->GetWindowText(str);
    ((CmybrowserView*)GetActiveView())->Navigate2(str, 0, NULL);

    COMBOBOXEXITEM item;

    item.mask = CBEIF_TEXT;
    item.iItem = -1;
    item.pszText = (LPTSTR)(LPCTSTR)str;
    m_adressbar.InsertItem(&item);

 
На конец, нам нужно отредактировать вручную MESSAGE_MAP() все того же класса «CMainFrame» таким обарзом:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_WM_CREATE()
    ON_COMMAND(IDOK, OnNewURLEnter)//Эту стоку мы вставляем вручную
END_MESSAGE_MAP()
Компилируем и смотрим. Вводим какой-нибудь  адрес и видим, что  новую страницу. Работает, и это хорошо.
7.    Если приглядеться, то каждый уважающий себя браузер  отображает заголовок загруженной  им веб страницы. Наш этого почему-то не делает. Надо исправить это поскорее.  В класс  “CmybrowserDoc”  добавляем  переменную типа строка -  CString url. Затем переходим в класс «CmybrowserView» и находим в панели «Properties»/«Overrides”. Там выбираем метод «OnDocumentComplete()» и кликаем на нем мышью. Затем переходим в сам метод и редактируем его:
  
    void CmybrowserView::OnDocumentComplete(LPCTSTR lpszURL){

    CString title="  Web Browser";
    ((CMainFrame*)GetParentFrame())->m_adressbar.SetWindowText(lpszURL);

    AfxGetMainWnd()->SetWindowText(GetLocationName() + title);

    (GetDocument())->url=lpszURL;

    CHtmlView::OnDocumentComplete(lpszURL);

}   

8.    Теперь идем в редактор ресурсов и выбираем «Menu», там находим пункт «Open…» . Там добавляем обработчик событий, установив его к классу «CmybrowserView». Далее переходим в  саму функцию и редактируем следующим обрзаом:
           void CmybrowserView::OnFileOpen() {
    static TCHAR  BASED_CODE filter[]=
        _T("HTML Files(*.htm)|*.htm|HTML Files(*.html)|*.html|All Files(*.*)|*.*||");
    CFileDialog dlg(TRUE,_T("html"),NULL,OFN_EXPLORER,filter,this);
    dlg.m_ofn.lpstrTitle=_T("Open HTML file...");
    if(dlg.DoModal()!=IDOK){
        return ;
    }
    
   CString url(_T("file://"));
    url+=dlg.GetPathName();
    Navigate2(url,NULL,NULL);
}

Пробуем. Мы можем открыть HTML страницу для просмотра..На этом все.  Запускаем программу и видим результат. Браузер очень простой, но вполне рабочий. Далее собственно исходный код программы.

// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "mybrowser.h"
#include "mainfrm.h"
#include  "afxinet.h"
#include "mybrowserDoc.h"
#include "mybrowserView.h"
#include ".\mainfrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_WM_CREATE()
    ON_COMMAND(IDOK, OnNewURLEnter)
END_MESSAGE_MAP()

static UINT indicators[] =
{
    ID_SEPARATOR,           // status line indicator
    ID_INDICATOR_CAPS,
    ID_INDICATOR_NUM,
    ID_INDICATOR_SCRL,
};

// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
    // TODO: add member initialization code here
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

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

    CImageList img;
    //CString str;

    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    m_rebar.Create(this);
    m_toolbar.CreateEx(this);

    m_adressbar.Create(CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, 101 );

    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;

    // set up toolbar button sizes
    m_toolbar.GetItemRect(0, &toolrect);
    m_toolbar.SetSizes(toolrect.Size(), CSize(30,20));
    m_rebar.AddBar(&m_toolbar);

    m_rebar.AddBar(&m_adressbar, "address:", NULL, RBBS_FIXEDBMP | RBBS_BREAK);
  

    return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    if( !CFrameWnd::PreCreateWindow(cs) )
        return FALSE;
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs

    return TRUE;
}

// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
    CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
    CFrameWnd::Dump(dc);
}

#endif //_DEBUG

// CMainFrame message handlers

void CMainFrame::OnNewURL(void)
{
    CString str;
    m_adressbar.GetLBText(m_adressbar.GetCurSel(), str);
    ((CmybrowserView*)GetActiveView())->Navigate2(str, 0, NULL);

}

void CMainFrame::OnNewURLEnter(void)
{
    CString str;

    m_adressbar.GetEditCtrl()->GetWindowText(str);
    ((CmybrowserView*)GetActiveView())->Navigate2(str, 0, NULL);

    COMBOBOXEXITEM item;

    item.mask = CBEIF_TEXT;
    item.iItem = -1;
    item.pszText = (LPTSTR)(LPCTSTR)str;
    m_adressbar.InsertItem(&item);
}

// mybrowser.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "mybrowser.h"
#include "MainFrm.h"

#include "mybrowserDoc.h"
#include "mybrowserView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CmybrowserApp

BEGIN_MESSAGE_MAP(CmybrowserApp, CWinApp)
    ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
    // Standard file based document commands
    ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
    ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
    // Standard print setup command
    ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()

// CmybrowserApp construction

CmybrowserApp::CmybrowserApp()
{
    // TODO: add construction code here,
    // Place all significant initialization in InitInstance
}

// The one and only CmybrowserApp object

CmybrowserApp theApp;
// This identifier was generated to be statistically unique for your app
// You may change it if you prefer to choose a specific identifier

// {81412519-BCE7-4887-98F7-F034BC210111}
static const CLSID clsid =
{ 0x81412519, 0xBCE7, 0x4887, { 0x98, 0xF7, 0xF0, 0x34, 0xBC, 0x21, 0x1, 0x11 } };
const GUID CDECL BASED_CODE _tlid =
        { 0xAE9746B8, 0x474, 0x4194, { 0xA1, 0xD5, 0x98, 0x38, 0x60, 0x1D, 0x1D, 0xE6 } };
const WORD _wVerMajor = 1;
const WORD _wVerMinor = 0;

// CmybrowserApp initialization

BOOL CmybrowserApp::InitInstance()
{
    // InitCommonControls() is required on Windows XP if an application
    // manifest specifies use of ComCtl32.dll version 6 or later to enable
    // visual styles.  Otherwise, any window creation will fail.
    InitCommonControls();

    CWinApp::InitInstance();

    if (!AfxSocketInit())
    {
        AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
        return FALSE;
    }

    // Initialize OLE libraries
    if (!AfxOleInit())
    {
        AfxMessageBox(IDP_OLE_INIT_FAILED);
        return FALSE;
    }
    AfxEnableControlContainer();
    // Standard initialization
    // If you are not using these features and wish to reduce the size
    // of your final executable, you should remove from the following
    // the specific initialization routines you do not need
    // Change the registry key under which our settings are stored
    // TODO: You should modify this string to be something appropriate
    // such as the name of your company or organization
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));
    LoadStdProfileSettings(4);  // Load standard INI file options (including MRU)
    // Register the application's document templates.  Document templates
    //  serve as the connection between documents, frame windows and views
    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
        IDR_MAINFRAME,
        RUNTIME_CLASS(CmybrowserDoc),
        RUNTIME_CLASS(CMainFrame),       // main SDI frame window
        RUNTIME_CLASS(CmybrowserView));
    if (!pDocTemplate)
        return FALSE;
    AddDocTemplate(pDocTemplate);
    // Connect the COleTemplateServer to the document template
    //  The COleTemplateServer creates new documents on behalf
    //  of requesting OLE containers by using information
    //  specified in the document template
    m_server.ConnectTemplate(clsid, pDocTemplate, TRUE);
        // Note: SDI applications register server objects only if /Embedding
        //   or /Automation is present on the command line
    // Parse command line for standard shell commands, DDE, file open
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);
    // App was launched with /Embedding or /Automation switch.
    // Run app as automation server.
    if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated)
    {
        // Register all OLE server factories as running.  This enables the
        //  OLE libraries to create objects from other applications
        COleTemplateServer::RegisterAll();

        // Don't show the main window
        return TRUE;
    }
    // App was launched with /Unregserver or /Unregister switch.  Unregister
    // typelibrary.  Other unregistration occurs in ProcessShellCommand().
    else if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppUnregister)
    {
        m_server.UpdateRegistry(OAT_DISPATCH_OBJECT, NULL, NULL, FALSE);
        AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor);
    }
    // App was launched standalone or with other switches (e.g. /Register
    // or /Regserver).  Update registry entries, including typelibrary.
    else
    {
        m_server.UpdateRegistry(OAT_DISPATCH_OBJECT);
        COleObjectFactory::UpdateRegistryAll();
        AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid);
    }
    // Dispatch commands specified on the command line.  Will return FALSE if
    // app was launched with /RegServer, /Register, /Unregserver or /Unregister.
    if (!ProcessShellCommand(cmdInfo))
        return FALSE;
    // The one and only window has been initialized, so show and update it
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();
    // call DragAcceptFiles only if there's a suffix
    //  In an SDI app, this should occur after ProcessShellCommand
    return TRUE;
}


// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    enum { IDD = IDD_ABOUTBOX };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()

// App command to run the dialog
void CmybrowserApp::OnAppAbout()
{
    CAboutDlg aboutDlg;
    aboutDlg.DoModal();
}

// CmybrowserApp message handlers


// mybrowser.idl : type library source for mybrowser.exe

// This file will be processed by the MIDL compiler to produce the
// type library (mybrowser.tlb).

[ uuid(AE9746B8-0474-4194-A1D5-9838601D1DE6), version(1.0) ]
library mybrowser
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

    //  Primary dispatch interface for CmybrowserDoc
    
    [ uuid(F03379DB-AFCA-4A91-A713-EF317F96EA57) ]
    dispinterface Imybrowser
    {
        properties:
            
        methods:
    };

    //  Class information for CmybrowserDoc
    
    [ uuid(81412519-BCE7-4887-98F7-F034BC210111) ]
    coclass CmybrowserDoc
    {
        [default] dispinterface Imybrowser;
    };
};


// mybrowserDoc.cpp : implementation of the CmybrowserDoc class
//

#include "stdafx.h"
#include "mybrowser.h"

#include "mybrowserDoc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CmybrowserDoc

IMPLEMENT_DYNCREATE(CmybrowserDoc, CDocument)

BEGIN_MESSAGE_MAP(CmybrowserDoc, CDocument)
END_MESSAGE_MAP()

BEGIN_DISPATCH_MAP(CmybrowserDoc, CDocument)
END_DISPATCH_MAP()

// Note: we add support for IID_Imybrowser to support typesafe binding
//  from VBA.  This IID must match the GUID that is attached to the 
//  dispinterface in the .IDL file.

// {F03379DB-AFCA-4A91-A713-EF317F96EA57}
static const IID IID_Imybrowser =
{ 0xF03379DB, 0xAFCA, 0x4A91, { 0xA7, 0x13, 0xEF, 0x31, 0x7F, 0x96, 0xEA, 0x57 } };

BEGIN_INTERFACE_MAP(CmybrowserDoc, CDocument)
    INTERFACE_PART(CmybrowserDoc, IID_Imybrowser, Dispatch)
END_INTERFACE_MAP()

// CmybrowserDoc construction/destruction

CmybrowserDoc::CmybrowserDoc()
: url(_T(""))
{
    // TODO: add one-time construction code here

    EnableAutomation();

    AfxOleLockApp();
}

CmybrowserDoc::~CmybrowserDoc()
{
    AfxOleUnlockApp();
}

BOOL CmybrowserDoc::OnNewDocument()
{
    if (!CDocument::OnNewDocument())
        return FALSE;

    // TODO: add reinitialization code here
    // (SDI documents will reuse this document)

    return TRUE;
}


// CmybrowserDoc serialization

void CmybrowserDoc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {
        // TODO: add storing code here
    }
    else
    {
        // TODO: add loading code here
    }
}

// CmybrowserDoc diagnostics

#ifdef _DEBUG
void CmybrowserDoc::AssertValid() const
{
    CDocument::AssertValid();
}

void CmybrowserDoc::Dump(CDumpContext& dc) const
{
    CDocument::Dump(dc);
}
#endif //_DEBUG

// CmybrowserDoc commands


// mybrowserView.cpp : implementation of the CmybrowserView class
//

#include "stdafx.h"
#include "mybrowser.h"

#include "mybrowserDoc.h"
#include ".\mybrowserview.h"
#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CmybrowserView

IMPLEMENT_DYNCREATE(CmybrowserView, CHtmlView)

BEGIN_MESSAGE_MAP(CmybrowserView, CHtmlView)
    // Standard printing commands
    ON_COMMAND(ID_FILE_PRINT, CHtmlView::OnFilePrint)
    ON_COMMAND(ID_FORWARD, OnNavigationForward)
    ON_COMMAND(ID_BACK, OnNavigationBack)
    ON_COMMAND(ID_STOP, OnNavigationStop)
    ON_COMMAND(ID_REFRESH, OnNavigationReload)
    ON_COMMAND(ID_HOME, OnNavigationHome)
    ON_COMMAND(ID_SEARCH, OnNavigationSearch)
    ON_UPDATE_COMMAND_UI(ID_STOP, OnUpdateStop)
    ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
END_MESSAGE_MAP()

// CmybrowserView construction/destruction

CmybrowserView::CmybrowserView()
{
    

}

CmybrowserView::~CmybrowserView()
{
}

BOOL CmybrowserView::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs

    return CHtmlView::PreCreateWindow(cs);
}

void CmybrowserView::OnInitialUpdate()
{
    CHtmlView::OnInitialUpdate();
    Navigate2(_T("about:blank"),NULL,NULL);
}

// CmybrowserView printing


// CmybrowserView diagnostics

#ifdef _DEBUG
void CmybrowserView::AssertValid() const
{
    CHtmlView::AssertValid();
}

void CmybrowserView::Dump(CDumpContext& dc) const
{
    CHtmlView::Dump(dc);
}

CmybrowserDoc* CmybrowserView::GetDocument() const // non-debug version is inline
{
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CmybrowserDoc)));
    return (CmybrowserDoc*)m_pDocument;
}
#endif //_DEBUG

// CmybrowserView message handlers

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::OnDocumentComplete(LPCTSTR lpszURL)
{

    CString title="  Web Browser";
    ((CMainFrame*)GetParentFrame())->m_adressbar.SetWindowText(lpszURL);

    AfxGetMainWnd()->SetWindowText(GetLocationName() + title);

    (GetDocument())->url=lpszURL;

    CHtmlView::OnDocumentComplete(lpszURL);

}


void CmybrowserView::OnUpdateStop(CCmdUI *pCmdUI)
{
        pCmdUI->Enable(GetBusy());
}

void CmybrowserView::OnFileOpen()
{
    static TCHAR  BASED_CODE filter[]=
        _T("HTML Files(*.htm)|*.htm|HTML Files(*.html)|*.html|All Files(*.*)|*.*||");
    CFileDialog dlg(TRUE,_T("html"),NULL,OFN_EXPLORER,filter,this);
    dlg.m_ofn.lpstrTitle=_T("Open HTML file...");
    if(dlg.DoModal()!=IDOK){
        return ;
    }
    
   CString url(_T("file://"));
    url+=dlg.GetPathName();
    Navigate2(url,NULL,NULL);
}

// stdafx.cpp : source file that includes just the standard includes
// mybrowser.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"


// MainFrm.h : interface of the CMainFrame class
//

#pragma once
class CMainFrame : public CFrameWnd
{
    
protected: // create from serialization only
    CMainFrame();
    DECLARE_DYNCREATE(CMainFrame)

// Attributes
public:

// Operations
public:

// Overrides
public:
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

// Implementation
public:
    virtual ~CMainFrame();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

protected:  // control bar embedded members
    CStatusBar  m_wndStatusBar;
    //CToolBar    m_wndToolBar;
    CToolBar    m_toolbar;
    CReBar      m_rebar;

public:
    CComboBoxEx m_adressbar;

// Generated message map functions
protected:
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    DECLARE_MESSAGE_MAP()
public:
    void OnNewURL(void);
    void OnNewURLEnter(void);
};


// mybrowser.h : main header file for the mybrowser application
//
#pragma once

#ifndef __AFXWIN_H__
    #error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h"       // main symbols

// CmybrowserApp:
// See mybrowser.cpp for the implementation of this class
//

class CmybrowserApp : public CWinApp
{
public:
    CmybrowserApp();

// Overrides
public:
    virtual BOOL InitInstance();

// Implementation
    COleTemplateServer m_server;
        // Server object for document creation
    afx_msg void OnAppAbout();
    DECLARE_MESSAGE_MAP()
};

extern CmybrowserApp theApp;

// mybrowserDoc.h : interface of the CmybrowserDoc class
//

#pragma once

class CmybrowserDoc : public CDocument
{
protected: // create from serialization only
    CmybrowserDoc();
    DECLARE_DYNCREATE(CmybrowserDoc)

// Attributes
public:

// Operations
public:

// Overrides
    public:
    virtual BOOL OnNewDocument();
    virtual void Serialize(CArchive& ar);

// Implementation
public:
    virtual ~CmybrowserDoc();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
    DECLARE_MESSAGE_MAP()

    // Generated OLE dispatch map functions

    DECLARE_DISPATCH_MAP()
    DECLARE_INTERFACE_MAP()
public:
    CString url;
};



 // mybrowserView.h : interface of the CmybrowserView class
//

#pragma once

class CmybrowserView : public CHtmlView
{
protected: // create from serialization only
    CmybrowserView();
    DECLARE_DYNCREATE(CmybrowserView)

// Attributes
public:
    CmybrowserDoc* GetDocument() const;

// Operations
public:

// Overrides
    public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
    virtual void OnInitialUpdate(); // called first time after construct

// Implementation
public:
    virtual ~CmybrowserView();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnNavigationForward();
    afx_msg void OnNavigationBack();
    afx_msg void OnNavigationStop();
    afx_msg void OnNavigationReload();
    afx_msg void OnNavigationHome();
    afx_msg void OnNavigationSearch();
    
    virtual void OnDocumentComplete(LPCTSTR lpszURL);
    afx_msg void OnUpdateStop(CCmdUI *pCmdUI);
    afx_msg void OnFileOpen();
};

#ifndef _DEBUG  // debug version in mybrowserView.cpp
inline CmybrowserDoc* CmybrowserView::GetDocument() const
   { return reinterpret_cast<CmybrowserDoc*>(m_pDocument); }
#endif

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by mybrowser.rc
//
#define IDD_ABOUTBOX                    100
#define IDP_OLE_INIT_FAILED             100
#define IDP_SOCKETS_INIT_FAILED         104
#define IDR_MAINFRAME                   128
#define IDR_mybrowserTYPE               129
#define IDI_ICON1                       130
#define IDB_HOT                         131
#define IDB_COLD                        132
#define ID_STOP                         57608
#define ID_REFRESH                      57609
#define ID_FORWARD                      57610
#define ID_SEARCH                       57611
#define ID_HOME                         57612
#define ID_BACK                         57613

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        133
#define _APS_NEXT_COMMAND_VALUE         32777
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently,
// but are changed infrequently

#pragma once

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN        // Exclude rarely-used stuff from Windows headers
#endif

// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER                // Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0400        // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif

#ifndef _WIN32_WINNT        // Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT 0x0400        // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif                        

#ifndef _WIN32_WINDOWS        // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif

#ifndef _WIN32_IE            // Allow use of features specific to IE 4.0 or later.
#define _WIN32_IE 0x0400    // Change this to the appropriate value to target IE 5.0 or later.
#endif

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS    // some CString constructors will be explicit

// turns off MFC's hiding of some common and often safely ignored warning messages
#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxdisp.h>        // MFC Automation classes

#include <afxdtctl.h>        // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>            // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT

#include <afxhtml.h>            // MFC HTML view support
#include <afxsock.h>        // MFC socket extensions


                Как сделать простой собственный Web –браузер  используя  MFC.
сем просто, как вы увидите. Далее я опишу  процесс разработки пошагово.  
9.    Для начала нужно создать новый проект.  Выбираем  File –New Project – MFC Application.  Вводим имя приложения  “mybrowser’.  Далее идем в  настройки проекта.  Здесь ставим следующее: “Application Type – Single Type” , “Project style – Windows Explorer”,  “Resource language - English”.(Китайский язык  пусть оставят сами китайцы, если хотят). Затем переходим «Generated Classes” и там  выбираем «Base Class” – «CHtmlView». Это очень важно, потому что  именно этот класс используется как базовый при создании нашего приложения.   “CHtmlView”  фактически и является  основой  «движка» нашего браузера. Жмем кнопку и переходим  в проект.
10.     Для начала компилируем проект, и  смотрим что получилось. Мы видим, что загружается страница, ( если компьютер подключен к Интернете)    по адресу «http://www.msdn.microsoft.com/visualc/". Нам конечно такой «браузер» не подходит. Теперь займемся нашим главным делом.
11.    Для начала сменим иконку  приложения. Для этого перейдем в редактор ресурсов проекта и  добавим в качестве  нового ресурса новую иконку. Лично я нашел ее в Интернете, а кто хочет, тот может ее нарисовать вручную или взять уже имеющуюся готовую из тех, что есть в любом компьютере. Добавляем новую иконку в редактор ресурсов, используя опцию «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;
}

Компилируем и смотрим программу. Выглядит почти как настоящий, только ничего не работает.  Кроме того, надо изменить меню приложения. Этим мы займемся в следующем шаге.   
12.    Теперь  снова переходим в редактор ресурсов.  Открываем  пункт «Menu» «IDR_MAINFRAME». Там удаляем полностью  пункт меню  «Edit», а вместо него создаем
новый пункт «Navigation»  с пунктами  «Forward», «Back», «Stop», «Reload», «Home», «Search».  У каждой строки в меню вводим в панели «Properties», в свойстве «Prompt» название пункта меню для отображение.  Теперь очень важный  момент.  Когда мы создаем в новые пункты меню, то в свойстве  «ID» пункта меню нужно использовать уже имеющийся идентификатор кнопки нашего toolbara. Такого рода «фокус» позволит нам 
создать  одновременно работающее меню и toolbar. Компилируем программу и видим результат. Однако, из-за того, что мы не назначили никаких обработчиков команд для кнопок на новом  toolbare и пунктам меню, то мы видим, что они не активны. (Кто бы сомневался). В следующем шаге займемся именно этим, - заставим браузер реально работать.
13.    Чтобы наш браузер начал  исполнять команды нужно всего ничего.  Открываем редактор
ресурсов,  выбираем там « 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 и…  Надеюсь, всем все понятно.  У нас  теперь здесь  все работает замечательно.
14.    Теперь надо добавить еще одну очень важную вещь. Наш браузер  пока что не делает самого главного, - собственно говоря, он ни нак какие адреса в Сети не ходит.  Так что, сделаем так, чтобы можно было пользоваться строкой ввода веб адреса.  Перейдем в файл «MainFrm.cpp». Добавим туда новый метод  типа void – OnGoURL(void);
   void CMainFrame::OnNewURL(void)
{
    CString str;
    m_adressbar.GetLBText(m_adressbar.GetCurSel(), str); 
    ((CmybrowserView*)GetActiveView())->Navigate2(str, 0, NULL
}
Но это еще не все. Нам нужен еще один метод OnNewURLEnter(void). Он, собственно говоря и делает этот переход на новый веб адрес:
void CMainFrame::OnNewURLEnter(void)
{
    CString str;

    m_adressbar.GetEditCtrl()->GetWindowText(str);
    ((CmybrowserView*)GetActiveView())->Navigate2(str, 0, NULL);

    COMBOBOXEXITEM item;

    item.mask = CBEIF_TEXT;
    item.iItem = -1;
    item.pszText = (LPTSTR)(LPCTSTR)str;
    m_adressbar.InsertItem(&item);
}  
На конец, нам нужно отредактировать вручную MESSAGE_MAP() все того же класса «CMainFrame» таким обарзом:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_WM_CREATE()
    ON_COMMAND(IDOK, OnNewURLEnter)//Эту стоку мы вставляем вручную
END_MESSAGE_MAP()
Компилируем и смотрим. Вводим какой-нибудь  адрес и видим, что  новую страницу. Работает, и это хорошо.
15.    Если приглядеться, то каждый уважающий себя браузер  отображает заголовок загруженной  им веб страницы. Наш этого почему-то не делает. Надо исправить это поскорее.  В класс  “CmybrowserDoc”  добавляем  переменную типа строка -  CString url. Затем переходим в класс «CmybrowserView» и находим в панели «Properties»/«Overrides”. Там выбираем метод «OnDocumentComplete()» и кликаем на нем мышью. Затем переходим в сам метод и редактируем его:
  
    void CmybrowserView::OnDocumentComplete(LPCTSTR lpszURL){

    CString title="  Web Browser";
    ((CMainFrame*)GetParentFrame())->m_adressbar.SetWindowText(lpszURL);

    AfxGetMainWnd()->SetWindowText(GetLocationName() + title);

    (GetDocument())->url=lpszURL;

    CHtmlView::OnDocumentComplete(lpszURL);

}   

16.    Теперь идем в редактор ресурсов и выбираем «Menu», там находим пункт «Open…» . Там добавляем обработчик событий, установив его к классу «CmybrowserView». Далее переходим в  саму функцию и редактируем следующим обрзаом:
           void CmybrowserView::OnFileOpen() {
    static TCHAR  BASED_CODE filter[]=
        _T("HTML Files(*.htm)|*.htm|HTML Files(*.html)|*.html|All Files(*.*)|*.*||");
    CFileDialog dlg(TRUE,_T("html"),NULL,OFN_EXPLORER,filter,this);
    dlg.m_ofn.lpstrTitle=_T("Open HTML file...");
    if(dlg.DoModal()!=IDOK){
        return ;
    }
    
   CString url(_T("file://"));
    url+=dlg.GetPathName();
    Navigate2(url,NULL,NULL);
}

Пробуем. Мы можем открыть HTML страницу для просмотра..На этом все.  Запускаем программу и видим результат. Браузер очень простой, но вполне рабочий. Далее собственно исходный код программы.

// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "mybrowser.h"
#include "mainfrm.h"
#include  "afxinet.h"
#include "mybrowserDoc.h"
#include "mybrowserView.h"
#include ".\mainfrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_WM_CREATE()
    ON_COMMAND(IDOK, OnNewURLEnter)
END_MESSAGE_MAP()

static UINT indicators[] =
{
    ID_SEPARATOR,           // status line indicator
    ID_INDICATOR_CAPS,
    ID_INDICATOR_NUM,
    ID_INDICATOR_SCRL,
};

// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
    // TODO: add member initialization code here
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

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

    CImageList img;
    //CString str;

    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    m_rebar.Create(this);
    m_toolbar.CreateEx(this);

    m_adressbar.Create(CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, 101 );

    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;

    // set up toolbar button sizes
    m_toolbar.GetItemRect(0, &toolrect);
    m_toolbar.SetSizes(toolrect.Size(), CSize(30,20));
    m_rebar.AddBar(&m_toolbar);

    m_rebar.AddBar(&m_adressbar, "address:", NULL, RBBS_FIXEDBMP | RBBS_BREAK);
  

    return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    if( !CFrameWnd::PreCreateWindow(cs) )
        return FALSE;
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs

    return TRUE;
}

// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
    CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
    CFrameWnd::Dump(dc);
}

#endif //_DEBUG

// CMainFrame message handlers

void CMainFrame::OnNewURL(void)
{
    CString str;
    m_adressbar.GetLBText(m_adressbar.GetCurSel(), str);
    ((CmybrowserView*)GetActiveView())->Navigate2(str, 0, NULL);

}

void CMainFrame::OnNewURLEnter(void)
{
    CString str;

    m_adressbar.GetEditCtrl()->GetWindowText(str);
    ((CmybrowserView*)GetActiveView())->Navigate2(str, 0, NULL);

    COMBOBOXEXITEM item;

    item.mask = CBEIF_TEXT;
    item.iItem = -1;
    item.pszText = (LPTSTR)(LPCTSTR)str;
    m_adressbar.InsertItem(&item);
}

// mybrowser.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "mybrowser.h"
#include "MainFrm.h"

#include "mybrowserDoc.h"
#include "mybrowserView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CmybrowserApp

BEGIN_MESSAGE_MAP(CmybrowserApp, CWinApp)
    ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
    // Standard file based document commands
    ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
    ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
    // Standard print setup command
    ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()

// CmybrowserApp construction

CmybrowserApp::CmybrowserApp()
{
    // TODO: add construction code here,
    // Place all significant initialization in InitInstance
}

// The one and only CmybrowserApp object

CmybrowserApp theApp;
// This identifier was generated to be statistically unique for your app
// You may change it if you prefer to choose a specific identifier

// {81412519-BCE7-4887-98F7-F034BC210111}
static const CLSID clsid =
{ 0x81412519, 0xBCE7, 0x4887, { 0x98, 0xF7, 0xF0, 0x34, 0xBC, 0x21, 0x1, 0x11 } };
const GUID CDECL BASED_CODE _tlid =
        { 0xAE9746B8, 0x474, 0x4194, { 0xA1, 0xD5, 0x98, 0x38, 0x60, 0x1D, 0x1D, 0xE6 } };
const WORD _wVerMajor = 1;
const WORD _wVerMinor = 0;

// CmybrowserApp initialization

BOOL CmybrowserApp::InitInstance()
{
    // InitCommonControls() is required on Windows XP if an application
    // manifest specifies use of ComCtl32.dll version 6 or later to enable
    // visual styles.  Otherwise, any window creation will fail.
    InitCommonControls();

    CWinApp::InitInstance();

    if (!AfxSocketInit())
    {
        AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
        return FALSE;
    }

    // Initialize OLE libraries
    if (!AfxOleInit())
    {
        AfxMessageBox(IDP_OLE_INIT_FAILED);
        return FALSE;
    }
    AfxEnableControlContainer();
    // Standard initialization
    // If you are not using these features and wish to reduce the size
    // of your final executable, you should remove from the following
    // the specific initialization routines you do not need
    // Change the registry key under which our settings are stored
    // TODO: You should modify this string to be something appropriate
    // such as the name of your company or organization
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));
    LoadStdProfileSettings(4);  // Load standard INI file options (including MRU)
    // Register the application's document templates.  Document templates
    //  serve as the connection between documents, frame windows and views
    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
        IDR_MAINFRAME,
        RUNTIME_CLASS(CmybrowserDoc),
        RUNTIME_CLASS(CMainFrame),       // main SDI frame window
        RUNTIME_CLASS(CmybrowserView));
    if (!pDocTemplate)
        return FALSE;
    AddDocTemplate(pDocTemplate);
    // Connect the COleTemplateServer to the document template
    //  The COleTemplateServer creates new documents on behalf
    //  of requesting OLE containers by using information
    //  specified in the document template
    m_server.ConnectTemplate(clsid, pDocTemplate, TRUE);
        // Note: SDI applications register server objects only if /Embedding
        //   or /Automation is present on the command line
    // Parse command line for standard shell commands, DDE, file open
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);
    // App was launched with /Embedding or /Automation switch.
    // Run app as automation server.
    if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated)
    {
        // Register all OLE server factories as running.  This enables the
        //  OLE libraries to create objects from other applications
        COleTemplateServer::RegisterAll();

        // Don't show the main window
        return TRUE;
    }
    // App was launched with /Unregserver or /Unregister switch.  Unregister
    // typelibrary.  Other unregistration occurs in ProcessShellCommand().
    else if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppUnregister)
    {
        m_server.UpdateRegistry(OAT_DISPATCH_OBJECT, NULL, NULL, FALSE);
        AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor);
    }
    // App was launched standalone or with other switches (e.g. /Register
    // or /Regserver).  Update registry entries, including typelibrary.
    else
    {
        m_server.UpdateRegistry(OAT_DISPATCH_OBJECT);
        COleObjectFactory::UpdateRegistryAll();
        AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid);
    }
    // Dispatch commands specified on the command line.  Will return FALSE if
    // app was launched with /RegServer, /Register, /Unregserver or /Unregister.
    if (!ProcessShellCommand(cmdInfo))
        return FALSE;
    // The one and only window has been initialized, so show and update it
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();
    // call DragAcceptFiles only if there's a suffix
    //  In an SDI app, this should occur after ProcessShellCommand
    return TRUE;
}


// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    enum { IDD = IDD_ABOUTBOX };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()

// App command to run the dialog
void CmybrowserApp::OnAppAbout()
{
    CAboutDlg aboutDlg;
    aboutDlg.DoModal();
}

// CmybrowserApp message handlers


// mybrowser.idl : type library source for mybrowser.exe

// This file will be processed by the MIDL compiler to produce the
// type library (mybrowser.tlb).

[ uuid(AE9746B8-0474-4194-A1D5-9838601D1DE6), version(1.0) ]
library mybrowser
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

    //  Primary dispatch interface for CmybrowserDoc
    
    [ uuid(F03379DB-AFCA-4A91-A713-EF317F96EA57) ]
    dispinterface Imybrowser
    {
        properties:
            
        methods:
    };

    //  Class information for CmybrowserDoc
    
    [ uuid(81412519-BCE7-4887-98F7-F034BC210111) ]
    coclass CmybrowserDoc
    {
        [default] dispinterface Imybrowser;
    };
};


// mybrowserDoc.cpp : implementation of the CmybrowserDoc class
//

#include "stdafx.h"
#include "mybrowser.h"

#include "mybrowserDoc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CmybrowserDoc

IMPLEMENT_DYNCREATE(CmybrowserDoc, CDocument)

BEGIN_MESSAGE_MAP(CmybrowserDoc, CDocument)
END_MESSAGE_MAP()

BEGIN_DISPATCH_MAP(CmybrowserDoc, CDocument)
END_DISPATCH_MAP()

// Note: we add support for IID_Imybrowser to support typesafe binding
//  from VBA.  This IID must match the GUID that is attached to the 
//  dispinterface in the .IDL file.

// {F03379DB-AFCA-4A91-A713-EF317F96EA57}
static const IID IID_Imybrowser =
{ 0xF03379DB, 0xAFCA, 0x4A91, { 0xA7, 0x13, 0xEF, 0x31, 0x7F, 0x96, 0xEA, 0x57 } };

BEGIN_INTERFACE_MAP(CmybrowserDoc, CDocument)
    INTERFACE_PART(CmybrowserDoc, IID_Imybrowser, Dispatch)
END_INTERFACE_MAP()

// CmybrowserDoc construction/destruction

CmybrowserDoc::CmybrowserDoc()
: url(_T(""))
{
    // TODO: add one-time construction code here

    EnableAutomation();

    AfxOleLockApp();
}

CmybrowserDoc::~CmybrowserDoc()
{
    AfxOleUnlockApp();
}

BOOL CmybrowserDoc::OnNewDocument()
{
    if (!CDocument::OnNewDocument())
        return FALSE;

    // TODO: add reinitialization code here
    // (SDI documents will reuse this document)

    return TRUE;
}


// CmybrowserDoc serialization

void CmybrowserDoc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {
        // TODO: add storing code here
    }
    else
    {
        // TODO: add loading code here
    }
}

// CmybrowserDoc diagnostics

#ifdef _DEBUG
void CmybrowserDoc::AssertValid() const
{
    CDocument::AssertValid();
}

void CmybrowserDoc::Dump(CDumpContext& dc) const
{
    CDocument::Dump(dc);
}
#endif //_DEBUG

// CmybrowserDoc commands


// mybrowserView.cpp : implementation of the CmybrowserView class
//

#include "stdafx.h"
#include "mybrowser.h"

#include "mybrowserDoc.h"
#include ".\mybrowserview.h"
#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CmybrowserView

IMPLEMENT_DYNCREATE(CmybrowserView, CHtmlView)

BEGIN_MESSAGE_MAP(CmybrowserView, CHtmlView)
    // Standard printing commands
    ON_COMMAND(ID_FILE_PRINT, CHtmlView::OnFilePrint)
    ON_COMMAND(ID_FORWARD, OnNavigationForward)
    ON_COMMAND(ID_BACK, OnNavigationBack)
    ON_COMMAND(ID_STOP, OnNavigationStop)
    ON_COMMAND(ID_REFRESH, OnNavigationReload)
    ON_COMMAND(ID_HOME, OnNavigationHome)
    ON_COMMAND(ID_SEARCH, OnNavigationSearch)
    ON_UPDATE_COMMAND_UI(ID_STOP, OnUpdateStop)
    ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
END_MESSAGE_MAP()

// CmybrowserView construction/destruction

CmybrowserView::CmybrowserView()
{
    

}

CmybrowserView::~CmybrowserView()
{
}

BOOL CmybrowserView::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs

    return CHtmlView::PreCreateWindow(cs);
}

void CmybrowserView::OnInitialUpdate()
{
    CHtmlView::OnInitialUpdate();
    Navigate2(_T("about:blank"),NULL,NULL);
}

// CmybrowserView printing


// CmybrowserView diagnostics

#ifdef _DEBUG
void CmybrowserView::AssertValid() const
{
    CHtmlView::AssertValid();
}

void CmybrowserView::Dump(CDumpContext& dc) const
{
    CHtmlView::Dump(dc);
}

CmybrowserDoc* CmybrowserView::GetDocument() const // non-debug version is inline
{
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CmybrowserDoc)));
    return (CmybrowserDoc*)m_pDocument;
}
#endif //_DEBUG

// CmybrowserView message handlers

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::OnDocumentComplete(LPCTSTR lpszURL)
{

    CString title="  Web Browser";
    ((CMainFrame*)GetParentFrame())->m_adressbar.SetWindowText(lpszURL);

    AfxGetMainWnd()->SetWindowText(GetLocationName() + title);

    (GetDocument())->url=lpszURL;

    CHtmlView::OnDocumentComplete(lpszURL);

}


void CmybrowserView::OnUpdateStop(CCmdUI *pCmdUI)
{
        pCmdUI->Enable(GetBusy());
}

void CmybrowserView::OnFileOpen()
{
    static TCHAR  BASED_CODE filter[]=
        _T("HTML Files(*.htm)|*.htm|HTML Files(*.html)|*.html|All Files(*.*)|*.*||");
    CFileDialog dlg(TRUE,_T("html"),NULL,OFN_EXPLORER,filter,this);
    dlg.m_ofn.lpstrTitle=_T("Open HTML file...");
    if(dlg.DoModal()!=IDOK){
        return ;
    }
    
   CString url(_T("file://"));
    url+=dlg.GetPathName();
    Navigate2(url,NULL,NULL);
}

// stdafx.cpp : source file that includes just the standard includes
// mybrowser.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"


// MainFrm.h : interface of the CMainFrame class
//

#pragma once
class CMainFrame : public CFrameWnd
{
    
protected: // create from serialization only
    CMainFrame();
    DECLARE_DYNCREATE(CMainFrame)

// Attributes
public:

// Operations
public:

// Overrides
public:
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

// Implementation
public:
    virtual ~CMainFrame();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

protected:  // control bar embedded members
    CStatusBar  m_wndStatusBar;
    //CToolBar    m_wndToolBar;
    CToolBar    m_toolbar;
    CReBar      m_rebar;

public:
    CComboBoxEx m_adressbar;

// Generated message map functions
protected:
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    DECLARE_MESSAGE_MAP()
public:
    void OnNewURL(void);
    void OnNewURLEnter(void);
};


// mybrowser.h : main header file for the mybrowser application
//
#pragma once

#ifndef __AFXWIN_H__
    #error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h"       // main symbols

// CmybrowserApp:
// See mybrowser.cpp for the implementation of this class
//

class CmybrowserApp : public CWinApp
{
public:
    CmybrowserApp();

// Overrides
public:
    virtual BOOL InitInstance();

// Implementation
    COleTemplateServer m_server;
        // Server object for document creation
    afx_msg void OnAppAbout();
    DECLARE_MESSAGE_MAP()
};

extern CmybrowserApp theApp;

// mybrowserDoc.h : interface of the CmybrowserDoc class
//

#pragma once

class CmybrowserDoc : public CDocument
{
protected: // create from serialization only
    CmybrowserDoc();
    DECLARE_DYNCREATE(CmybrowserDoc)

// Attributes
public:

// Operations
public:

// Overrides
    public:
    virtual BOOL OnNewDocument();
    virtual void Serialize(CArchive& ar);

// Implementation
public:
    virtual ~CmybrowserDoc();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
    DECLARE_MESSAGE_MAP()

    // Generated OLE dispatch map functions

    DECLARE_DISPATCH_MAP()
    DECLARE_INTERFACE_MAP()
public:
    CString url;
};



 // mybrowserView.h : interface of the CmybrowserView class
//

#pragma once

class CmybrowserView : public CHtmlView
{
protected: // create from serialization only
    CmybrowserView();
    DECLARE_DYNCREATE(CmybrowserView)

// Attributes
public:
    CmybrowserDoc* GetDocument() const;

// Operations
public:

// Overrides
    public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
    virtual void OnInitialUpdate(); // called first time after construct

// Implementation
public:
    virtual ~CmybrowserView();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnNavigationForward();
    afx_msg void OnNavigationBack();
    afx_msg void OnNavigationStop();
    afx_msg void OnNavigationReload();
    afx_msg void OnNavigationHome();
    afx_msg void OnNavigationSearch();
    
    virtual void OnDocumentComplete(LPCTSTR lpszURL);
    afx_msg void OnUpdateStop(CCmdUI *pCmdUI);
    afx_msg void OnFileOpen();
};

#ifndef _DEBUG  // debug version in mybrowserView.cpp
inline CmybrowserDoc* CmybrowserView::GetDocument() const
   { return reinterpret_cast<CmybrowserDoc*>(m_pDocument); }
#endif

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by mybrowser.rc
//
#define IDD_ABOUTBOX                    100
#define IDP_OLE_INIT_FAILED             100
#define IDP_SOCKETS_INIT_FAILED         104
#define IDR_MAINFRAME                   128
#define IDR_mybrowserTYPE               129
#define IDI_ICON1                       130
#define IDB_HOT                         131
#define IDB_COLD                        132
#define ID_STOP                         57608
#define ID_REFRESH                      57609
#define ID_FORWARD                      57610
#define ID_SEARCH                       57611
#define ID_HOME                         57612
#define ID_BACK                         57613

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        133
#define _APS_NEXT_COMMAND_VALUE         32777
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently,
// but are changed infrequently

#pragma once

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN        // Exclude rarely-used stuff from Windows headers
#endif

// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER                // Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0400        // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif

#ifndef _WIN32_WINNT        // Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT 0x0400        // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif                        

#ifndef _WIN32_WINDOWS        // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif

#ifndef _WIN32_IE            // Allow use of features specific to IE 4.0 or later.
#define _WIN32_IE 0x0400    // Change this to the appropriate value to target IE 5.0 or later.
#endif

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS    // some CString constructors will be explicit

// turns off MFC's hiding of some common and often safely ignored warning messages
#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxdisp.h>        // MFC Automation classes

#include <afxdtctl.h>        // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>            // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT

#include <afxhtml.h>            // MFC HTML view support
#include <afxsock.h>        // MFC socket extensions


0
 

Добавить комментарий


Защитный код
Обновить