Cef3WebView.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893
  1. #include "stdafx.h"
  2. #include "souistd.h"
  3. #include "Cef3WebView.h"
  4. #include "CefClientApp.h"
  5. #include "cefclient_osr_dragdrop_win.h"
  6. #include "CefUtil.h"
  7. #include "ExtendEvents.h"
  8. namespace SOUI
  9. {
  10. #define CHECK_CEF_BROWSER_HOST \
  11. if ( !m_pBrowserHandler ) return; \
  12. CefRefPtr<CefBrowser> pb = m_pBrowserHandler->GetBrowser(); \
  13. if ( !pb.get() ) return;\
  14. CefRefPtr<CefBrowserHost> host = pb->GetHost(); \
  15. if (!host) return
  16. SCefWebView::SCefWebView(void) : m_bSkipCursor(FALSE)
  17. , m_bInternalPaint( FALSE)
  18. , m_bBkgndDirty( TRUE)
  19. {
  20. m_evtSet.addEvent(EVENTID(EventWebViewNotify));
  21. m_bDrawFocusRect = FALSE;
  22. m_pBrowserHandler = new BrowserHandler;
  23. m_pBrowserHandler->AddRef();
  24. m_bFocusable = TRUE;
  25. }
  26. SCefWebView::~SCefWebView(void)
  27. {
  28. m_pBrowserHandler->Release();
  29. //m_pBrowser=NULL;
  30. }
  31. // ------------------------------------------------------------------------------
  32. //
  33. // methods for user
  34. //
  35. // ------------------------------------------------------------------------------
  36. BOOL SCefWebView::LoadURL(const SStringW& url)
  37. {
  38. if (!m_pBrowserHandler)
  39. {
  40. return FALSE;
  41. }
  42. CefRefPtr<CefBrowser> pb = m_pBrowserHandler->GetBrowser();
  43. if ( pb.get() )
  44. {
  45. CefRefPtr<CefFrame> frame = pb->GetMainFrame();
  46. if (!frame)
  47. return FALSE;
  48. m_strUrl = url;
  49. frame->LoadURL((LPCWSTR)url);
  50. }
  51. else
  52. {
  53. return FALSE;
  54. }
  55. return TRUE;
  56. }
  57. SStringW SCefWebView::GetTitle()
  58. {
  59. return m_strTitle;
  60. }
  61. void SCefWebView::ExecJavaScript(const SStringW& js)
  62. {
  63. if (!m_pBrowserHandler)
  64. {
  65. return;
  66. }
  67. CefRefPtr<CefBrowser> pb = m_pBrowserHandler->GetBrowser();
  68. if ( pb.get() )
  69. {
  70. CefRefPtr<CefFrame> frame = pb->GetMainFrame();
  71. if ( frame )
  72. {
  73. frame->ExecuteJavaScript((LPCWSTR)js, L"", 0);
  74. }
  75. }
  76. }
  77. BOOL SCefWebView::CanGoBack()
  78. {
  79. if (!m_pBrowserHandler)
  80. {
  81. return FALSE;
  82. }
  83. CefRefPtr<CefBrowser> pb = m_pBrowserHandler->GetBrowser();
  84. if ( pb.get() )
  85. {
  86. return pb->CanGoBack();
  87. }
  88. return FALSE;
  89. }
  90. void SCefWebView::GoBack()
  91. {
  92. if (!m_pBrowserHandler)
  93. {
  94. return;
  95. }
  96. CefRefPtr<CefBrowser> pb = m_pBrowserHandler->GetBrowser();
  97. if ( pb.get() )
  98. {
  99. return pb->GoBack();
  100. }
  101. }
  102. BOOL SCefWebView::CanGoForward()
  103. {
  104. if (!m_pBrowserHandler)
  105. {
  106. return FALSE;
  107. }
  108. CefRefPtr<CefBrowser> pb = m_pBrowserHandler->GetBrowser();
  109. if ( pb.get() )
  110. {
  111. return pb->CanGoForward();
  112. }
  113. return FALSE;
  114. }
  115. void SCefWebView::GoForward()
  116. {
  117. if (!m_pBrowserHandler)
  118. {
  119. return;
  120. }
  121. CefRefPtr<CefBrowser> pb = m_pBrowserHandler->GetBrowser();
  122. if ( pb.get() )
  123. {
  124. return pb->GoForward();
  125. }
  126. }
  127. BOOL SCefWebView::IsLoading()
  128. {
  129. if (!m_pBrowserHandler)
  130. {
  131. return FALSE;
  132. }
  133. CefRefPtr<CefBrowser> pb = m_pBrowserHandler->GetBrowser();
  134. if ( pb.get() )
  135. {
  136. return pb->IsLoading();
  137. }
  138. return FALSE;
  139. }
  140. void SCefWebView::Reload()
  141. {
  142. if (!m_pBrowserHandler)
  143. {
  144. return;
  145. }
  146. CefRefPtr<CefBrowser> pb = m_pBrowserHandler->GetBrowser();
  147. if ( pb.get() )
  148. {
  149. return pb->Reload();
  150. }
  151. }
  152. void SCefWebView::StopLoad()
  153. {
  154. if (!m_pBrowserHandler)
  155. {
  156. return;
  157. }
  158. CefRefPtr<CefBrowser> pb = m_pBrowserHandler->GetBrowser();
  159. if ( pb.get() )
  160. {
  161. return pb->StopLoad();
  162. }
  163. }
  164. BOOL SCefWebView::Open()
  165. {
  166. CefRefPtr<CefBrowser> pb = m_pBrowserHandler->GetBrowser();
  167. if ( pb.get() )
  168. {
  169. return TRUE;
  170. }
  171. if( !m_pBrowserHandler->Open(GetContainer()->GetHostHwnd(), GetClientRect()) )
  172. {
  173. return FALSE;
  174. }
  175. m_pBrowserHandler->SetRender(this);
  176. m_pBrowserHandler->RegisterMessageHandler(this);
  177. return TRUE;
  178. }
  179. void SCefWebView::Close()
  180. {
  181. m_pBrowserHandler->CloseAllBrowsers(true);
  182. m_pBrowserHandler->SetRender(NULL);
  183. m_pBrowserHandler->UnRegisterMessgeHandler(this);
  184. m_bBkgndDirty = TRUE;
  185. m_pBitmapBuff = NULL;
  186. }
  187. void SCefWebView::UpdateBkgndRenderTarget()
  188. {
  189. // 更新背景RenderTarget
  190. CRect rcWnd = GetClientRect();
  191. if(!m_prtBackground)
  192. {
  193. GETRENDERFACTORY->CreateRenderTarget(&m_prtBackground,rcWnd.Width(), rcWnd.Height());
  194. }else
  195. {
  196. m_prtBackground->Resize(rcWnd.Size());
  197. }
  198. m_prtBackground->SetViewportOrg(-rcWnd.TopLeft());
  199. m_bBkgndDirty = TRUE;
  200. }
  201. void SCefWebView::SetFocus()
  202. {
  203. SetMsgHandled(FALSE);
  204. // set focus to Internet Explorer Server
  205. CHECK_CEF_BROWSER_HOST;
  206. //HWND activeWnd = ::GetActiveWindow();
  207. if(GetContainer() && ::IsWindow(GetContainer()->GetHostHwnd()))
  208. {
  209. //::SetForegroundWindow(GetContainer()->GetHostHwnd());
  210. ::SetFocus(GetContainer()->GetHostHwnd());
  211. }
  212. host->SendFocusEvent(true);
  213. }
  214. int SCefWebView::OnCreate(LPVOID)
  215. {
  216. m_pDropTarget = DropTargetWin::Create(this, GetContainer()->GetHostHwnd());
  217. GetContainer()->RegisterDragDrop(GetSwnd(), m_pDropTarget);
  218. if( !m_strUrl.IsEmpty() )
  219. {
  220. Open();
  221. LoadURL(m_strUrl);
  222. }
  223. return 0;
  224. }
  225. void SCefWebView::OnSize(UINT nType, CSize size)
  226. {
  227. STRACE(L"webview resized");
  228. SWindow::OnSize(nType,size);
  229. UpdateBkgndRenderTarget();
  230. if(!m_pBitmapBuff || (m_pBitmapBuff->Width()!=size.cx || m_pBitmapBuff->Height()!=size.cy))
  231. {
  232. CHECK_CEF_BROWSER_HOST;
  233. host->WasResized();
  234. }
  235. }
  236. BOOL SCefWebView::OnAttrUrl(SStringW strValue, BOOL bLoading)
  237. {
  238. m_strUrl = strValue;
  239. if(!bLoading)
  240. {
  241. LoadURL(strValue);
  242. }
  243. return !bLoading;
  244. }
  245. void SCefWebView::OnDestroy()
  246. {
  247. STRACE(L"webview destroy");
  248. GetContainer()->RevokeDragDrop(GetSwnd());
  249. if(m_pBrowserHandler)
  250. {
  251. Close();
  252. }
  253. SWindow::OnDestroy();
  254. }
  255. void SCefWebView::AdjustPopRect(CRect &dstRect)
  256. {
  257. CRect rcWnd = GetClientRect();
  258. dstRect.left = m_pPopRect.x+rcWnd.left;
  259. dstRect.top = m_pPopRect.y+rcWnd.top;
  260. dstRect.right = dstRect.left+m_pPopRect.width;
  261. dstRect.bottom = dstRect.top+m_pPopRect.height;
  262. if (m_pPopRect.x < 0)//左边超出
  263. {
  264. dstRect.left = rcWnd.left;
  265. dstRect.right = dstRect.left+m_pPopRect.width;
  266. }
  267. if (m_pPopRect.y < 0)//上面超出
  268. {
  269. dstRect.top = rcWnd.top;
  270. dstRect.bottom = dstRect.top+m_pPopRect.height;
  271. }
  272. if(m_pPopRect.x+m_pPopRect.width > rcWnd.right)//右边超出
  273. {
  274. dstRect.right = rcWnd.right;
  275. dstRect.left = dstRect.right-m_pPopRect.width;
  276. }
  277. if(m_pPopRect.y+m_pPopRect.height > rcWnd.bottom)//下面超出
  278. {
  279. dstRect.bottom = rcWnd.bottom;
  280. dstRect.top = dstRect.bottom-m_pPopRect.height;
  281. }
  282. }
  283. void SCefWebView::OnPaint(IRenderTarget *pRT)
  284. {
  285. //STRACE(L"web view onpaint");
  286. CRect rcWnd = GetClientRect();
  287. if (m_bBkgndDirty && m_prtBackground)
  288. {
  289. m_bBkgndDirty = FALSE;
  290. m_prtBackground->BitBlt(rcWnd, pRT, rcWnd.left, rcWnd.top);
  291. }
  292. SWindow::OnPaint(pRT);
  293. if ( m_pBrowserHandler )
  294. {
  295. CRect rcClipBox;
  296. pRT->GetClipBox(rcClipBox);
  297. rcClipBox.IntersectRect(rcClipBox, rcWnd);
  298. CHECK_CEF_BROWSER_HOST;
  299. // request cef to update buff bitmap
  300. m_bInternalPaint = TRUE;
  301. host->Invalidate(CefRect(
  302. rcClipBox.left, rcClipBox.top,
  303. rcClipBox.Width(), rcClipBox.Height()), PET_VIEW);
  304. m_bInternalPaint = FALSE;
  305. }
  306. if ( m_pBitmapBuff )
  307. {
  308. rcWnd.right = rcWnd.left + m_pBitmapBuff->Width();
  309. rcWnd.bottom = rcWnd.top + m_pBitmapBuff->Height();
  310. pRT->DrawBitmap(rcWnd, m_pBitmapBuff, 0, 0, 0xFF);
  311. }
  312. if(m_pPopBitmapBuff && !m_pPopRect.IsEmpty())
  313. {
  314. CRect paintRect;
  315. AdjustPopRect(paintRect);
  316. pRT->DrawBitmap(paintRect, m_pPopBitmapBuff, 0, 0, 0xFF);
  317. }
  318. }
  319. LRESULT SCefWebView::OnCaptureChanged(UINT uMsg, WPARAM wParam, LPARAM lParam)
  320. {
  321. SendCaptureLostEvent(uMsg, wParam, lParam);
  322. return 0;
  323. }
  324. LRESULT SCefWebView::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam)
  325. {
  326. SendMouseMoveEvent(uMsg, wParam, lParam);
  327. return 0;
  328. }
  329. LRESULT SCefWebView::OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM lParam)
  330. {
  331. SendMouseWheelEvent(uMsg, wParam, lParam);
  332. return 0;
  333. }
  334. LRESULT SCefWebView::OnMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam)
  335. {
  336. if (uMsg == WM_LBUTTONDOWN)
  337. {
  338. SetFocus();
  339. SetCapture();
  340. }
  341. else if (uMsg == WM_LBUTTONUP)
  342. {
  343. ReleaseCapture();
  344. }
  345. SendMouseClickEvent(uMsg, wParam, lParam);
  346. CPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
  347. SWND hHover = GetRoot()->SwndFromPoint(pt,FALSE);
  348. SWindow * pHover = SWindowMgr::GetWindow(hHover);
  349. if (GetSwnd() != hHover && pHover)
  350. {
  351. pHover->SetFocus();
  352. OnKillFocus();
  353. SendCaptureLostEvent(uMsg, wParam, lParam);
  354. }
  355. return 0;
  356. }
  357. LRESULT SCefWebView::OnKeyEvent(UINT uMsg, WPARAM wParam, LPARAM lParam)
  358. {
  359. SendKeyEvent(uMsg, wParam, lParam);
  360. return 0;
  361. }
  362. void SCefWebView::OnSetFocus()
  363. {
  364. CHECK_CEF_BROWSER_HOST;
  365. HWND activeWnd = ::GetActiveWindow();
  366. if(activeWnd != GetContainer()->GetHostHwnd())
  367. {
  368. ::SetActiveWindow(GetContainer()->GetHostHwnd());
  369. }
  370. STRACE(L"set browser focus");
  371. host->SendFocusEvent(true);
  372. }
  373. void SCefWebView::OnKillFocus()
  374. {
  375. CHECK_CEF_BROWSER_HOST;
  376. STRACE(L"kill browser focus");
  377. host->SendFocusEvent(false);
  378. }
  379. void SCefWebView::OnShowWindow(BOOL bShow, UINT nStatus)
  380. {
  381. SWindow::OnShowWindow(bShow, nStatus);
  382. CHECK_CEF_BROWSER_HOST;
  383. host->WasHidden(!bShow);
  384. }
  385. BOOL SCefWebView::OnSetCursor(const CPoint &pt)
  386. {
  387. return TRUE;
  388. }
  389. // ------------------------------------------------------------------------------
  390. //
  391. // callback helper methods
  392. //
  393. // ------------------------------------------------------------------------------
  394. //
  395. void SCefWebView::SendMouseMoveEvent(UINT uMsg, WPARAM wp, LPARAM lp)
  396. {
  397. //cef cursor是异步的 可能在我们鼠标已经离开webview后 webview还会发送鼠标样式
  398. //需要忽略掉
  399. CHECK_CEF_BROWSER_HOST;
  400. CPoint pt(GET_X_LPARAM(lp), GET_Y_LPARAM(lp));
  401. CRect rcView = GetClientRect();
  402. bool leave = !rcView.PtInRect(pt) && !IsCaptured();
  403. if (leave)
  404. m_bSkipCursor = TRUE;
  405. else
  406. m_bSkipCursor = FALSE;
  407. CefMouseEvent evt;
  408. evt.x = pt.x - rcView.left;
  409. evt.y = pt.y - rcView.top;
  410. evt.modifiers = GetCefMouseModifiers(wp);
  411. //STRACE(L"browser mouse move, x:%d,y:%d,mod:%d",
  412. // evt.x, evt.y, evt.modifiers);
  413. host->SendMouseMoveEvent(evt, leave);
  414. }
  415. void SCefWebView::SendMouseClickEvent(UINT uMsg, WPARAM wp, LPARAM lp)
  416. {
  417. CHECK_CEF_BROWSER_HOST;
  418. CefMouseEvent evt;
  419. CefBrowserHost::MouseButtonType mt = MBT_LEFT;
  420. bool bMouseUp = false;
  421. int nClickCount = 1;
  422. switch (uMsg)
  423. {
  424. case WM_LBUTTONUP:
  425. bMouseUp = true;
  426. case WM_LBUTTONDOWN:
  427. mt = MBT_LEFT;
  428. break;
  429. case WM_LBUTTONDBLCLK:
  430. nClickCount = 2;
  431. break;
  432. case WM_MBUTTONUP:
  433. bMouseUp = true;
  434. case WM_MBUTTONDOWN:
  435. mt = MBT_MIDDLE;
  436. break;
  437. case WM_RBUTTONUP:
  438. bMouseUp = true;
  439. case WM_RBUTTONDOWN:
  440. mt = MBT_RIGHT;
  441. break;
  442. }
  443. CRect rcView = GetClientRect();
  444. CPoint pt(GET_X_LPARAM(lp), GET_Y_LPARAM(lp));
  445. evt.x = pt.x - rcView.left;
  446. evt.y = pt.y - rcView.top;
  447. evt.modifiers = GetCefMouseModifiers(wp);
  448. STRACE(L"browser click, msg:%d, x:%d,y:%d,mod:%d, mt:%d, up:%d",
  449. uMsg, evt.x, evt.y, evt.modifiers, mt, bMouseUp);
  450. host->SendMouseClickEvent(evt, mt,bMouseUp, nClickCount);
  451. }
  452. void SCefWebView::SendFocusEvent(bool focus)
  453. {
  454. CHECK_CEF_BROWSER_HOST;
  455. STRACE(L"sent browser focus:%d", focus);
  456. host->SendFocusEvent(focus);
  457. }
  458. void SCefWebView::SendMouseWheelEvent(UINT uMsg, WPARAM wp, LPARAM lp)
  459. {
  460. CHECK_CEF_BROWSER_HOST;
  461. POINT pt;
  462. pt.x = GET_X_LPARAM(lp);
  463. pt.y = GET_Y_LPARAM(lp);
  464. int delta = GET_WHEEL_DELTA_WPARAM(wp);
  465. CefMouseEvent evt;
  466. CRect rcView = GetClientRect();
  467. pt.x -= rcView.left;
  468. pt.y -= rcView.top;
  469. evt.x = pt.x;
  470. evt.y = pt.y;
  471. evt.modifiers = 0;
  472. STRACE(L"browser mouse wheel, x:%d,y:%d,mod:%d, deltaX:%d, deltaY:%d",
  473. evt.x, evt.y, evt.modifiers,
  474. IsKeyDown(VK_SHIFT)?delta:0, IsKeyDown(VK_SHIFT)?0:delta);
  475. host->SendMouseWheelEvent(evt, IsKeyDown(VK_SHIFT)?delta:0, IsKeyDown(VK_SHIFT)?0:delta);
  476. }
  477. void SCefWebView::SendKeyEvent(UINT uMsg, WPARAM wp, LPARAM lp)
  478. {
  479. CHECK_CEF_BROWSER_HOST;
  480. CefKeyEvent evt = ToCefKeyEvent(uMsg,wp,lp);
  481. STRACE(L"browser key event. wkcode:%d, nkcode:%x, issys:%d, type:%d, modfiers:%d",
  482. evt.windows_key_code,
  483. evt.native_key_code,
  484. evt.is_system_key,
  485. evt.type,
  486. evt.modifiers);
  487. host->SendKeyEvent(evt);
  488. }
  489. void SCefWebView::SendCaptureLostEvent(UINT uMsg, WPARAM wp, LPARAM lp)
  490. {
  491. CHECK_CEF_BROWSER_HOST;
  492. STRACE(L"browser send capture losted");
  493. host->SendCaptureLostEvent();
  494. }
  495. void SCefWebView::Draw(IBitmap * pbuff)
  496. {
  497. if (m_bInternalPaint || !m_prtBackground || m_bBkgndDirty)
  498. {
  499. STRACE(L"on ready...");
  500. return;
  501. }
  502. CRect rcWnd = GetClientRect();
  503. if (rcWnd.Width() != pbuff->Width() || rcWnd.Height() != pbuff->Height())
  504. {
  505. rcWnd.right = rcWnd.left + pbuff->Width();
  506. rcWnd.bottom = rcWnd.top + pbuff->Height();
  507. }
  508. CAutoRefPtr<IRegion> rgn;
  509. GETRENDERFACTORY->CreateRegion(&rgn);
  510. rgn->CombineRect(rcWnd, RGN_OR);
  511. CAutoRefPtr<IRenderTarget> pRT = GetContainer()->OnGetRenderTarget(rcWnd, 0);
  512. pRT->BitBlt(rcWnd, m_prtBackground, rcWnd.left, rcWnd.top);
  513. pRT->DrawBitmap(rcWnd, pbuff, 0, 0, 0xFF);
  514. GetContainer()->OnReleaseRenderTarget(pRT, rcWnd, 0);
  515. }
  516. BOOL SCefWebView::IsCaptured()
  517. {
  518. return GetCapture() == GetSwnd();
  519. }
  520. //void SCefWebView::SetTitle(const wchar_t * title)
  521. //{
  522. // m_strTitle = title;
  523. //}
  524. // ------------------------------------------------------------------------------
  525. //
  526. // browser callbacks
  527. //
  528. // ------------------------------------------------------------------------------
  529. void SCefWebView::OnBeforeClose(CefRefPtr<CefBrowser> browser)
  530. {
  531. }
  532. //
  533. // BrowserHandler::MessageHandlermethods
  534. //
  535. bool SCefWebView::OnBrowserMessage(CefRefPtr<CefBrowser> browser,
  536. CefProcessId source_process,
  537. CefRefPtr<CefProcessMessage> message)
  538. {
  539. EventWebViewNotify evt(this);
  540. evt.MessageName = message->GetName().ToWString().c_str();
  541. CefRefPtr<CefListValue> arg = message->GetArgumentList();
  542. for (int i = 0; i < arg->GetSize(); ++i)
  543. {
  544. SStringW str = arg->GetString(i).ToWString().c_str();
  545. evt.Arguments.Add(str);
  546. }
  547. return !!FireEvent(evt);
  548. }
  549. //
  550. // CefRenderHandler methods
  551. //
  552. bool SCefWebView::GetViewRect(CefRefPtr<CefBrowser> browser,
  553. CefRect& rect)
  554. {
  555. //STRACE(L"browser get view rect");
  556. CRect rc = GetClientRect();
  557. rect.x = rect.y = 0;
  558. rect.width = rc.Width();
  559. rect.height = rc.Height();
  560. return true;
  561. }
  562. bool SCefWebView::GetScreenPoint(CefRefPtr<CefBrowser> browser,
  563. int viewX,
  564. int viewY,
  565. int& screenX,
  566. int& screenY)
  567. {
  568. // Convert the point from view coordinates to actual screen coordinates.
  569. POINT screen_pt = {viewX, viewY};
  570. ClientToScreen(GetContainer()->GetHostHwnd(), &screen_pt);
  571. screenX = screen_pt.x;
  572. screenY = screen_pt.y;
  573. return true;
  574. }
  575. void SCefWebView::AdjustPixmap(int width, int height)
  576. {
  577. if(!m_pBitmapBuff)
  578. {
  579. GETRENDERFACTORY->CreateBitmap(&m_pBitmapBuff);
  580. }
  581. if(m_pBitmapBuff->Width() != width || m_pBitmapBuff->Height()!=height)
  582. {
  583. m_pBitmapBuff->Init(width,height);
  584. }
  585. }
  586. void SCefWebView::AdjustPopBitmap(int width, int height)
  587. {
  588. if(!m_pPopBitmapBuff)
  589. {
  590. GETRENDERFACTORY->CreateBitmap(&m_pPopBitmapBuff);
  591. }
  592. if(m_pPopBitmapBuff->Width() != width || m_pPopBitmapBuff->Height()!=height)
  593. {
  594. m_pPopBitmapBuff->Init(width,height);
  595. }
  596. }
  597. void SCefWebView::OnPaint(CefRefPtr<CefBrowser> browser,
  598. PaintElementType type,
  599. const RectList& dirtyRects,
  600. const void* buffer,
  601. int width,
  602. int height)
  603. {
  604. STRACE(L"cef paint ...");
  605. if(type == PET_VIEW)
  606. {
  607. AdjustPixmap(width, height);
  608. LPBYTE pDst = (LPBYTE)m_pBitmapBuff->LockPixelBits();
  609. if(pDst)
  610. {
  611. memcpy(pDst, buffer, width * height * 4);
  612. m_pBitmapBuff->UnlockPixelBits(pDst);
  613. }
  614. }
  615. else if (type == PET_POPUP)
  616. {
  617. STRACE(L"PET_POPUP!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
  618. //return;
  619. AdjustPopBitmap(width, height);
  620. LPBYTE pDst = (LPBYTE)m_pPopBitmapBuff->LockPixelBits();
  621. if(pDst)
  622. {
  623. memcpy(pDst, buffer, width * height * 4);
  624. m_pPopBitmapBuff->UnlockPixelBits(pDst);
  625. }
  626. }
  627. //Draw(m_pBitmapBuff);
  628. if (m_bInternalPaint || !m_prtBackground || m_bBkgndDirty)
  629. {
  630. STRACE(L"on ready...");
  631. return;
  632. }
  633. InvalidateRect(NULL);
  634. }
  635. void SCefWebView::OnPopupShow(CefRefPtr<CefBrowser> browser,
  636. bool show)
  637. {
  638. if (!show)
  639. {
  640. // 当popup窗口隐藏时,刷新popup区域
  641. CRect paintRect;
  642. AdjustPopRect(paintRect);
  643. CefRect rectDirty;
  644. rectDirty.Set(paintRect.left, paintRect.top, paintRect.Width(), paintRect.Height());
  645. m_pPopRect.Set(0, 0, 0, 0);
  646. browser->GetHost()->Invalidate(rectDirty, PET_VIEW);
  647. }
  648. }
  649. void SCefWebView::OnPopupSize(CefRefPtr<CefBrowser> browser,
  650. const CefRect& rect)
  651. {
  652. STRACE(L"PET_POPUP x:%d, y:%d, wid:%d, hei:%d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
  653. rect.x
  654. ,rect.y
  655. ,rect.width
  656. ,rect.height);
  657. if(rect.width <=0 || rect.height <= 0)
  658. return;
  659. m_pPopRect = rect;
  660. }
  661. void SCefWebView::OnCursorChange(CefRefPtr<CefBrowser> browser,
  662. CefCursorHandle cursor)
  663. {
  664. if (!m_bSkipCursor)
  665. {
  666. //SetClassLongPtr(m_hwnd, GCLP_HCURSOR, static_cast<LONG>(reinterpret_cast<LONG_PTR>(cursor)));
  667. ::SetCursor(cursor);
  668. }
  669. }
  670. bool SCefWebView::StartDragging(CefRefPtr<CefBrowser> browser,
  671. CefRefPtr<CefDragData> drag_data,
  672. CefRenderHandler::DragOperationsMask allowed_ops,
  673. int x, int y)
  674. {
  675. if (!m_pDropTarget)
  676. return false;
  677. m_opCurrentDrag = DRAG_OPERATION_NONE;
  678. CefBrowserHost::DragOperationsMask result =
  679. m_pDropTarget->StartDragging(browser, drag_data, allowed_ops, x, y);
  680. m_opCurrentDrag = DRAG_OPERATION_NONE;
  681. POINT pt = {};
  682. GetCursorPos(&pt);
  683. ScreenToClient(GetContainer()->GetHostHwnd(), &pt);
  684. browser->GetHost()->DragSourceEndedAt(pt.x, pt.y, result);
  685. browser->GetHost()->DragSourceSystemDragEnded();
  686. ::SendMessage(GetContainer()->GetHostHwnd(), WM_LBUTTONUP, 0, MAKELONG(pt.x,pt.y));
  687. return true;
  688. }
  689. void SCefWebView::UpdateDragCursor(
  690. CefRefPtr<CefBrowser> browser,
  691. CefRenderHandler::DragOperation operation)
  692. {
  693. m_opCurrentDrag = operation;
  694. }
  695. CefBrowserHost::DragOperationsMask SCefWebView::OnDragEnter(
  696. CefRefPtr<CefDragData> drag_data,
  697. CefMouseEvent ev,
  698. CefBrowserHost::DragOperationsMask effect)
  699. {
  700. DWORD dwMask = DRAG_OPERATION_COPY|DRAG_OPERATION_LINK|DRAG_OPERATION_MOVE;
  701. effect = static_cast<CefRenderHandler::DragOperationsMask>(dwMask);
  702. m_pBrowserHandler->GetBrowser()->GetHost()->DragTargetDragEnter(drag_data, ev, effect);
  703. m_pBrowserHandler->GetBrowser()->GetHost()->DragTargetDragOver(ev, effect);
  704. return m_opCurrentDrag;
  705. }
  706. CefBrowserHost::DragOperationsMask SCefWebView::OnDragOver(
  707. CefMouseEvent ev,
  708. CefBrowserHost::DragOperationsMask effect)
  709. {
  710. CRect rc = GetClientRect();
  711. ev.x -= rc.left;
  712. ev.y -= rc.top;
  713. DWORD dwMask = DRAG_OPERATION_COPY|DRAG_OPERATION_LINK|DRAG_OPERATION_MOVE;
  714. effect = static_cast<CefRenderHandler::DragOperationsMask>(dwMask);
  715. m_pBrowserHandler->GetBrowser()->GetHost()->DragTargetDragOver(ev, effect);
  716. return m_opCurrentDrag;
  717. }
  718. void SCefWebView::OnDragLeave()
  719. {
  720. m_pBrowserHandler->GetBrowser()->GetHost()->DragTargetDragLeave();
  721. }
  722. CefBrowserHost::DragOperationsMask SCefWebView::OnDrop(
  723. CefMouseEvent ev,
  724. CefBrowserHost::DragOperationsMask effect)
  725. {
  726. CRect rc = GetClientRect();
  727. ev.x -= rc.left;
  728. ev.y -= rc.top;
  729. m_pBrowserHandler->GetBrowser()->GetHost()->DragTargetDragOver(ev, effect);
  730. m_pBrowserHandler->GetBrowser()->GetHost()->DragTargetDrop(ev);
  731. return m_opCurrentDrag;
  732. }
  733. }; // namespace SOUI