我在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
答案 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();
就够了。
那样你到处都应该拥有相同的对象。