nim_duilib/ui_components/cef_control/control/cef_native_control.cpp
jiajia_deng 4933d1f2bc Remove dependency on shared
Signed-off-by: jiajia_deng <2894220@gmail.com>
2019-09-20 16:27:58 +08:00

176 lines
4.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdafx.h"
#include "cef_native_control.h"
#include "include/cef_browser.h"
#include "include/cef_frame.h"
#include "include/cef_runnable.h"
#include "cef_control/handler/browser_handler.h"
#include "cef_control/manager/cef_manager.h"
namespace ui
{
CefNativeControl::CefNativeControl(void)
{
}
CefNativeControl::~CefNativeControl(void)
{
if (browser_handler_.get() && browser_handler_->GetBrowser().get())
{
// Request that the main browser close.
browser_handler_->GetBrowserHost()->CloseBrowser(true);
browser_handler_->SetHostWindow(NULL);
browser_handler_->SetHandlerDelegate(NULL);
}
}
void CefNativeControl::Init()
{
if (browser_handler_.get() == nullptr)
{
LONG style = GetWindowLong(m_pWindow->GetHWND(), GWL_STYLE);
SetWindowLong(m_pWindow->GetHWND(), GWL_STYLE, style | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
ASSERT((GetWindowExStyle(m_pWindow->GetHWND()) & WS_EX_LAYERED) == 0 && L"无法在分层窗口内使用本控件");
browser_handler_ = new nim_cef::BrowserHandler;
browser_handler_->SetHostWindow(m_pWindow->GetHWND());
browser_handler_->SetHandlerDelegate(this);
ReCreateBrowser();
}
if (!js_bridge_.get())
{
js_bridge_.reset(new nim_cef::CefJSBridge);
}
__super::Init();
}
void CefNativeControl::ReCreateBrowser()
{
if (browser_handler_->GetBrowser() == nullptr)
{
// 使用有窗模式
CefWindowInfo window_info;
window_info.SetAsChild(this->m_pWindow->GetHWND(), m_rcItem);
CefBrowserSettings browser_settings;
CefBrowserHost::CreateBrowser(window_info, browser_handler_, L"", browser_settings, NULL);
}
}
void CefNativeControl::SetPos(UiRect rc)
{
__super::SetPos(rc);
HWND hwnd = GetCefHandle();
if (hwnd)
{
SetWindowPos(hwnd, HWND_TOP, rc.left, rc.top, rc.GetWidth(), rc.GetHeight(), SWP_NOZORDER);
}
}
void CefNativeControl::HandleMessage(EventArgs& event)
{
if (browser_handler_.get() && browser_handler_->GetBrowser().get() == NULL)
return __super::HandleMessage(event);
else if (event.Type == kEventInternalSetFocus)
{
browser_handler_->GetBrowserHost()->SetFocus(true);
}
else if (event.Type == kEventInternalKillFocus)
{
browser_handler_->GetBrowserHost()->SetFocus(false);
}
__super::HandleMessage(event);
}
void CefNativeControl::SetVisible(bool bVisible /*= true*/)
{
__super::SetVisible(bVisible);
HWND hwnd = GetCefHandle();
if (hwnd)
{
if (bVisible)
{
ShowWindow(hwnd, SW_SHOW);
}
else
{
SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
}
}
}
void CefNativeControl::SetInternVisible(bool bVisible)
{
__super::SetInternVisible(bVisible);
HWND hwnd = GetCefHandle();
if (hwnd)
{
if (bVisible)
{
ShowWindow(hwnd, SW_SHOW);
}
else
{
SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
}
}
}
void CefNativeControl::SetWindow(ui::Window* pManager, ui::Box* pParent, bool bInit)
{
if (browser_handler_)
browser_handler_->SetHostWindow(pManager->GetHWND());
// 设置Cef窗口句柄为新的主窗口的子窗口
auto hwnd = GetCefHandle();
if (hwnd)
SetParent(hwnd, pManager->GetHWND());
// 为新的主窗口重新设置WS_CLIPSIBLINGS、WS_CLIPCHILDREN样式否则Cef窗口刷新会出问题
LONG style = GetWindowLong(pManager->GetHWND(), GWL_STYLE);
SetWindowLong(pManager->GetHWND(), GWL_STYLE, style | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
__super::SetWindow(pManager, pParent, bInit);
}
bool CefNativeControl::AttachDevTools(Control* /*view*/)
{
if (devtool_attached_)
return true;
auto browser = browser_handler_->GetBrowser();
if (browser == nullptr)
{
auto task = ToWeakCallback([this]()
{
nbase::ThreadManager::PostTask(kThreadMain, ToWeakCallback([this](){
AttachDevTools(nullptr);
}));
});
browser_handler_->AddAfterCreateTask(task);
}
else
{
CefWindowInfo windowInfo;
windowInfo.SetAsPopup(NULL, L"cef_devtools");
CefBrowserSettings settings;
windowInfo.width = 900;
windowInfo.height = 700;
browser->GetHost()->ShowDevTools(windowInfo, new nim_cef::BrowserHandler, settings, CefPoint());
devtool_attached_ = true;
if (cb_devtool_visible_change_ != nullptr)
cb_devtool_visible_change_(devtool_attached_);
}
return true;
}
}