简单的工作室

当前位置: 主页>编程技巧>VC++编程>

不使用MFC编写浏览器(转)

时间:2014-06-06 09:52来源:未知 作者:admin 点击:
MFC固然简单好用,但做出来的东西太臃肿。我决定不使用MFC直接用WIN32的API函数写个浏览器,现在界面已有雏形,没有使用别人的界面库,尽量使用HTML做界面。内核可以使用ATL创建WebBrowser控件,本人将重新包装。通过这种方法写的浏览器应该能更轻便更好用。 #import "c:\wi

MFC固然简单好用,但做出来的东西太臃肿。我决定不使用MFC直接用WIN32的API函数写个浏览器,现在界面已有雏形,没有使用别人的界面库,尽量使用HTML做界面。内核可以使用ATL创建WebBrowser控件,本人将重新包装。通过这种方法写的浏览器应该能更轻便更好用。 
    
      #import         "c:\winnt\system32\shdocvw.dll"     
    
      #include       <atlbase.h>   
      static       CComModule       _Module;   
      #include       <atlwin.h>   
      #pragma       comment(lib,"atl")   
    
      CAxWindow       axWnd       ;   
      IWebBrowser2*       pWebBrowser       ;   
    
      m_axWnd       .Attach(hChildWnd)       ;       //       在你指的窗口里先创建一个子窗口,取其HWND   
    
      IUnknown*       punkCtrl       ;   
    
      m_axWnd       .CreateControlEx       (       L"{8856F961-340A-11D0-A96B-00C04FD705A2}",     
      NULL,       NULL,       &punkCtrl       );   
    
      punkCtrl->QueryInterface(IID_IWebBrowser2,(void**)       &pWebBrowser)       ;   
    
      punkCtrl->Release()       ;   
    
      VARIANT       var       =       _variant_t("www.csdn.net")       ;   
      pWebBrowser->Navigate2(&var,NULL,NULL,NULL,NULL)       ;

//代码二

#include      <atlbase.h > 
#include      <atlcom.h > 
#include      <atlhost.h > 
#include      <atlwin.h > 
#include      <atlctl.h > 

CAxWindow      m_wndBrowser; 
CComPtr <IWebBrowser2 >      m_pBrowserApp; 


2:cpp文件 
CoInitialize(      NULL      ); 
/** 
*      创建窗体包容web控件 
*/ 
RECT      rc={0,0,100,100}; 
HWND      hWnd=m_wndBrowser.Create      (      hParent,      rc,      _T(""),      WS_CHILD      |      WS_VISIBLE      |      WS_CLIPCHILDREN      ); 

