#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 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 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 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 pb = webview_handler_->GetBrowser(); if (pb.get()) { if( url.IsEmpty() ) return FALSE; m_strUrl = url; CefRefPtr 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 pb = webview_handler_->GetBrowser(); if (pb.get()) { webview_handler_->LoadHtml((LPCWSTR)strHtml); /*CefRefPtr 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 pb = webview_handler_->GetBrowser(); if (pb.get()) { CefRefPtr frame = pb->GetMainFrame(); if (frame) { frame->ExecuteJavaScript((LPCWSTR) js, L"", 0); } } } BOOL SWebViewWnd::CanGoBack() { if (!webview_handler_) { return FALSE; } CefRefPtr pb = webview_handler_->GetBrowser(); if (pb.get()) { return pb->CanGoBack(); } return FALSE; } void SWebViewWnd::GoBack() { if (!webview_handler_) { return; } CefRefPtr pb = webview_handler_->GetBrowser(); if (pb.get()) { return pb->GoBack(); } } BOOL SWebViewWnd::CanGoForward() { if (!webview_handler_) { return FALSE; } CefRefPtr pb = webview_handler_->GetBrowser(); if (pb.get()) { return pb->CanGoForward(); } return FALSE; } void SWebViewWnd::GoForward() { if (!webview_handler_) { return; } CefRefPtr pb = webview_handler_->GetBrowser(); if (pb.get()) { return pb->GoForward(); } } BOOL SWebViewWnd::IsLoading() { if (!webview_handler_) { return FALSE; } CefRefPtr pb = webview_handler_->GetBrowser(); if (pb.get()) { return pb->IsLoading(); } return FALSE; } void SWebViewWnd::Reload() { if (!webview_handler_) { return; } CefRefPtr pb = webview_handler_->GetBrowser(); if (pb.get()) { return pb->Reload(); } } void SWebViewWnd::StopLoad() { if (!webview_handler_) { return; } CefRefPtr 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 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 &&callback) { class Visitor : public CefStringVisitor { public: explicit Visitor(std::function &&cb) : callback_(std::move(cb)) { } virtual void Visit(const CefString& strSource) OVERRIDE { callback_(strSource); } private: std::function 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 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 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 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; //} }