スポンサーリンク

CEFをwxWidgetsのウィンドウに貼り付ける

CEFをwxWidgetsの上に貼り付けてみる。注意点として、配布されたdllではdebugモードで実行できないらしい。必ずReleaseモードで実行する。

#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif

#include <wx/gdicmn.h> // wxPointに必要
#include <wx/frame.h>  // wxFrameに必要

#include <include/cef_app.h>


#pragma comment(lib, "D:\\cmmon\\cef_binary_138.0.15+gd0f1f64+chromium-138.0.7204.50_windows64\\Release\\libcef.lib")
#pragma comment(lib, "D:\\cmmon\\MD\\Release\\libcef_dll_wrapper.lib")



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

#include <string>

class MyHandler : public CefClient, public CefLifeSpanHandler {
public:
  MyHandler() {}

  CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() override {
    return this;
  }

  void OnAfterCreated(CefRefPtr<CefBrowser> browser) override {
    m_Browser = browser;
  }

  void OnBeforeClose(CefRefPtr<CefBrowser> browser) override {
    m_Browser = nullptr;
  }

  void CloseAllBrowsers(bool force_close) {
    if (m_Browser) {
      m_Browser->GetHost()->CloseBrowser(force_close);
    }
  }

  IMPLEMENT_REFCOUNTING(MyHandler);

private:
  CefRefPtr<CefBrowser> m_Browser;
};

// ウィンドウ作成
class MyFrame : public wxFrame
{
  CefRefPtr<MyHandler> g_handler;
public:

    void PostCreate() {

      g_handler = CefRefPtr<MyHandler>(new MyHandler);

      CefBrowserSettings browser_settings;

      CefWindowInfo window_info;
      CefRect cefRect(
        0,
        0,
        400,
        400);

      HWND hwnd = (HWND)this->GetHandle();
      window_info.SetAsChild(hwnd, cefRect);

      CefBrowserHost::CreateBrowser(
        window_info,
        g_handler,
        "https://www.google.com",
        browser_settings,
        nullptr,
        nullptr);
      this->Layout(); // レイアウトの更新
    }

  void OnClose(wxCloseEvent& event) {

    // CEFのブラウザを閉じる
    g_handler->CloseAllBrowsers(true);
    event.Skip(); // デフォルトの処理を実行
  }


    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
        : wxFrame(NULL, wxID_ANY, title, pos, size)
    
    {
      // CallAfter : 現在処理中のイベントが終わったらPostCreateを実行
      // コンストラクタはウィンドウ生成イベント扱い
      CallAfter(&MyFrame::PostCreate);

    }


private:
};

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

// wxWidgetsのアプリケーション作成
class MyApp : public wxApp {
public:

    virtual bool OnInit() {

        HINSTANCE hInstance = ::GetModuleHandle(NULL);
        CefMainArgs main_args(hInstance);
        int exit_code = CefExecuteProcess(main_args, nullptr, nullptr);
        if (exit_code >= 0) 
          return false;

        // CEFの設定
        CefSettings settings;
        settings.no_sandbox = true;

        // マルチスレッドメッセージループを有効にする
        settings.multi_threaded_message_loop = true; 

        CefInitialize(main_args, settings, nullptr, nullptr);
        ///////////////////////////////////////////////////

        MyFrame* frame = new MyFrame("Hello World", wxPoint(50, 50), wxSize(450, 340));
        frame->Show(true);

        return true;
    }

    virtual int OnExit() {
        // CEFのシャットダウン
        CefShutdown();
       return wxApp::OnExit();
    }

};

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

// WinMainをマクロで定義
wxIMPLEMENT_APP(MyApp);

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: