[英]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.