簡體   English   中英

CEF不顯示在C ++窗口中

[英]CEF not displaying in c++ window

我正在winapi中顯示cef瀏覽器的窗口上工作。 我的代碼編譯沒有錯誤,也沒有遇到任何運行時錯誤,但是當我的窗口顯示時,我的cef網頁卻沒有(我的窗口完全空白)。 我花了大約6個小時來解決這個問題,但仍然沒有任何工作。

我的窗口與主函數位於不同的類中,我認為這可能是導致問題的原因,因為我的g_handler可能無法正確傳遞。

謝謝你的幫助!

我剝離了示例的所有Windows api代碼(因為它一直運行良好),以使代碼示例簡短。

這是我的代碼:

溫曼:

#include "trackboxWrapper.h"
#include <stdexcept>
#include <thread>
#include "include\cef_app.h"

CefRefPtr<trackboxCefHandler> g_handler;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    try
    {
        CefMainArgs main_args(hInstance);
        int exitCode = CefExecuteProcess(main_args, NULL);
        if (exitCode >= 0) {
            return exitCode;
        }

        CefSettings settings;
        CefRefPtr<CefApp> cefApplication;
        CefInitialize(main_args, settings, cefApplication);

        trackboxWrapper window(g_handler);

        CefRunMessageLoop();
    CefShutdown();
    }
    catch (std::exception& e)
    {
        MessageBoxA(0, (std::string("Trackox Internal Error \n\n") + e.what()).c_str(), "=(", 0);
    }
    }

trackboxWrapper(僅顯示cef相關部分):header(trackboxWrapper.h):

[code]#include <windows.h>

#include "include\cef_app.h"
#include "include\cef_base.h"
#include "include\cef_browser.h"
#include "include\cef_client.h"

class trackboxWrapper
{
public:
CefRefPtr<trackboxCefHandler> & g_handler;

trackboxWrapper(CefRefPtr<trackboxCefHandler> g_handler_pointer);
~trackboxWrapper();
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
}

cpp(trakcboxWrapper.cpp):

trackboxWrapper::trackboxWrapper(CefRefPtr<trackboxCefHandler> g_handler_pointer) : g_handler(g_handler_pointer) {}

LRESULT CALLBACK trackboxWrapper::WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    trackboxWrapper *window = reinterpret_cast<trackboxWrapper*>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
    if (!window) return DefWindowProc(hwnd, msg, wparam, lparam);

    switch (msg)
    {
    case WM_CREATE:
        {
            window->g_handler = new trackboxCefHandler();
            RECT trackboxCefRect;
            GetClientRect(hwnd, &trackboxCefRect);
            CefWindowInfo info;
            CefBrowserSettings settings;
            info.SetAsChild(hwnd, trackboxCefRect);
            CefBrowserHost::CreateBrowser(info, window->g_handler.get(), L"http://www.google.com", settings);

                  }
}

trackboxCefHandler.h:

#ifndef TRACKBOXCEFHANDLER_H_
#define TRACKBOXCEFHANDLER_H_

#include "include/cef_client.h"

class trackboxCefHandler : public CefClient {

public:
    trackboxCefHandler() {}
    ~trackboxCefHandler() {}

    IMPLEMENT_REFCOUNTING(trackboxCefHandler);
    IMPLEMENT_LOCKING(trackboxCefHandler);
};

#endif

您在三個地方創建g_handler,這可能是您的問題。

一個文件位於Winmain文件中(聲明此變量的第一個代碼段)。

CefRefPtr<trackboxCefHandler> g_handler;

另一個在trackboxWrapper.h中。

class trackboxWrapper
{
public:
CefRefPtr<trackboxCefHandler> g_handler;
....

第三個是在trackboxWrapper.cpp中:

case WM_CREATE:
    {
        CefRefPtr<trackboxCefHandler> g_handler = new trackboxCefHandler();

這是三個不同的變量,因為它們在每個位置都已完全聲明,因此它們也相互影射(盡管頭文件中的一個已使用構造函數中的參數初始化,剩下兩個)。

您絕對不需要在第三個代碼段中創建它,因為您已經在標頭中聲明了g_handler:

case WM_CREATE:
    {
        window->g_handler = new trackboxCefHandler();

足夠了。

這樣,您到處都應該有相同的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM