1. 程式人生 > >分享個Duilib中基於wke的瀏覽器控制元件

分享個Duilib中基於wke的瀏覽器控制元件

概述

wke是基於谷歌chrome瀏覽器原始碼的裁剪版本,大小僅僅只有10M左右,無需依賴其他的擴充套件庫(跟CEF的一大堆大約40M的DLL來比簡直爽呆了),就可以在本地使用谷歌核心快速載入網頁。網上也有基於wke在Duilib 上擴充套件的控制元件程式碼,其實wke標頭檔案挺清楚的了,介面一目瞭然,特別是JS與C++互動的函式更是容易看懂,也沒什麼難的,你也可以做到的。

程式碼

畢竟是裁剪庫,有的功能還是沒有介面來處理的(比如網頁載入前、頁面跳轉、選單訊息……),標頭檔案程式碼:

  1. #ifndef __UIWKEWEBKIT_H_
  2. #define __UIWKEWEBKIT_H_
  3. #pragma once
  4. #include "wke.h"
  5. #include <string>
  6. using std::wstring;  
  7. namespace DuiLib  
  8. {  
  9.     ///////////////////////////////////////////
  10.     //網頁載入狀態改變的回撥
  11.     class CWkeWebkitLoadCallback  
  12.     {  
  13.     public:  
  14.         virtualvoid    OnLoadFailed()=0;  
  15.         virtualvoid    OnLoadComplete()=0;  
  16.         virtualvoid    OnDocumentReady()=0;  
  17.     };  
  18.     ///////////////////////////////////////////
  19.     //網頁標題、地址改變的回撥
  20.     class CWkeWebkitClientCallback  
  21.     {  
  22.     public:  
  23.         virtualvoid    OnTitleChange(const CDuiString& strTitle)=0;  
  24.         virtualvoid    OnUrlChange(const CDuiString& strUrl)=0;  
  25.     };  
  26.     class CWkeWebkitUI :  
  27.         public CControlUI,  
  28.         public wkeBufHandler  
  29.     {  
  30.     public:  
  31.         CWkeWebkitUI(void);  
  32.         ~CWkeWebkitUI(void);  
  33.         virtualvoid    onBufUpdated (constHDC hdc,int x, int y, int cx, int cy);  
  34.         virtualLPCTSTR GetClass()const;  
  35.         virtualLPVOID  GetInterface(LPCTSTR pstrName);  
  36.         virtualvoid    DoEvent(TEventUI& event);  
  37.         virtualvoid    DoPaint(HDC hDC, const RECT& rcPaint);  
  38.         virtualvoid    SetPos(RECT rc);  
  39.         virtualvoid    DoInit();  
  40.         virtualvoid    SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);  
  41.         //////////////////////////////////////
  42.         const   wstring& GetUrl()const ;  
  43.         bool    CanGoBack() const;  
  44.         bool    GoBack();  
  45.         bool    CanGoForward() const;  
  46.         bool    GoForward();  
  47.         void    StopLoad();  
  48.         void    Refresh();  
  49.         wkeWebView  GetWebView();  
  50.         void    SetLoadCallback(CWkeWebkitLoadCallback* pCallback);  
  51.         CWkeWebkitLoadCallback* GetLoadCallback();  
  52.         void    Navigate(LPCTSTR lpUrl);  
  53.         void    LoadFile(LPCTSTR lpFile);  
  54.         void    LoadHtml(LPCTSTR lpHtml);  
  55.     protected:  
  56.         void    StartCheckThread();  
  57.         void    StopCheckThread();  
  58.         staticvoid OnTitleChange(conststruct _wkeClientHandler* clientHandler, const wkeString title);  
  59.         staticvoid OnUrlChange(conststruct _wkeClientHandler* clientHandler, const wkeString url);  
  60.     private:  
  61.         staticint  m_bWebkitCount;  
  62.         HANDLE      m_hCheckThread;  
  63.         wstring     m_strUrl;  
  64.         wkeWebView  m_pWebView;  
  65.         wkeClientHandler    m_ClientHandler;  
  66.         CWkeWebkitLoadCallback*     m_pLoadCallback;  
  67.         CWkeWebkitClientCallback*   m_pClientCallback;  
  68.     };  
  69. }  
  70. #endif//__UIWKEWEBKIT_H_

實現部分程式碼:
  1. #include "StdAfx.h"
  2. #include "UIWkeWebkit.h"
  3. #pragma comment(lib, "DuiEx/wke/wke")
  4. namespace DuiLib{  
  5. ///////////////////////////////////////////////////
  6. //網頁載入狀態監測執行緒
  7. DWORD WINAPI CheckThreadFun(LPVOID lpParam)  
  8. {  
  9.     CWkeWebkitUI* pWebkitUI=(CWkeWebkitUI*)lpParam;  
  10.     wkeWebView  pWebView=pWebkitUI->GetWebView();  
  11.     if ( NULL == pWebView )  
  12.         return 1;  
  13.     CWkeWebkitLoadCallback* pCallback=pWebkitUI->GetLoadCallback();  
  14.     if ( NULL == pCallback )  
  15.         return 1;  
  16.     bool bOver=false;  
  17.     while( !pWebView->isLoaded() )  
  18.     {  
  19.         if ( !bOver && pWebView->isDocumentReady() )  
  20.         {  
  21.             pCallback->OnDocumentReady();  
  22.             bOver=true;  
  23.         }  
  24.         if ( pWebView->isLoadFailed() )  
  25.         {  
  26.             pCallback->OnLoadFailed();  
  27.             return 1;  
  28.         }  
  29.         ::Sleep(30);  
  30.     }  
  31. 相關推薦

    no