c++ - CEF 不显示在 C++ 窗口中

标签 c++ chromium-embedded

我正在 winapi 中显示 cef 浏览器的窗口上工作。我的代码编译没有错误,也没有遇到任何运行时错误,但是当我的窗口显示时,我的 cef 网页没有显示(我的窗口完全空白)。我已经花了大约 6 个小时来解决这个问题,但仍然没有任何工作要做。

我的窗口与我的主要功能在一个单独的类中,我认为这可能是我的问题的原因,因为我的 g_handler 可能没有被正确传递。

感谢您的帮助!

我删除了示例的所有 Windows API 代码(因为它一直运行良好)以保持代码示例简短。

这是我的代码:

Winmain:

#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();

这是三个不同的变量,因为它们在每个地方都被完全声明,所以它们也相互影响(尽管头文件中的一个在构造函数中用参数初始化,剩下两个)。

您绝对不需要在第三个代码段中创建它,因为您已经在 header 中声明了 g_handler:

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

就够了。

这样你应该到处都有相同的对象。

关于c++ - CEF 不显示在 C++ 窗口中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19625412/

相关文章:

c++ - boost::spirit::qi matches[] 麻烦

javascript - 使用 HTML5、CSS、Node.js、Chromium 嵌入式浏览器的 LOB 桌面应用程序

html - 如何刷新 CEF 窗口?

c++ - 在 MFC dll 中使用 cef

java - JCEF 与 JavaFX fatal error

c++ - 用户定义的 std 类型推导指南

c++ - 将指针类型转换为 uint64_t 时,通过 uintptr_t 是否带来任何安全性?

c++ - QML 中的类型化数组? QByteArray 到 JS Uint8Array 来回互操作

c++ - 类继承 C++

WPF : download files through CefSharp