/** 
*      创建Web控件,并查询IWebBrowser2接口指针赋予m_pBrowserApp 
*/ 
if(      hWnd      ) 
{   
LPOLESTR      lpProgId      =      NULL; 
HRESULT      hResult      =      ProgIDFromCLSID( CLSID_WebBrowser,&lpProgId      ); 
if(      hResult      ==      S_OK      ) 

CComPtr <IUnknown >      punkCtrl; 
m_wndBrowser.CreateControlEx      (      lpProgId,      NULL,NULL,      &punkCtrl      ); 
if(      punkCtrl      ) 

m_pBrowserApp      =      punkCtrl; 

CoTaskMemFree(      lpProgId      ); 


//////////////////////////////////////////////

#define     Assert(x)     if(!x)     MessageBox(NULL,     "IE     ERROR!",     "Error",     MB_ICONSTOP)   
    
            HRESULT                                             hret;   
            IUnknown                                         *pUnknown;                           
            IWebBrowser2                                 *pWebBrowser;   
            IConnectionPoint                         *pConnectionPoint;   
            IConnectionPointContainer       *pConnectionPointContainer;   
            IOleInPlaceObject                       *pInPlaceObject;   
            IOleObject                                     *pObject;   
            DWORD                                                 dwAdviseCookie;   
    
            //     Initialize     COM     library   
            OleInitialize(NULL);   
    
            //     Setup     member     variables   
            m_dwRefCount     =     1;   
            m_hwndParent     =     hwndParent;   
    
            //     Instantiate     all     needed     interfaces   
            m_pClientSite     =     new     ClientSite(this);   
            m_pInPlaceSite     =     new     InPlaceSite(this);   
            m_pWebBrowserEvents2     =     new     WebBrowserEvents2(this);   
    
            //     Instantiate     Web     Browser     control   
            hret     =     CoCreateInstance(CLSID_WebBrowser,     NULL,     CLSCTX_ALL,     IID_IUnknown,     (void**)(&pUnknown));   
            Assert(SUCCEEDED(hret));   
    
            //     Set     the     client     site   
            hret     =     pUnknown->QueryInterface(IID_IOleObject,     (void**)(&pObject));   
            Assert(SUCCEEDED(hret));   
            hret     =     pObject->SetClientSite(m_pClientSite);   
            Assert(SUCCEEDED(hret));   
    
            //     Set     the     site     limits   
            RECT     rWindowPos;   
            GetClientRect(hwndParent,     &rWindowPos);   
            
            rWindowPos.right     -=     rWindowPos.left;   
            rWindowPos.bottom     -=     rWindowPos.top;   
            rWindowPos.left     =     0;   
            rWindowPos.top     =     0;   
            
            hret     =     pUnknown->QueryInterface(IID_IOleInPlaceObject,     (void**)(&pInPlaceObject));   
            Assert(SUCCEEDED(hret));   
            hret     =     pInPlaceObject->SetObjectRects(&rWindowPos,     &rWindowPos);   
            Assert(SUCCEEDED(hret));   
            pInPlaceObject->Release();   
    
            //     Activate     the     site   
            hret     =     pObject->DoVerb(OLEIVERB_INPLACEACTIVATE,     NULL,     m_pClientSite,     0,     hwndParent,     &rWindowPos);   
            Assert(SUCCEEDED(hret));   
            pObject->Release();   
    
            //     Set     event     handler   
            hret     =     pUnknown->QueryInterface(IID_IConnectionPointContainer,     (void**)(&pConnectionPointContainer));   
            Assert(SUCCEEDED(hret));   
            hret     =     pConnectionPointContainer->FindConnectionPoint(DIID_DWebBrowserEvents2,     &pConnectionPoint);   
            Assert(SUCCEEDED(hret));   
            hret     =     pConnectionPoint->Advise(m_pWebBrowserEvents2,     &dwAdviseCookie);   
            Assert(SUCCEEDED(hret));   
            pConnectionPointContainer->Release();   
            pConnectionPoint->Release();   
    
            //     Get     Web     Browser     interface   
            hret     =     pUnknown->QueryInterface(IID_IWebBrowser2,     (void**)&pWebBrowser);   
            Assert(SUCCEEDED(hret));   
            if(pUnknown)     pUnknown->Release();   
    
            //     Go     to     URL   
            hret     =     pWebBrowser->Navigate(L"http://www.google.com",     NULL,     NULL,     NULL,     NULL);   
            Assert(SUCCEEDED(hret));   
            if(pWebBrowser)     pWebBrowser->Release();   

可以不需要用,在ATL下也可以使用。在资源中用右键把浏览器对象加入,然后   
   LRESULT    CEuuTodayDlg::OnInitDialog(UINT    uMsg,    WPARAM    wParam,    LPARAM    lParam,    BOOL&    bHandled)   
   {   
   CAxWindow    wndIE;   
   wndIE    =    GetDlgItem(IDC_IE);   
    
   HRESULT    hr;   
    
   CComQIPtr<IConnectionPointContainer,    &IID_IConnectionPointContainer>    m_spCPC;   
    
   hr    =    wndIE.QueryControl    (    &m_spWebBrowser    );   
           if    (    m_spWebBrowser    )   
           {   
   CComVariant    v;      //    empty    variant   
   ////////////////////   
    
   //为    WebBrowser    事件查赵连接点   
   m_spCPC=m_spWebBrowser;   
    
   hr    =    m_spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,    &m_spCP);     
   if    (FAILED(hr))   
   MessageBox("Error","Error");   
   InternalAddRef();   
   //    将我们的事件处理器传递给容器。事件发生时容器将调用我们实现的     
   //    IDispatch    接口函数     
   hr    =    m_spCP->Advise(    reinterpret_cast<IDispatch*>(this),    &m_dwCookie);   
   ////////////////////   
   m_spWebBrowser->Navigate    (    CComBSTR(str),     
   &v,    &v,    &v,    &v    );   
    
   }   

(责任编辑:简单的工作室)
顶一下
(0)
0%
踩一下
(1)
100%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容