CEF不在c ++窗口中显示

时间:2013-10-28 00:26:06

标签: 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相关部分): 报头(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

1 个答案:

答案 0 :(得分:1)

你在三个地方创建了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();

就够了。

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