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. 相關推薦

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

    概述 wke是基於谷歌chrome瀏覽器原始碼的裁剪版本,大小僅僅只有10M左右,無需依賴其他的擴充套件庫(跟CEF的一大堆大約40M的DLL來比簡直爽呆了),就可以在本地使用谷歌核心快速載入網頁。網上也有基於wke在Duilib 上擴充套件的控制元件程式碼,其

    基於wke封裝的duilib的webkit瀏覽器控制元件,可以c++與js互交,原始碼及demo下載地址

    轉載請說明原出處,謝謝~~        前些日子用wke核心封裝了duilib的webkit瀏覽器控制元件,好多群裡朋友私聊我希望可以我公佈原始碼,今天把這個控制元件的原始碼和使用demo公佈。其實這個控制元件封裝起來沒什麼難度,我只是按照原來作者的demo,把相應的訊息

    duilib中將xml封裝為控制元件簡單示例(簡單自定義控制元件,封裝幾基本控制元件合為1自定義控制元件)

    使用duilib的時候,難免會有這樣的需求: 某一塊Container(Layout)以及裡面的佈局需要重複用,不想每次都複製貼上這麼多,要不然xml太大了; 通過繼承來自定義一個控制元件,比如CButtonUIEx之類的,想讓他像button一樣在xml中被識別; xml裡面的東西

    WPF使用瀏覽器控制元件WebBrowser

    設定使用IE的版本 public static class Extensions { #region 設定WebBroswer 使用IE版本 public static void SetWebBrowserFeatures(int i

    duilib Webkit核心dui化瀏覽器控制元件

    改進: 1、跟其他duilib控制元件一樣,不包含視窗 2、將onURLChanged和onTitleChanged傳送到到Notify裡處理 效果: 不足的地方: 1、改變大小時會閃屏(等大神來改進) 2、contextMenuEv

    儲存瀏覽器控制元件的網頁

    如果需要呼叫預設的儲存對話方塊,可以呼叫IDM_SAVE命令儲存網頁 。由於安全原因,這個命令會總是顯示一個檔案儲存對話方塊,呼叫命令的時候指定OLECMDEXECOPT_DONTPROMPTUSER時也不例外。這也意味著IDM_SAVE的文件中的描述是錯誤的。注意儲存為mh

    分享我們專案基於EF事務機制的架構

    寫在前面: 1. 本文中單元測試用到的資料庫,在執行測試之前,會被清空,即使用空資料庫。 2. 本文中的單元測試都是正確通過的。 要理解EF的事務機制,首先要理解這2個類:TransactionScope和DbContext。 DbContext是我們的資料庫,通常我們會建一個類MyProjectDb

    Winform呼叫WebKitBrowser,基於chrome核心WebKit的瀏覽器控制元件

    在C#中,預設的WebBrowser控制元件預設使用的是IE的core,而IE的種種遭人吐槽的詬病使我不敢輕易使用WebBrowser,因此,打算使用Chrome的核心替換IE。Chrome的核心使用的是WebKit,顯而易見,我們這裡就將使用WebKit來實現Winfo

    WindowsXamlHost:在 WPF 使用 UWP 的控制元件(Windows Community Toolkit)

    原文 WindowsXamlHost:在 WPF 中使用 UWP 的控制元件(Windows Community Toolkit) Windows Community Toolkit 再次更新到 5.0。以前可以在 WPF 中使用有限的 UWP 控制元件,而現在有了 WindowsXamlHost,則可以使

    React-Native開發常用的第三方控制元件持續更新

    筆者簡書:https://www.jianshu.com/u/8ba7c349861d, 歡迎大家關注 2018.8.23更新: 動態修改Android的softmodule: react-native-android-keyboard-adjust    

    分享一個Winform下的分頁控制元件

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    把WebBrowser瀏覽器控制元件添加當前控制元件並註冊js方法呼叫C#程式碼

    1 把WebBrowser瀏覽器外掛新增到當前控制元件集 string url = "a.html"; webBrowser = new ChromiumWebBrowser(url); webBrowser.Dock =

    Android工程師開發iOS之與Android對應功能的控制元件

    iOS中和安卓控制元件應用還是差不的,從控制元件的命名上我們就能看出來,下面來介紹一下吧: ios中UILabel 對應Android 中TextView ios中UIImage對應Android 中ImageView 圖片控制元件 ios中UIButton對應An

    VS程式設計,編輯WPF過程,點選設計器介面某一控制元件,在XAML中高亮突出顯示相應的控制元件程式碼的設定方法。

    在編輯製件WPF過程中,當介面中控制元件較多時,可通過點選設計器中具體的控制元件,從而中在xaml程式碼視窗中快速跳轉到對應的部分。為了突出顯示該部分控制元件程式碼的名稱,方便視覺上直觀的觀察到被選中的控制元件對應的XAML程式碼,可以在VS中設定:選中控制元件後,高亮顯示對應的XAML

    VS程式設計,WPF,通過telerik控制元件建立顏色選擇器,顏色拾取器,調色盤的一種方法

     這裡展示使用telerik控制元件時,呼叫顏色調色盤,顏色選擇器,顏色拾取器的一種方法 1、增加引用 2、前臺定義引用 xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"

    一起Talk Android吧(第一百回:Android使用自定義控制元件

    各位看官們,大家好,上一回中咱們說的是Android中使用自定義佈局的例子,這一回說的例子是Android中使用自定義控制元件。閒話休提,言歸正轉。讓我們一起Talk Android吧! 看官們,我們在上一回中通過自定義佈局巧妙地實現了分隔線,不過這個分隔線中看

    CefSharp.v49.0.1瀏覽器控制元件完全WPF版,實現禁止彈出新視窗,在同一視窗開啟連結,並且支援帶type="POST" target="_blank"的連結

        需求場景:在查詢頁面,填寫查詢條件,查詢條件包括上傳的圖片,根據圖片的特徵查詢,這就需要在提交的時候,使用POST提交,因為GET提交無法提交圖片資料,提交查詢條件之後,在新的視窗展示查詢結果。(當然查詢結果頁面可能不支援F5重新整理頁面) 表單HTML程式碼示意(注意metho

    opencv筆記(三十五)——MFC如何重新整理static控制元件

    在MFC中用快取技術進行繪圖完全可以做到不閃爍,下面是在對話方塊應用程式OnPaint函式else分支中的程式碼,顯示一行文字,僅用來測試: CWnd * pWndShow; CDC * pDCShow; pWndShow = GetDlgItem(IDC_STC_DRA

    jQuerytoggle()函式的應用總結(包含今天專案碰到的前端控制元件

           本人是一名後臺開發人員,然而公司專案沒有做到前後端分離,前端僅僅是寫靜態頁面,js還得後臺開發人員寫。對於前端的東西呢常見東西的是沒有問題,但是有些東西用的少可能容易忘記。這不今天接手維護另一個同事的一個模組就被安排了。有問題怎麼辦?W3s!jquery語法上的

    QT的UI介面控制元件隨視窗自適應變化大小

    QT5中的UI介面 控制元件隨視窗自適應變化大小 點選UI介面檔案控制元件間的空白區域,然後選擇工具中的柵格佈局(網格佈局),點選後,它會自動調整你的控制元件大小,預設將你的widget的框長