背景
库迁移
在工程目录下创建Plugins(P大小写无所谓)文件夹,拷贝DBBrowser文件夹到plugins目录下
基本结构如下:
版本提示出错
解决方案
打开Plugins\DBBrowser\DBBrowser.uplugin
修改"EngineVersion": "5.0.0"为"EngineVersion": "5.1"
保存退出
游戏源码编译出错
错误(活动) E0322 不允许使用抽象类类型 "FCEFInterfaceBrowserClosureTask" 的对象: ZhongHuaHuaFei E:\dsh\testvs\Plugins\DBBrowser\Source\WebBrowserUI\Private\CEF\CEFWebInterfaceBrowserWindow.cpp 1596
错误(活动) E0065 应输入“;” ZhongHuaHuaFei E:\dsh\testvs\Plugins\DBBrowser\Source\WebBrowserUI\Private\CEF\CEFWebInterfaceBrowserWindow.cpp 256
错误(活动) E0322 不允许使用抽象类类型 "<unnamed>::FWebInterfaceBrowserClosureVisitor" 的对象: ZhongHuaHuaFei E:\dsh\testvs\Plugins\DBBrowser\Source\WebBrowserUI\Private\CEF\CEFWebInterfaceBrowserWindow.cpp 660
错误(活动) E0322 不允许使用抽象类类型 "FCEFInterfaceBrowserClosureTask" 的对象: ZhongHuaHuaFei E:\dsh\testvs\Plugins\DBBrowser\Source\WebBrowserUI\Private\CEF\CEFWebInterfaceBrowserWindow.cpp 2324
无法识别宏定义IMPLEMENT_REFCOUNTING
不影响编译运行DebugGame
调用
如果需要跳转页面,要响应OnBeforePopup事件,拿到URL直接加载即可跳转
最终效果
创建
void UDBBrowserUI::LoadURL(const FString& URL)
{
#if !UE_SERVER
if (WebInterfaceWidget.IsValid())
WebInterfaceWidget->LoadURL(URL);
#endif
}
void SWebInterfaceBrowserView::LoadURL(FString NewURL)
{
AddressBarUrl = FText::FromString(NewURL);
if (BrowserWindow.IsValid())
{
BrowserWindow->LoadURL(NewURL);
}
}
void FCEFWebInterfaceBrowserWindow::LoadURL(FString NewURL)
{
RequestNavigationInternal(NewURL, FString());
}
销毁
SDBBrowserUI::~SDBBrowserUI()
{
#if UE_BUILD_DEVELOPMENT || UE_BUILD_DEBUG
for (TPair<TWeakPtr<IWebInterfaceBrowserWindow>, TWeakPtr<SWindow>> Temp : BrowserWindowWidgets)
{
if (Temp.Key.IsValid())
{
TSharedPtr<IWebInterfaceBrowserWindow> WebBrowserWindow = Temp.Key.Pin();
if (WebBrowserWindow.IsValid())
WebBrowserWindow->CloseBrowser(false);
}
if (Temp.Value.IsValid())
{
TSharedPtr<SWindow> Window = Temp.Value.Pin();
if (Window.IsValid())
Window->RequestDestroyWindow();
}
}
#endif
}
SWebInterfaceBrowserView::~SWebInterfaceBrowserView()
{
if (BrowserWindow.IsValid())
{
BrowserWindow->OnDocumentStateChanged().RemoveAll(this);
BrowserWindow->OnNeedsRedraw().RemoveAll(this);
BrowserWindow->OnTitleChanged().RemoveAll(this);
BrowserWindow->OnUrlChanged().RemoveAll(this);
BrowserWindow->OnToolTip().RemoveAll(this);
BrowserWindow->OnShowPopup().RemoveAll(this);
BrowserWindow->OnDismissPopup().RemoveAll(this);
BrowserWindow->OnShowDialog().Unbind();
BrowserWindow->OnDismissAllDialogs().Unbind();
BrowserWindow->OnCreateWindow().Unbind();
BrowserWindow->OnCloseWindow().Unbind();
if (BrowserWindow->OnBeforeBrowse().IsBoundToObject(this))
{
BrowserWindow->OnBeforeBrowse().Unbind();
}
if (BrowserWindow->OnLoadUrl().IsBoundToObject(this))
{
BrowserWindow->OnLoadUrl().Unbind();
}
if (BrowserWindow->OnBeforePopup().IsBoundToObject(this))
{
BrowserWindow->OnBeforePopup().Unbind();
}
}
TSharedPtr<SWindow> SlateParentWindow = SlateParentWindowPtr.Pin();
if (SlateParentWindow.IsValid())
{
SlateParentWindow->GetOnWindowDeactivatedEvent().RemoveAll(this);
}
if (SlateParentWindow.IsValid())
{
SlateParentWindow->GetOnWindowActivatedEvent().RemoveAll(this);
}
}
FCEFWebInterfaceBrowserWindow::~FCEFWebInterfaceBrowserWindow()
{
WebBrowserHandler->OnCreateWindow().Unbind();
WebBrowserHandler->OnBeforePopup().Unbind();
WebBrowserHandler->OnBeforeResourceLoad().Unbind();
WebBrowserHandler->OnResourceLoadComplete().Unbind();
WebBrowserHandler->OnConsoleMessage().Unbind();
CloseBrowser(true);
ReleaseTextures();
BufferedVideo.Reset();
}
IWebInterfaceBrowserSingleton* Singleton = IWebInterfaceBrowserModule::Get().GetSingleton();
if (Singleton)
{
#if WITH_CEF3
if (!bPAK)
bPAK = Singleton->RegisterSchemeHandlerFactory("pak", FString(), new FWebInterfaceSchemeHandlerFactory());
#endif
Singleton->SetDevToolsShortcutEnabled(Settings.bShowErrorMessage);
BrowserWindow = Singleton->CreateBrowserWindow(Settings);
}
// Create the CEF browser window.
CefRefPtr<CefBrowser> Browser = CefBrowserHost::CreateBrowserSync(WindowInfo, NewHandler.get(), TCHAR_TO_WCHAR(*WindowSettings.InitialURL), BrowserSettings,nullptr, RequestContext);
if (Browser.get())
{
// Create new window
TSharedPtr<FCEFWebInterfaceBrowserWindow> NewBrowserWindow = MakeShareable(new FCEFWebInterfaceBrowserWindow(
Browser,
NewHandler,
WindowSettings.InitialURL,
WindowSettings.ZoomLevel,
WindowSettings.ContentsToLoad,
WindowSettings.bShowErrorMessage,
WindowSettings.bThumbMouseButtonNavigation,
WindowSettings.bUseTransparency,
WindowSettings.bUseNativeCursors,
bJSBindingsToLoweringEnabled));
NewHandler->SetBrowserWindow(NewBrowserWindow);
{
FScopeLock Lock(&WindowInterfacesCS);
WindowInterfaces.Add(NewBrowserWindow);
}
return NewBrowserWindow;
}