#include "StdAfx.h"
|
#include "SWebViewWnd.h"
|
|
#include "webview/Cef3GeometryUtil.h"
|
#include "SWebView.h"
|
#include "webview/Cef3WinUtil.h"
|
#include "webview/Cef3MainContext.h"
|
#include "webview/Cef3OsrImeHandlerWin.h"
|
|
namespace SOUI {
|
|
SWebViewWnd::SWebViewWnd(void)
|
{
|
webview_handler_ = NULL;
|
webview_handler_ = new browser::CCef3WebVWndHandler;
|
webview_handler_->AddRef();
|
|
}
|
|
|
SWebViewWnd::~SWebViewWnd(void)
|
{
|
if( webview_handler_ != NULL )
|
webview_handler_->Release();
|
}
|
|
int SWebViewWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
{
|
SetMsgHandled(FALSE);
|
|
return true;
|
}
|
|
BOOL SWebViewWnd::OnInitDialog(HWND wndFocus,LPARAM lInitParam)
|
{
|
SetMsgHandled(FALSE);
|
|
//ModifyStyle(0,WS_EX_TRANSPARENT);
|
//LoadURL(_T(""));
|
return 0;
|
}
|
|
BOOL SWebViewWnd::OnEraseBkgnd(HDC dc)
|
{
|
CRect rc;
|
GetClientRect(&rc);
|
if (webview_handler_ != NULL){
|
CefRefPtr<CefBrowser> browser = webview_handler_->GetBrowser();
|
if (browser){
|
CefWindowHandle hwnd = browser->GetHost()->GetWindowHandle();
|
::InvalidateRect(hwnd, rc, true);
|
//::MoveWindow(hwnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,true); // »áʹÆô¶¯³öÏÖºÜÂý
|
}
|
}
|
// Èô°¿ÚÒÆ¶¯ÉÏÃæ
|
//::PostMessage(m_hWnd,WM_SIZE,NULL,NULL);
|
return TRUE;
|
}
|
|
|
void SWebViewWnd::OnClose()
|
{
|
Close();
|
}
|
|
void SWebViewWnd::OnSize(UINT nType, CSize size)
|
{
|
CRect rc;
|
GetClientRect(&rc);
|
//ClientToScreen(&rc);
|
//ScreenToClient(&rc);
|
|
if (webview_handler_ != NULL ){
|
CefRefPtr<CefBrowser> browser = webview_handler_->GetBrowser();
|
if (browser){
|
|
CefWindowHandle hwnd = browser->GetHost()->GetWindowHandle();
|
//::SetWindowPos(hwnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_NOZORDER | SWP_NOACTIVATE);
|
//::SetWindowPos(m_hWnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_NOZORDER | SWP_NOACTIVATE);
|
::SetWindowPos(hwnd, NULL, 0, 0, size.cx, size.cy, SWP_NOZORDER | SWP_NOACTIVATE);
|
}//else{
|
// // ÐÞ¸´bugÓõÄ
|
// if( rc.Height() > 0 )
|
// LoadURL(m_strUrl);
|
//}
|
}
|
}
|
|
void SWebViewWnd::OnPaint(IRenderTarget *pRT)
|
{
|
SetMsgHandled(FALSE);
|
Invalidate();
|
/*CRect rc;
|
GetClientRect(&rc);
|
|
if (webview_handler_ != NULL) {
|
CefRefPtr<CefBrowser> browser = webview_handler_->GetBrowser();
|
if (browser){
|
CefWindowHandle hwnd = browser->GetHost()->GetWindowHandle();
|
::SetWindowPos(hwnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_NOZORDER | SWP_NOACTIVATE);
|
}
|
return;
|
} */
|
}
|
|
HWND SWebViewWnd::getWindowHandle()
|
{
|
return m_hWnd;
|
}
|
|
CefClient *SWebViewWnd::getClient()
|
{
|
return webview_handler_;
|
}
|
|
void SWebViewWnd::SetDevTools(bool devtools) {
|
browser::CCef3MainContext::Get()->SetDevToolsClient(this);
|
}
|
// ------------------------------------------------------------------------------
|
//
|
// methods for user
|
//
|
// ------------------------------------------------------------------------------
|
|
BOOL SWebViewWnd::LoadURL(const SStringT& url) {
|
if( !m_strUrl.IsEmpty() && url == m_strUrl )
|
{
|
return TRUE;
|
}
|
if (NULL == webview_handler_) {
|
return FALSE;
|
}
|
|
CefRefPtr<CefBrowser> pb = webview_handler_->GetBrowser();
|
if (pb.get()) {
|
if( url.IsEmpty() )
|
return FALSE;
|
m_strUrl = url;
|
|
CefRefPtr<CefFrame> frame = pb->GetMainFrame();
|
|
if (!frame)
|
return FALSE;
|
frame->LoadURL((LPCWSTR) url);
|
}else
|
{
|
m_strUrl = url;
|
Open(url);
|
}
|
return TRUE;
|
}
|
BOOL SWebViewWnd::LoadHtml(const SStringT& strHtml)
|
{
|
if( strHtml.IsEmpty() )
|
{
|
return FALSE;
|
}
|
if (NULL == webview_handler_) {
|
return FALSE;
|
}
|
CefRefPtr<CefBrowser> pb = webview_handler_->GetBrowser();
|
if (pb.get()) {
|
webview_handler_->LoadHtml((LPCWSTR)strHtml);
|
/*CefRefPtr<CefFrame> frame = pb->GetMainFrame();
|
if (!frame)
|
return FALSE; */
|
//SStringT strURL;
|
//strURL.Format(_T("_blank"));
|
//strURL.Format(_T("http:\\blank.%08x"),::GetTickCount());
|
//frame->LoadString((LPCWSTR)strHtml, (LPCWSTR)strURL);
|
//frame->LoadURL( (LPCWSTR)strURL);
|
}else
|
{
|
webview_handler_->LoadHtml((LPCWSTR)strHtml);
|
SStringT strURL;
|
strURL.Format(_T("_blank"));
|
//strURL.Format(_T("http:\\blank.%08x"),::GetTickCount());
|
//SStringT url = _T("_blank");
|
Open(strURL);
|
}
|
return TRUE;
|
}
|
SStringW SWebViewWnd::GetTitle() {
|
/*TCHAR czTitle[MAX_PATH] = {0};
|
::GetWindowText(m_hWnd,czTitle,MAX_PATH);
|
m_strTitle = czTitle;*/
|
return m_strTitle;
|
}
|
|
SStringW SWebViewWnd::GetURL() {
|
return m_strUrl;
|
}
|
|
void SWebViewWnd::ExecJavaScript(const SStringT& js) {
|
if (!webview_handler_) {
|
return;
|
}
|
|
CefRefPtr<CefBrowser> pb = webview_handler_->GetBrowser();
|
if (pb.get()) {
|
CefRefPtr<CefFrame> frame = pb->GetMainFrame();
|
if (frame) {
|
frame->ExecuteJavaScript((LPCWSTR) js, L"", 0);
|
}
|
}
|
}
|
|
BOOL SWebViewWnd::CanGoBack() {
|
if (!webview_handler_) {
|
return FALSE;
|
}
|
|
CefRefPtr<CefBrowser> pb = webview_handler_->GetBrowser();
|
if (pb.get()) {
|
return pb->CanGoBack();
|
}
|
|
return FALSE;
|
}
|
|
void SWebViewWnd::GoBack() {
|
if (!webview_handler_) {
|
return;
|
}
|
|
CefRefPtr<CefBrowser> pb = webview_handler_->GetBrowser();
|
if (pb.get()) {
|
return pb->GoBack();
|
}
|
}
|
|
BOOL SWebViewWnd::CanGoForward() {
|
if (!webview_handler_) {
|
return FALSE;
|
}
|
|
CefRefPtr<CefBrowser> pb = webview_handler_->GetBrowser();
|
if (pb.get()) {
|
return pb->CanGoForward();
|
}
|
|
return FALSE;
|
}
|
|
void SWebViewWnd::GoForward() {
|
if (!webview_handler_) {
|
return;
|
}
|
|
CefRefPtr<CefBrowser> pb = webview_handler_->GetBrowser();
|
if (pb.get()) {
|
return pb->GoForward();
|
}
|
}
|
|
BOOL SWebViewWnd::IsLoading() {
|
if (!webview_handler_) {
|
return FALSE;
|
}
|
|
CefRefPtr<CefBrowser> pb = webview_handler_->GetBrowser();
|
if (pb.get()) {
|
return pb->IsLoading();
|
}
|
|
return FALSE;
|
}
|
|
void SWebViewWnd::Reload() {
|
if (!webview_handler_) {
|
return;
|
}
|
|
CefRefPtr<CefBrowser> pb = webview_handler_->GetBrowser();
|
if (pb.get()) {
|
return pb->Reload();
|
}
|
}
|
|
void SWebViewWnd::StopLoad() {
|
if (!webview_handler_) {
|
return;
|
}
|
|
CefRefPtr<CefBrowser> pb = webview_handler_->GetBrowser();
|
if (pb.get()) {
|
return pb->StopLoad();
|
}
|
}
|
|
BOOL SWebViewWnd::Open(SStringT strUrl)
|
{
|
if( !::IsWindow(m_hWnd) )
|
{
|
return FALSE;
|
}
|
|
m_strUrl = strUrl;
|
CefString url = strUrl;
|
|
CRect rc;
|
GetClientRect(&rc);
|
//CRect rc;
|
//::GetWindowRect(GetParent(m_hWnd),&rc);
|
//ScreenToClient(&rc);
|
/*CString strTitle;
|
::GetWindowText(GetParent(m_hWnd),strTitle.GetBuffer(MAX_PATH),MAX_PATH);*/
|
|
CefRefPtr<CefBrowser> pb = webview_handler_->GetBrowser();
|
if (pb.get()) {
|
return TRUE;
|
}
|
|
if (!webview_handler_->Open(m_hWnd,url, rc)) {
|
return FALSE;
|
}
|
|
return TRUE;
|
}
|
|
void SWebViewWnd::Close() {
|
webview_handler_->CloseAllBrowsers(true);
|
/*webview_handler_->SetRender(NULL);
|
webview_handler_->UnRegisterMessgeHandler(this);*/
|
/*m_bBkgndDirty = TRUE;
|
m_pBitmapBuff = NULL;*/
|
}
|
|
void SWebViewWnd::GetWebViewSource(std::function<void(const CefString&)> &&callback) {
|
class Visitor : public CefStringVisitor {
|
public:
|
explicit Visitor(std::function<void(const CefString&)> &&cb)
|
: callback_(std::move(cb)) {
|
}
|
virtual void Visit(const CefString& strSource) OVERRIDE {
|
callback_(strSource);
|
}
|
|
private:
|
std::function<void(const CefString &)> callback_;
|
IMPLEMENT_REFCOUNTING(Visitor);
|
};
|
webview_handler_->GetBrowser()->GetMainFrame()->GetSource(new Visitor(std::move(callback)));
|
}
|
|
LRESULT SWebViewWnd::OnOpenFileDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL & bHandled)
|
{
|
std::vector<CefString> file_paths;
|
TCHAR szBuffer[MAX_PATH] = {0};
|
OPENFILENAME ofn= {0};
|
ofn.lStructSize = sizeof(ofn);
|
ofn.hwndOwner = m_hWnd;
|
ofn.lpstrFilter = _T("ËùÓÐÎļþ(*.*)\0*.*\0");//ҪѡÔñµÄÎļþºó׺
|
//ofn.lpstrInitialDir = _T("D:\\Program Files");//ĬÈϵÄÎļþ·¾¶
|
ofn.lpstrFile = szBuffer;//´æ·ÅÎļþµÄ»º³åÇø
|
ofn.nMaxFile = sizeof(szBuffer)/sizeof(*szBuffer);
|
ofn.nFilterIndex = 0;
|
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER ;//±êÖ¾Èç¹ûÊǶàѡҪ¼ÓÉÏOFN_ALLOWMULTISELECT
|
BOOL bSel = GetOpenFileName(&ofn);
|
|
if( bSel ){
|
file_paths.push_back(ofn.lpstrFile);
|
//callback->Continue(false,file_paths);
|
webview_handler_->m_pFileDialogCallback->Continue(false,file_paths);
|
}else{
|
webview_handler_->m_pFileDialogCallback->Continue(false,file_paths);
|
}
|
return false;
|
}
|
|
LRESULT SWebViewWnd::OnWebUrlDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL & bHandled)
|
{
|
if (webview_handler_ != NULL ){
|
std::wstring strPopupUrl = webview_handler_->GetPopupUrl();
|
|
EventPopupWebUrl *pEvt = new EventPopupWebUrl(NULL);
|
pEvt->m_strPopupWebUrl = strPopupUrl.c_str();
|
SNotifyCenter::getSingleton().FireEventAsync(pEvt);
|
pEvt->Release();
|
}
|
|
return TRUE;
|
}
|
|
|
void SWebViewWnd::ReDraw()
|
{
|
|
if (webview_handler_ != NULL ){
|
CefRefPtr<CefBrowser> browser = webview_handler_->GetBrowser();
|
if (browser == NULL){
|
SetTimer(WM_WEBSITE_SIZE,200);
|
}
|
}
|
|
}
|
|
void SWebViewWnd::OnTimer(UINT_PTR nIDEvent)
|
{
|
switch (nIDEvent)
|
{
|
case WM_WEBSITE_SIZE:
|
{
|
if (webview_handler_ != NULL ){
|
CefRefPtr<CefBrowser> browser = webview_handler_->GetBrowser();
|
if (browser){
|
KillTimer(WM_WEBSITE_SIZE);
|
|
CRect rc;
|
GetClientRect(&rc);
|
CefWindowHandle hwnd = browser->GetHost()->GetWindowHandle();
|
//::InvalidateRect(hwnd, rc, true);
|
//::SetWindowPos(hwnd, NULL, 0, 0, size.cx, size.cy, SWP_NOZORDER | SWP_NOACTIVATE);
|
::SetWindowPos(hwnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_NOZORDER | SWP_NOACTIVATE);
|
|
// ::PostMessage(hwnd,WM_SIZE,NULL,NULL);
|
/* CRect rc;
|
GetClientRect(&rc);
|
CefWindowHandle hwnd = browser->GetHost()->GetWindowHandle();
|
::InvalidateRect(hwnd, rc, true); */
|
}
|
}
|
|
}break;
|
default:
|
SetMsgHandled(FALSE);
|
break;
|
}
|
|
}
|
|
//void SWebViewWnd::SetInitRc( SOUI::CRect &rc )
|
//{
|
// //ScreenToClient(&rc);
|
// m_rc = rc;
|
//}
|
|
|
|
}
|