スポンサーリンク

Win32APIでCEFのオフスクリーンレンダリング HTMLテキストを表示(CefSchemeHandlerFactory)

CefSchemeHandlerFactoryを継承して、CefRegisterSchemeHandlerFactoryでURLが与えられたときの処理を独自に実装して与えてやることで、自分で定義したHTMLテキストを与えられる。

static std::u8string GetAppHtml_Hello()
{
    return u8R"(
        <!doctype html>
        <html>
        <head><meta charset="utf-8"><title>Local HTML</title></head>
        <body style="background-color:#CCCCCC;">
            <h1>こんにちは</h1>
        </body>
        </html>
    )";
}
static std::u8string GetAppHtml_Img()
{
    return u8R"(
        <!doctype html>
        <html>
        <head><meta charset="utf-8"><title>Local HTML</title></head>
        <body style="background-color:#CCCCCC;">
            <img src="https://www.google.com/logos/doodles/2025/seasonal-holidays-2025-6753651837110711.2-law.gif" alt="My Image" />
        </body>
        </html>
    )";
}

// CefStreamResourceHandlerに必要
#include <include/wrapper/cef_stream_resource_handler.h>
 
class MySchemeHandlerFactory : public CefSchemeHandlerFactory
{
public:
    CefRefPtr<CefResourceHandler> Create(CefRefPtr<CefBrowser> browser,
        CefRefPtr<CefFrame> frame,
        const CefString& scheme_name,
        CefRefPtr<CefRequest> request) override
    {
        std::u8string myhtml;
        // URL に応じて返す内容を設定
        const std::string url = request->GetURL();
        if (url == "myapp://mylocalhtml/hello.html") {
            myhtml = GetAppHtml_Img();
        }
        else if (url == "myapp://mylocalhtml/img.html") {
            myhtml = GetAppHtml_Hello();
        }
        else {
            // その他の URL はデフォルトに任せる
            return nullptr;
        }

        // HTMLデータを CefStreamReader に変換
        CefRefPtr<CefStreamReader> stream =
            CefStreamReader::CreateForData(
                (void*)myhtml.data(), static_cast<size_t>(myhtml.size()));

        // mime_type を text/html にしてハンドラ作成
        return new CefStreamResourceHandler("text/html", stream);

    }

private:

    IMPLEMENT_REFCOUNTING(MySchemeHandlerFactory);
};

void SetHTML(CefRefPtr<CefBrowser> browser) {

    // 本来ならどこかで一回だけ登録すればよい
    CefRegisterSchemeHandlerFactory(
        "myapp", "mylocalhtml", new MySchemeHandlerFactory());

    CefRefPtr<CefFrame> frame = browser->GetMainFrame();

    static int count = 0;
    count++;
    if (count % 2 == 0) {
        frame->LoadURL(CefString("myapp://mylocalhtml/hello.html"));
    }
    else {
        frame->LoadURL(CefString("myapp://mylocalhtml/img.html"));
    }

    // 他のURLは通常動作
    //frame->LoadURL(CefString("https://www.suzulang.com/"));

}

コメントを残す

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

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


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