注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

共享圈

www.gxquan.com的同步博客,保存高质量文章之用

 
 
 

日志

 
 

HTML浏览器嵌入本地程序  

2012-10-03 17:48:54|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C解析HTML C处理HTML HTML控件

1.嵌入IE浏览器

嵌入IE内核应该是早期最常用的方法,使用windows平台上的ActiveX方式,将IWebBrowser2对象嵌入到窗口 中,IWebBrowser2接口涉及到很多的接口,可以让我们进行事件处理、操作DOM、与JS通信,使用一个连接点接口与浏览器内部连接,获取和处理 事件。

使用IE内核有一个缺点就是用户的操作系统各种各样,内核也是多个版本而且不兼容(只有IE9+才支持HTML5)。导致程序非常不稳定,再有就是不能跨平台。以至于现在嵌入IE应该是最差的方式了。

2.嵌入Firefox

Mozilla的XULRunner是一个跨平台的浏览器应用框架,被Mozilla用于Firefox和ThunderBird等软件的核心,同 样是开源和支持HTML5,项目使用XPCOM方式实现,除了XPCOM对象(windows系统的在xpcom.dll中)的获取外,其它属性,对象和 函数的访问均与MDN上Javascript的文档相同,可谓文档齐全。同样也有已经实现的第三方C++项目将基于XULRunner的浏览器封装成控 件,非常方便使用。

MDN地址:https://developer.mozilla.org/en-US/docs/XULRunner

3.嵌入Chrome

Embedding Chrome:经过本人的研究,个人认为嵌入Chrome是最好的解决方案,Chrome本身开源,高效的v8引擎。同时也有很多附属的开源项 目,libcef就是其中一个,cef是chrome embed framework的缩写,意在实现chrome嵌入应用程序,本人对这个项目下载下来后进行过测试,效果非常好,支持HTML5,同时跨平台。

项目地址:http://code.google.com/p/chromiumembedded/


下面是libcef调用的示例程序,给大家做参考。

001/**
002 * libcef test application.
003 * @author Hoverlees me[at]hoverlees.com
004 */
005#include <iostream>
006#include <Windows.h>
007 
008#include "HoverWindow.h"
009#include <include/cef_browser.h>
010#include <include/cef_app.h>
011#include <include/cef_client.h>
012 
013class MyChromeClient:public CefClient{
014private:
015    int refCount;
016public:
017    MyChromeClient(){
018        refCount=1;
019    }
020    virtual int AddRef(){
021        refCount++;
022        return refCount;
023    }
024    virtual int Release(){
025        refCount--;
026        return refCount;
027    }
028    virtual int GetRefCt(){
029        return refCount;
030    }
031};
032 
033class MyChromeApplication:public CefApp{
034private:
035    int refCount;
036public:
037    MyChromeApplication(){
038        refCount=1;
039    }
040    virtual int AddRef(){
041        refCount++;
042        return refCount;
043    }
044    virtual int Release(){
045        refCount--;
046        return refCount;
047    }
048    virtual int GetRefCt(){
049        return refCount;
050    }
051};
052 
053class ChromeWindow:public HoverWindow{
054private:
055    CefWindowInfo windowInfo;
056    MyChromeClient client;
057    CefRefPtr<CefBrowser> browser;
058public:
059    ChromeWindow(HINSTANCE hInstance,const char* className,const char* title,
060        int x,int y,int w,int h,DWORD exStyle=NULL,DWORD windowStyle=WS_OVERLAPPEDWINDOW);
061    virtual bool onWindowMessage(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
062};
063ChromeWindow::ChromeWindow(HINSTANCE hInstance,const char* className,const char* title,
064    int x,int y,int w,int h,DWORD exStyle,DWORD windowStyle)
065    :HoverWindow(hInstance,className,title,x,y,w,h,exStyle,windowStyle){
066 
067}
068bool ChromeWindow::onWindowMessage(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
069    RECT rt;
070    switch(uMsg){
071    case WM_CREATE:
072        GetClientRect(hWnd,&rt);
073        windowInfo.SetAsChild(hWnd,rt);
074        this->browser=CefBrowserHost::CreateBrowserSync(windowInfo,&client,CefString("http://www.XXX.com"),CefBrowserSettings());
075        CefRunMessageLoop();
076        break;
077    case WM_SIZE:
078        GetClientRect(hWnd,&rt);
079        SetWindowPos(this->browser->GetHost()->GetWindowHandle(),0,rt.left,rt.top,rt.right,rt.bottom,0);
080        break;
081    case WM_CLOSE:
082        CefQuitMessageLoop();
083        PostQuitMessage(0);
084        break;
085    default:
086        return false;
087    }
088    return true;
089}
090 
091int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
092    MyChromeApplication app;
093    CefMainArgs main_args(hInst);
094    CefSettings settings;
095    settings.multi_threaded_message_loop = false;
096    int exit_code = CefExecuteProcess(main_args,&app);
097    if (exit_code >= 0)
098    return exit_code;
099    CefInitialize(main_args,settings,&app);
100    ChromeWindow* window=new ChromeWindow(hInst,"hover","Chrome Embedding - http://www.xxx.com",0,0,400,400);
101    window->startMessageLoop();
102    CefShutdown();
103    return 0;
104}




为方便阅读而转载,转自:http://www.hoverlees.com/blog/?p=1339
  评论这张
 
阅读(489)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017