Jx Random Quote

"Will the highways on the Internet become more few?" -- George W. Bush
Главная arrow Статьи arrow Как сделать простой собственный Web браузер используя MFC. Часть 2
Как сделать простой собственный Web браузер используя MFC. Часть 2 Версия в формате PDF Версия для печати Отправить на e-mail
Во второй, главной части статьи, мы закончим наш браузер. Нам нужен  сейчас еще один метод 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 
 
 
опубликовано
Добавить новыйПоиск
Добавить комментарий
Имя:
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.

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