精华内容
下载资源
问答
  • chrome涉及开源项目

    千次阅读 2010-12-31 16:49:00
    chrome涉及开源项目

    Google Chrome是一个优秀的开源的浏览器,其开发过程大量地使用了网上现在成熟稳定的开源代码,目前Chrome所涉及26个开源代码:


    1、Google Breakpad
        /src/breakpad
        开源的跨开台程序崩溃报告系统。
    2、Google URL
        /src/googleurl
         Google小巧的URL解析整理库。
    3、Skia
        /src/skia
        矢量图引擎。
    4、Google v8
        /src/v8
        Google开源的JavaScript引擎。V8实现了ECMA-262第三版的ECMAScript规范,可运行于Windows XP 和 Vista, Mac OS X 10.5 (Leopard), 及 Linux等基于IA-32 或 ARM 的系统之上。V8可单独运行也可嵌入到任何C++程序中。
    5、Webkit
        /src/webki
        开源的浏览器引擎
    6、Netscape Portable Runtime (NSPR)
        /src/base/third_party/nspr
        Netscape Portable Runtime (NSPR) 提供了系统级平台无关的API及类似libc的函数。
    7、Network Security Services (NSS)
        /src/base/third_party/nss
        Network Security Services (NSS) 一套用于支持服务器端与客户端安全开发的跨平台函数库。程序通过NSS可支持SSL v2 and v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509 v3 认证及其它一些安全标准。
    8、Hunspell
        /src/third_party/hunspell
        Spell checker and morphological analyzer library and program designed for languages with rich morphology and complex word compounding or character encoding.
    9、Windows Template Library
        /src/third_party/wtl
        用于开发Windows程序与UI组件的C++ library。WTL扩展了ATL (Active Template Library) 并提供一套用于controls, dialogs, frame windows, GDI objects等开发的类。
    10、Google C++ Testing Framework
        /src/testing/gtest
        Google用于编写C++测试的基于xUnit架构的框架,可用于多种平台上:Linux, Mac OS X, Windows, Windows CE, and Symbian。支持自动测试发现,有一套丰富的Assertions断言,用于可自定义断言,death tests, fatal and non-fatal failures, various options for running the tests, and XML test report generation.
    11、bsdiff 与 bspatch
        /src/third_party/bsdiff 及 /src/third_party/bspatch
        bsdiff 与 bspatch 用于为二进制文件生成补丁。
    12、bzip2
        /src/third_party/bzip2
        bzip2使用Burrows-Wheeler block sorting text compression 算法与Huffman编码压缩文件。
    13、International Components for Unicode (ICU)
        /src/third_party/icu38
        ICU是一套成熟并被广泛使用的C/C++ 及 Java 库,可为软件提供Unicode与全球化支持。
    14、libjingle
        用于做sync的p2p库
    15、libjpeg
        /src/third_party/libjpeg
        用于处理JPEG (JFIF)图像格式的库。
    16、libpng
        /src/third_party/libpng
        PNG图像格式库。支持绝大部分的PNG特性,可扩展。已经被广泛地使用了13年以上了。
    17、libxml
        /src/third_party/libxml
        C语言的XML解析库。
    18、libxslt
        /src/third_party/libxslt
        C语言的XSLT库。
    19、LZMA
        /src/third_party/lzma_sdk
        LZMA为7-Zip软件中7z格式压缩所使用的压缩算法,有很好的压缩效果。
    20、stringencoders
        /src/third_party/modp_b64
        一系列高性能的c-string转换函数,比如:base 64 encoding/decoding。通常比其标准实现快两倍以上。
    21、Netscape Plugin Application Programming Interface (NPAPI)
        /src/third_party/npapi
        多种浏览器使用的跨平台插件架构。
    22、Pthreads-w32
        /src/third_party/pthread
        用于编写多线程程序的API
    23、SCons - a software construction tool
        /src/third_party/scons
        开源的软件构建工具——下一代的编译工具。可以认为SCons是改进过的跨平台配上autoconf/automake与ccache的Make工具的子系统。
    24、sqlite
        /src/third_party/sqlite
        大名鼎鼎的嵌入式数据库引擎。自管理、零配置、无需服务器、支持事务。
    25、TLS Lite
        /src/third_party/tlslite
         SSL 3.0, TLS 1.0, and TLS 1.1的Python免费实现库。TLS Lite支持这些安全验证方式:SRP, shared keys, and cryptoIDs in addition to X.509 certificates。注:Chrome并不包涵Python。TLS Lite用于Chrome开发过程中的代码覆盖、依赖检查、网页加载时间测试及生成html结果比较等。
    26、zlib
        /src/third_party/zlib
        zlib为一套用于任意平台与机器的无损数据压缩的库,它免费、自由、无任何法律专利问题。

    --------------------------------------------------------------------------------------
    下面是其他比较有价值的Google的开源项目:

    1、Google PerfTools
    这个工具可让开发创建更强大的应用程序,特别是那些用C++模版开发的多线程应用程序,包括TCMalloc, heap-checker, heap-profiler 和cpu-profiler。

    2、Google Sparse Hash
    非常节省内存的hash-map。

    3、Protocol Buffers
    Protocol Buffers是一种可扩展编码序列数据的方式,Google在几乎所有内部RPC协议和文件格式都使用了Protocol Buffers。

    展开全文
  • 我们都知道浏览器Apple Safari和Google Chrome,一个是苹果电脑MAC OS系统的浏览器,一个是搜索巨头GOOGLE开发的浏览器,它们都使用了同样的内核webkit,关于webkit我们作如下简介。 我们都知道浏览器Apple Safari和...
  • java嵌入chrome内核

    2019-09-18 17:53:34
    参照开源代码 jcefhttps://bitbucket.org/chromiumembedded/java-cef 实现效果 支持开发者工具 项目源代码,目前只编译了32位 http://pan.baidu.com/s/1skcXKlf ...

    参照开源代码 jcef https://bitbucket.org/chromiumembedded/java-cef

    实现效果

    支持开发者工具

    项目源代码,目前只编译了32位

    http://pan.baidu.com/s/1skcXKlf

    转载于:https://my.oschina.net/microxdd/blog/631217

    展开全文
  • delphi调用chrome内核进行浏览

    万次阅读 2018-03-22 07:07:39
    随着Chrome浏览器的使用范围越来越多,而且Chrome不挑食,基本上什么系统都可以跑,而且速度那是飞快,所以C/S程序调用第三方的B/S程序或者网页时都考虑使用支持最新H5技术的内核,而Delphi的浏览控件那真心是不支持...

           随着Chrome浏览器的使用范围越来越多,而且Chrome不挑食,基本上什么系统都可以跑,而且速度那是飞快,所以C/S程序调用第三方的B/S程序或者网页时都考虑使用支持最新H5技术的内核,而Delphi的浏览控件那真心是不支持很多新的东西,而且还是微软的内核,各种的水士不符,没有办法只能想其他办法。

          经过寻找最终发现CEF4delphi项目,CEF4Delphi 是由 SalvadorDíazFau 创建的一个开源项目,用于在基于Delphi的应用程序中嵌入基于Chromium的浏览器。CEF4Delphi 基于Henri Gourvest 公司的 DCEF3。DCEF3的原始许可证仍适用于CEF4Delphi。阅读任何* .pas文件的第一行中的许可条款。

          控件的下载地址:https://github.com/salvadordf/CEF4Delphi/archive/master.zip

          软件编译后的运行环境下载:http://opensource.spotify.com/cefbuilds/index.html

    说明一下运行环境,由于是调用的Chrome内核,所以就有一堆的dll文件要与Chrome进行交互,程序编译后如果没有这些文件支持,就会如下的提示

        

    除了准备以上的材料以外,安装最新版的Chrom也是必须的,这样我们就可以开始进入调用的过程了

    1.安装控件

    将下载下来的CEF4Delphi-master.zip文件解压到Delphi目录下,例如:


    然后将程序的source路径加入到library路径中,同时要注意32位、64位的问题


    打开控件的安装文件


    然后编译安装,我们的控件部分就安装成功了


    然后就可以打开DEMO进行学习使用了,

    这里面有几点要注意,就是这个控件的项目文件与普通的项目文件是有区别的

    program Project2;
    
    
    uses
      {$IFDEF DELPHI16_UP}
      Vcl.Forms,
      WinApi.Windows,
      System.SysUtils,
      {$ELSE}
      Forms,
      Windows,
      SysUtils,
      {$ENDIF }
      uCEFApplication,
      uCEFWorkScheduler,
      Unit2 in 'Unit2.pas' {SimpleExternalPumpBrowserFrm};
    
    
    {$R *.res}
    
    
    begin
       GlobalCEFWorkScheduler := TCEFWorkScheduler.Create(nil);
    
    
      GlobalCEFApp                           := TCefApplication.Create;
      GlobalCEFApp.FlashEnabled              := False;
      GlobalCEFApp.FastUnload                := True;
      GlobalCEFApp.ExternalMessagePump       := True;
      GlobalCEFApp.MultiThreadedMessageLoop  := False;
      GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork;
    
    
      if GlobalCEFApp.StartMainProcess then
        begin
          Application.Initialize;
          {$IFDEF DELPHI11_UP}
          Application.MainFormOnTaskbar := True;
          {$ENDIF}
          Application.CreateForm(TSimpleExternalPumpBrowserFrm, SimpleExternalPumpBrowserFrm);
          Application.Run;
    
    
          // The form needs to be destroyed *BEFORE* stopping the scheduler.
          SimpleExternalPumpBrowserFrm.Free;
    
    
          GlobalCEFWorkScheduler.StopScheduler;
        end;
    
    
      FreeAndNil(GlobalCEFApp);
      FreeAndNil(GlobalCEFWorkScheduler);
    
    
    
    
    
    
    end.

    而且每个pas文件里面也是有一些自己的特点的,所以要注意在使用的时候要保证格式的正确

    即每个单元开始的位置加入了  {$I cef.inc},在本地程序编译的时候也要把这个文件加在pas文件所在的目录

    unit Unit2;
    
    {$I cef.inc}
    
    interface
    
    uses
      {$IFDEF DELPHI16_UP}
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
      {$ELSE}
      Windows, Messages, SysUtils, Variants, Classes, Graphics,
      Controls, Forms, Dialogs, StdCtrls, ExtCtrls,
      {$ENDIF}
      uCEFChromium, uCEFWindowParent, uCEFTypes, uCEFConstants, uCEFInterfaces, uCEFWorkScheduler,
      uCEFChromiumWindow;
    
    type
      TSimpleExternalPumpBrowserFrm = class(TForm)
        AddressPnl: TPanel;
        GoBtn: TButton;
        Timer1: TTimer;
        URLCbx: TComboBox;
        ChromiumWindow1: TChromiumWindow;
    
        procedure GoBtnClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
    
        procedure FormCreate(Sender: TObject);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    
        // These 3 TChromiumWindow events are called in the main app thread, so you can do whatever you want with the GUI.
        procedure ChromiumWindow1AfterCreated(Sender: TObject);
        procedure ChromiumWindow1BeforeClose(Sender: TObject);
        procedure ChromiumWindow1Close(Sender: TObject);
        procedure Chromium_OnBeforePopup(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; var popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings; var noJavascriptAccess: Boolean; out Result: Boolean);
    
      protected
        FCanClose : boolean;
        FClosing  : boolean;
    
        procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
        procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
        procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
        procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP;
      end;
    
    var
      SimpleExternalPumpBrowserFrm : TSimpleExternalPumpBrowserFrm;
      GlobalCEFWorkScheduler : TCEFWorkScheduler = nil;
    
    procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64);
    
    implementation
    
    {$R *.dfm}
    
    uses
      uCEFApplication;
    
    // This demo has a simple browser with a TChromiumWindow using the "External message pump" mode
    // to schedule the cef_do_message_loop_work calls thanks to the TCEFWorkScheduler class.
    
    // It was necessary to destroy the browser with the following destruction sequence :
    // 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event.
    // 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event.
    // 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form.
    
    procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64);
    begin
      if (GlobalCEFWorkScheduler <> nil) then GlobalCEFWorkScheduler.ScheduleMessagePumpWork(aDelayMS);
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.FormCreate(Sender: TObject);
    begin
      FCanClose := False;
      FClosing  := False;
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      CanClose := FCanClose;
    
      if not(FClosing) then
        begin
          FClosing           := True;
          Visible            := False;
          AddressPnl.Enabled := False;
          ChromiumWindow1.CloseBrowser(True);
        end;
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.FormShow(Sender: TObject);
    begin
      // For simplicity, this demo blocks all popup windows and new tabs
      ChromiumWindow1.ChromiumBrowser.OnBeforePopup := Chromium_OnBeforePopup;
    
      // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser
      // If it's not initialized yet, we use a simple timer to create the browser later.
      if not(ChromiumWindow1.CreateBrowser) then Timer1.Enabled := True;
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.Chromium_OnBeforePopup(Sender: TObject;
      const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
      targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
      userGesture: Boolean; var popupFeatures: TCefPopupFeatures;
      var windowInfo: TCefWindowInfo; var client: ICefClient;
      var settings: TCefBrowserSettings; var noJavascriptAccess: Boolean;
      out Result: Boolean);
    begin
      // For simplicity, this demo blocks all popup windows and new tabs
      Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.ChromiumWindow1AfterCreated(Sender: TObject);
    begin
      Caption            := 'Simple External Pump Browser';
      AddressPnl.Enabled := True;
      GoBtn.Click;
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.ChromiumWindow1BeforeClose(Sender: TObject);
    begin
      FCanClose := True;
      Close;
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.ChromiumWindow1Close(Sender: TObject);
    begin
      // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order.
      ChromiumWindow1.DestroyChildWindow;
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.GoBtnClick(Sender: TObject);
    begin
      ChromiumWindow1.LoadURL(URLCbx.Text);
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.Timer1Timer(Sender: TObject);
    begin
      Timer1.Enabled := False;
      if not(ChromiumWindow1.CreateBrowser) and not(ChromiumWindow1.Initialized) then
        Timer1.Enabled := True;
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.WMMove(var aMessage : TWMMove);
    begin
      inherited;
    
      if (ChromiumWindow1 <> nil) then ChromiumWindow1.NotifyMoveOrResizeStarted;
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.WMMoving(var aMessage : TMessage);
    begin
      inherited;
    
      if (ChromiumWindow1 <> nil) then ChromiumWindow1.NotifyMoveOrResizeStarted;
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.WMEnterMenuLoop(var aMessage: TMessage);
    begin
      inherited;
    
      if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := True;
    end;
    
    procedure TSimpleExternalPumpBrowserFrm.WMExitMenuLoop(var aMessage: TMessage);
    begin
      inherited;
    
      if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False;
    end;
    
    end.

    将编译后的程序放到运行环境中


    最终程序的运行情况如下:


    浏览本地文件




    展开全文
  • 使用Libcef+Duilib创建自己的Chrome内核浏览器

    万次阅读 热门讨论 2015-09-20 12:43:34
    在windows上快速开发chrome内核网页程序,Libcef是一个很好的选择。最近趁空闲时间,写了一个简单的浏览器,很多功能都没有完善,不知道以后还会不会继续写了,PC端确实是萎了。 1、Libcef 的使...

    浏览器代码已开源:欢迎收藏 https://github.com/JelinYao/MyChrome

    前言:

    编译Chrome开源代码是一件很恐怖的事情,代码庞大,还需要各种工具配合。在windows上快速开发chrome内核网页程序,Libcef是一个很好的选择。最近趁空闲时间,写了一个简单的浏览器,很多功能都没有完善,不知道以后还会不会继续写了,PC端确实是萎了。

    1、Libcef 的使用

    在前面的几篇文章中大概介绍了下Libcef的使用,很多时候我们都会遇到各种问题,建议去看看它的接口函数声明,里面的注释写的非常清楚。

    libCEF中C++与JavaScript的交互调

    Windows上使用CEF嵌入基于chrome内核浏览器小例

    2、大概的要点

    程序运行截图

    首先需要解决的是浏览器的Tab控件,扩展Duilib控件,每一个Tab控件就是一个容器里面存放着一系列Item,根据Item的个数和Tab的尺寸来计算每一个Item 节点的宽度。

    对于单个节点Item控件,里面又有一个子Button控件,也就是关闭按钮。对于这个Item的消息进行处理,包括选中、双击、关闭,把这些消息都转发到父控件Tab中去处理。Tab控件同一管理这些控件的哪一个是选中状态。

    然后是Libcef控件的创建,Tab中点击Add按钮后,需要创建网页控件并加载到当前窗口中去。整个父窗口在大小发生变化时,又要通知里面所有的Libcef子窗口随之变化。

    然后就是关闭时,要让所有的Libcef子进程都能正常退出,就必须按照Libef文档说的那样,在退出时调用CefQuitMessageLoop()。

    3、部分源代码

    Duilib扩展Tab控件

     

    #pragma once
    #include "ScrollTabUI.h"
    
    
    class CScrollOptionUI :
    	public CContainerUI
    {
    public:
    	CScrollOptionUI(void);
    	~CScrollOptionUI(void);
    	void	SetParent(CScrollTabUI* pTab)	{ m_pParent = pTab; }
    protected:
    	virtual void Init();
    	virtual void PaintText(HDC hDC);
    	virtual void SetPos(RECT rc);
    	virtual void DoEvent(TEventUI& event);
    	bool	OnBtnClose(void* pParam);
    private:
    	CButtonUI*		m_pBtnExit;
    	CScrollTabUI*	m_pParent;
    };
    

     

    #include "StdAfx.h"
    #include "ScrollOptionUI.h"
    
    
    #define BTN_CLOSE_WIDTH		14
    #define BTN_CLOSE_HEIGHT	14
    
    CScrollOptionUI::CScrollOptionUI(void)
    	: m_pBtnExit(NULL)
    	, m_pParent(NULL)
    {
    }
    
    
    CScrollOptionUI::~CScrollOptionUI(void)
    {
    }
    
    void CScrollOptionUI::Init()
    {
    	m_pBtnExit = new CButtonUI;
    	CDuiString strAttr;
    	strAttr.Format(L"float=\"true\" pos=\"%d,%d,%d,%d\" normalimage=\"close_nor.png\" hotimage=\"close_hot.png\" pushedimage=\"close_push.png\"",
    		m_cxyFixed.cx-BTN_CLOSE_WIDTH, 0, m_cxyFixed.cx, BTN_CLOSE_HEIGHT);
    	m_pBtnExit->ApplyAttributeList(strAttr);
    	Add(m_pBtnExit);
    	m_pBtnExit->OnNotify += MakeDelegate(this, &CScrollOptionUI::OnBtnClose);
    }
    
    void CScrollOptionUI::PaintText( HDC hDC )
    {
    	RECT rc = m_rcItem;
    	rc.left += 4;
    	rc.right-= 10;
    	CRenderEngine::DrawText(hDC, m_pManager, rc, m_sText, 0xFF666666, 0,  DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
    }
    
    void CScrollOptionUI::SetPos( RECT rc )
    {
    	CContainerUI::SetPos(rc);
    	RECT rcExit = {rc.right-BTN_CLOSE_WIDTH-1, rc.top+1, rc.right-1, rc.top+BTN_CLOSE_HEIGHT+1};
    	m_pBtnExit->SetPos(rcExit);
    }
    
    void CScrollOptionUI::DoEvent( TEventUI& event )
    {
    	if( event.Type == UIEVENT_BUTTONDOWN && m_pParent )
    	{
    		m_pParent->SelectItem(this);
    	}
    	else if ( event.Type == UIEVENT_DBLCLICK && m_pParent )
    	{
    		m_pParent->OnOptionDbClick(this);
    	}
    	CContainerUI::DoEvent(event);
    }
    
    bool CScrollOptionUI::OnBtnClose( void* pParam )
    {
    	TNotifyUI* pNotifyUI = (TNotifyUI*)pParam;
    	if(pNotifyUI->sType == DUI_MSGTYPE_CLICK && m_pParent ) 
    	{
    		m_pParent->DeleteItem(this);
    	}
    	return true;
    }
    

     

    #pragma once
    
    class CScrollTabUI;
    class CScrollTabCallback
    {
    public:
    	virtual void	OnScrollTabCloseItem(CScrollTabUI* pTab, const int nDelIndex, const int nSelIndex) = 0;
    	virtual void	OnScrollTabSelectChange(CScrollTabUI* pTab, const int nUnSelIndex, const int nSelIndex) = 0;
    	virtual void	OnScrollTabAddItem(CScrollTabUI* pTab) = 0;
    	virtual void	OnScrollTabDbClick(CScrollTabUI* pTab, const int nIndex) = 0;
    };
    
    
    class CScrollTabUI
    	: public CContainerUI
    {
    public:
    	CScrollTabUI(void);
    	~CScrollTabUI(void);
    	CControlUI*	AddTabItem(LPCTSTR lpText, bool bReset=false);
    	void	SelectItem(CControlUI* pItem);
    	void	DeleteItem(CControlUI* pItem);
    	void	DeleteItem(const int nIndex);
    	void	SetItemText(const int nIndex, LPCTSTR lpText);
    	int		GetItemCount()const								{ return m_pTabItems.size();	}
    	void	SetCallback(CScrollTabCallback* pCallback)		{ m_pCallback = pCallback;		}
    	void	OnOptionDbClick(CControlUI* pOption);
    protected:
    	virtual void	SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);
    	virtual void	Init();
    	virtual void	SetPos(RECT rc);
    	void	ResetTabPos();
    	int		GetTabItemIndex(CControlUI* pItem);
    	bool	OnBtnClickAdd(void* pParam);
    private:
    	int		m_nNorWidth;
    	int		m_nMinWidth;
    	int		m_nCurWidth;
    	int		m_nSelIndex;
    	DWORD	m_dwTabSelColor;
    	DWORD	m_dwTabNorColor;
    	CButtonUI* m_pBtnAdd;
    	vector<CControlUI*> m_pTabItems;
    	CScrollTabCallback*	m_pCallback;
    };
    

     

    #include "StdAfx.h"
    #include "ScrollTabUI.h"
    #include "ScrollOptionUI.h"
    
    
    CScrollTabUI::CScrollTabUI(void)
    	: m_nNorWidth(100)
    	, m_nCurWidth(0)
    	, m_nMinWidth(30)
    	, m_dwTabSelColor(0xffffffff)
    	, m_dwTabNorColor(0xfff0f0f0)
    	, m_nSelIndex(-1)
    	, m_pBtnAdd(NULL)
    	, m_pCallback(NULL)
    {
    }
    
    
    CScrollTabUI::~CScrollTabUI(void)
    {
    }
    
    CControlUI* CScrollTabUI::AddTabItem( LPCTSTR lpText, bool bReset/*=false*/ )
    {
    	CScrollOptionUI* pTabItem = new CScrollOptionUI;
    	if ( NULL == pTabItem )
    		return NULL;
    	CDuiString strAttr;
    	strAttr.Format(L"float=\"true\" bordercolor=\"#FF999999\" bordersize=\"1\" borderround=\"2,2\" text=\"%s\" tooltip=\"%s\"",
    		lpText, lpText);
    	pTabItem->ApplyAttributeList(strAttr);
    	pTabItem->SetParent(this);
    	if ( !Add(pTabItem) )
    	{
    		delete pTabItem;
    		return NULL;
    	}
    	if ( m_pTabItems.empty() )
    		m_nSelIndex = 0;
    	m_pTabItems.push_back(pTabItem);
    	if ( bReset )
    		ResetTabPos();
    	return pTabItem;
    }
    
    void CScrollTabUI::SelectItem( CControlUI* pItem )
    {
    	if ( m_nSelIndex>=0 && m_nSelIndex<m_pTabItems.size() )
    	{
    		CControlUI* pCurItem = m_pTabItems[m_nSelIndex];
    		if ( pCurItem )
    			pCurItem->SetBkColor(m_dwTabNorColor);
    	}
    	pItem->SetBkColor(m_dwTabSelColor);
    	int nUnSelIndex = m_nSelIndex;
    	m_nSelIndex = GetTabItemIndex(pItem);
    	if ( m_pCallback )
    		m_pCallback->OnScrollTabSelectChange(this, nUnSelIndex, m_nSelIndex);
    }
    
    void CScrollTabUI::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
    {
    	if ( wcscmp(pstrName, L"TabWidth") == 0 )
    	{
    		m_nNorWidth = _ttoi(pstrValue);
    		return ;
    	}
    	if ( wcscmp(pstrName, L"MinTabWidth") == 0 )
    	{
    		m_nMinWidth = _ttoi(pstrValue);
    		return ; 
    	}
    	if ( wcscmp(pstrName, L"TabSelColor") == 0 )
    	{
    		if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
    		LPTSTR pstr = NULL;
    		m_dwTabSelColor = _tcstoul(pstrValue, &pstr, 16);
    		return ; 
    	}
    	if ( wcscmp(pstrName, L"TabNorColor") == 0 )
    	{
    		if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
    		LPTSTR pstr = NULL;
    		m_dwTabNorColor = _tcstoul(pstrValue, &pstr, 16);
    		return ; 
    	}
    	CContainerUI::SetAttribute(pstrName, pstrValue);
    }
    
    void CScrollTabUI::Init()
    {
    	m_pBtnAdd = new CButtonUI;
    	CDuiString strAttr = L"float=\"true\" pos=\"0,0,0,0\" normalimage=\"file='tab_add.png' source='0,0,25,34' dest='0,0,25,30' \" \
    					hotimage=\"file='tab_add.png' source='25,0,50,34' dest='0,0,25,30' \" pushedimage=\"file='tab_add.png' source='50,0,75,34' dest='0,0,25,30' \" \
    					disabledimage=\"file='tab_add.png' source='75,0,100,34' dest='0,0,25,30' \" tooltip=\"新建\" ";
    	m_pBtnAdd->ApplyAttributeList(strAttr);
    	Add(m_pBtnAdd);
    	m_pBtnAdd->OnNotify += MakeDelegate(this, &CScrollTabUI::OnBtnClickAdd);
    }
    
    void CScrollTabUI::DeleteItem( CControlUI* pItem )
    {
    	int nDelIndex = GetTabItemIndex(pItem);
    	if ( nDelIndex == -1 )
    		return ;
    	DeleteItem(nDelIndex);
    }
    
    void CScrollTabUI::DeleteItem( const int nIndex )
    {
    	if ( nIndex<0 || nIndex>=m_pTabItems.size() )
    		return ;
    	Remove(m_pTabItems[nIndex]);
    	m_pTabItems.erase(m_pTabItems.begin()+nIndex);
    	int nCount = m_pTabItems.size();
    	if ( nCount>0 )
    	{
    		if ( nIndex<m_nSelIndex )
    			m_nSelIndex--;
    		else if ( nIndex == m_nSelIndex )
    		{
    			m_nSelIndex = nCount-1;
    			CControlUI* pItem = m_pTabItems[m_nSelIndex];
    			if ( pItem )
    				pItem->SetBkColor(m_dwTabSelColor);
    		}
    		ResetTabPos();
    	}
    	else
    		m_nSelIndex = -1;
    	if ( m_pCallback )
    		m_pCallback->OnScrollTabCloseItem(this, nIndex, m_nSelIndex);
    }
    
    void CScrollTabUI::ResetTabPos()
    {
    	int nCount = m_pTabItems.size();
    	if ( nCount == 0 )
    	{
    		RECT rcItem = {m_rcItem.left, m_rcItem.top, 25, m_rcItem.bottom};
    		m_pBtnAdd->SetPos(rcItem);
    		return ;
    	}
    	int nWidth = m_rcItem.right - m_rcItem.left-25;
    	int nHeight= m_rcItem.bottom - m_rcItem.top;
    	if ( nWidth/nCount < m_nMinWidth )
    		return ;
    	if ( nCount*m_nNorWidth <= nWidth )
    		m_nCurWidth = m_nNorWidth;
    	else
    		m_nCurWidth = nWidth/nCount;
    	RECT rcItem;
    	for( size_t i=0; i<m_pTabItems.size(); ++i )
    	{
    		rcItem.left	= m_nCurWidth*i + m_rcItem.left;
    		rcItem.top	= 0 + m_rcItem.top;
    		rcItem.right= rcItem.left + m_nCurWidth;
    		rcItem.bottom = rcItem.top + nHeight;
    		CControlUI* pItem = m_pTabItems[i];
    		pItem->SetPos(rcItem);
    		if ( m_nSelIndex == i )
    			pItem->SetBkColor(m_dwTabSelColor);
    		else
    			pItem->SetBkColor(m_dwTabNorColor);
    	}
    	rcItem.left = rcItem.right;
    	rcItem.right = rcItem.left + 25;
    	m_pBtnAdd->SetPos(rcItem);
    }
    
    void CScrollTabUI::SetItemText( const int nIndex, LPCTSTR lpText )
    {
    	int nCount = m_pTabItems.size();
    	if ( 0 == nCount || nCount <= nIndex )
    		return ;
    	CControlUI* pItem = m_pTabItems[nIndex];
    	if ( pItem )
    	{
    		pItem->SetText(lpText);
    		pItem->SetToolTip(lpText);
    	}
    }
    
    int CScrollTabUI::GetTabItemIndex( CControlUI* pItem )
    {
    	int nIndex = -1;
    	for ( size_t i=0; i<m_pTabItems.size(); ++i )
    	{
    		if ( m_pTabItems[i] == pItem )
    		{
    			nIndex = i;
    			break;
    		}
    	}
    	return nIndex;
    }
    
    bool CScrollTabUI::OnBtnClickAdd( void* pParam )
    {
    	TNotifyUI* pNotifyUI = (TNotifyUI*)pParam;
    	if(pNotifyUI->sType != DUI_MSGTYPE_CLICK) 
    		return true;
    	if ( m_pCallback )
    		m_pCallback->OnScrollTabAddItem(this);
    	return true;
    }
    
    void CScrollTabUI::SetPos( RECT rc )
    {
    	CContainerUI::SetPos(rc);
    	ResetTabPos();
    }
    
    void CScrollTabUI::OnOptionDbClick(CControlUI* pOption)
    {
    	if ( m_pCallback )
    		m_pCallback->OnScrollTabDbClick(this, m_nSelIndex);
    }
    

    子控件的消息都反射给父控件去处理,父控件同一管理所有子控件(计算宽度、设置选中、取消选中)。

     

     

     

    4、未完成的

     

    下载管理没做,应该对下载回调进行处理,用自己封装的下载库来处理进度,并加下载管理窗口;

    浏览记录,对用户输入网址进行匹配;

    收藏夹,导入其他浏览器的收藏夹;

    菜单项,各种设置。

     

     

     

     

     

    展开全文
  • 基于Chrome内核(WebKit.net)定制开发DoNet浏览器 原文:基于Chrome内核(WebKit.net)定制开发DoNet浏览器1. 源起 a) 定制.Net浏览器 本人是一名C#开发者,而作为C#开发者,做客户端应用中最头痛的...
  • C# 开发Chrome内核浏览器(WebKit.net)

    千次阅读 2020-08-13 17:21:37
    C# 开发Chrome内核浏览器(WebKit.net) WebKit.net是对WebKit的.Net封装,使用它.net程序可以非常方便的集成和使用webkit作为加载网页的容器。这里介绍一下怎么用它来显示一个网页这样的一个最简单的功能。 第一步...
  • chrome Frame:  让IE有一颗chrome的心,看起来不错,但我没有深入研究这个东西。 http://www.google.com/chromeframe?hl=zh-CN&quickenable=true ... 已经有一段时间没人更新这个开源项...
  • 针对PC 客户端软件而言,在实际开发中如图表等复杂控件如果纯用c++ 开发难度很大,而且效果也不是很美好,虽然也有一些专门开源图表库可以使用,但项目中软件开发都是C/S 和 B/S 结构,两者各有其优势。B/S结构需要...
  •  用到的所有技术都是开源的(在天朝基于什么开源协议就不要深究了) g) 调试JS更方便  采用谷歌浏览器的调试工具,跟firebug调试JS的方式相似 2.  把CEF配置并正确运行起来 a) 下载Cefglue框架。 点我...
  • Windows上使用CEF嵌入基于chrome内核浏览器小例

    万次阅读 多人点赞 2015-02-26 15:40:04
    浏览器代码已开源:欢迎收藏https://github.com/JelinYao/MyChrome CEF出来很久了,使用的也很广泛的,QQ里面很多地方都是嵌入的CEF浏览器(个人资料、微博、查找……),网上的资料也挺多的,大家可以搜搜看。 ...
  • 4月9日早间消息,微软今日正式开放了新Edge浏览器预览版的下载,最大的特点是基于Chrome浏览器的内核。去年底,微软宣布,Windows 10 Edge浏览器将很快从...
  • 极其容易混淆的几个概念,它们是WebKit和WebKit2,Chromium和Chrome, Blink。
  • 所以可以自己写一个浏览器,给自己的浏览器预留接口就可以对CHROME内核进行填表了(会开发才行啊- -!),不过这种可能就有局限性了,比如觉得其它浏览器功能比较齐全,并且是客户要求等,必须在特定浏览器执行,...
  • chrome浏览器内核WebKit

    2018-02-05 15:01:10
    WebKit 是一个开源的浏览器引擎,与之相对应的引擎有Gecko(Mozilla Firefox 等使用)和Trident(也称MSHTML,IE 使用)。
  • webbrowser支持的是IE内核,很多系统需要chorme的支持,于是在网上找方法 ,先找到了WebKit.NET这个控件,添加了进去,但是还是加载不出来阿里的控件,第一天就放弃了,今天闲来无事,想着再试试,继续百度一下,搜...
  • chrome插件和用户的几种交互方式 比较常见的插件形式是: 1.browser action:就是我们通常在浏览器右上角看到的一类插件,可以通过点击进行操作及使用。就如下图。 2.backgroud javascript:这一种运行方式是运行在...
  • Chrome使用的开源项目介绍

    万次阅读 2011-11-04 10:30:35
    在【关于 Google Chrome浏览器】窗口中,可以看到“Google Chrome 浏览器的诞生离不开 Chromium 开源项目以及其他开源软件”,究竟 Chrome 使用了哪些开源项目呢? 在 Chrome 地址栏输入 about:credits 就可以看到 ...
  • Chrome浏览器操作开源模块开源了,本人基于devtools protocol封装的,花费了不少时间,通讯协yi是websocket,里面用的websocket模块是在论坛找的某位大佬的改的。 附件包含源码、例子 电脑上必须装有Chrome浏览器 ,...
  • chrome开源浏览器下载

    2013-05-07 11:00:00
    Google Chrome Source Code 浏览器源码(下载) 发表于:Browser,Google Chrome,编程开发| 作者:谋万世全局者 标签:Chrome,Code,Google,Source,下载,浏览器,源码 偶近来想研究折腾一下Google Chrome浏览器...
  • Android 集成Chrome 浏览器内核 Crosswalk

    千次阅读 2020-02-21 15:19:28
    Crosswalk 内核的兴起与消亡 Android 4.4 版本之前,使用的是基于 androidWebKit 的 WebView 但实际上,由于 Android 的碎片化问题(大量存在不同的 Android 系统版本,并且各个厂商对内置应用进行定制化,有可能用...
  • Google Chrome内核引擎 WebKit 介绍

    千次阅读 2015-04-17 21:01:46
    Google 发布了其浏览器 Google Chrome。同时,Google 发布了一组漫画,用来解释为何推出 Google  ... Open Soure Project 内核引擎开发的:  QUOTE: We owe a great debt to many open source proj

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,273
精华内容 4,509
关键字:

chrome内核开源