WpfCefRenderHandler.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using Microsoft.Win32.SafeHandles;
  2. using System;
  3. using System.Windows.Input;
  4. using System.Windows.Interop;
  5. using Xilium.CefGlue.Helpers.Log;
  6. namespace Xilium.CefGlue.WPF
  7. {
  8. internal sealed class WpfCefRenderHandler : CefRenderHandler
  9. {
  10. private readonly WpfCefBrowser _owner;
  11. private readonly ILogger _logger;
  12. private readonly IUiHelper _uiHelper;
  13. public WpfCefRenderHandler(WpfCefBrowser owner, ILogger logger, IUiHelper uiHelper)
  14. {
  15. if (owner == null)
  16. {
  17. throw new ArgumentNullException("owner");
  18. }
  19. if (logger == null)
  20. {
  21. throw new ArgumentNullException("logger");
  22. }
  23. if (uiHelper == null)
  24. {
  25. throw new ArgumentNullException("uiHelper");
  26. }
  27. _owner = owner;
  28. _logger = logger;
  29. _uiHelper = uiHelper;
  30. }
  31. protected override bool GetRootScreenRect(CefBrowser browser, ref CefRectangle rect)
  32. {
  33. return _owner.GetViewRect(ref rect);
  34. }
  35. protected override bool GetViewRect(CefBrowser browser, ref CefRectangle rect)
  36. {
  37. return _owner.GetViewRect(ref rect);
  38. }
  39. protected override bool GetScreenPoint(CefBrowser browser, int viewX, int viewY, ref int screenX, ref int screenY)
  40. {
  41. _owner.GetScreenPoint(viewX, viewY, ref screenX, ref screenY);
  42. return true;
  43. }
  44. protected override bool GetScreenInfo(CefBrowser browser, CefScreenInfo screenInfo)
  45. {
  46. return false;
  47. }
  48. protected override void OnPopupShow(CefBrowser browser, bool show)
  49. {
  50. _owner.OnPopupShow(show);
  51. }
  52. protected override void OnPopupSize(CefBrowser browser, CefRectangle rect)
  53. {
  54. _owner.OnPopupSize(rect);
  55. }
  56. protected override void OnPaint(CefBrowser browser, CefPaintElementType type, CefRectangle[] dirtyRects, IntPtr buffer, int width, int height)
  57. {
  58. _logger.Debug("Type: {0} Buffer: {1:X8} Width: {2} Height: {3}", type, buffer, width, height);
  59. foreach (var rect in dirtyRects)
  60. {
  61. _logger.Debug(" DirtyRect: X={0} Y={1} W={2} H={3}", rect.X, rect.Y, rect.Width, rect.Height);
  62. }
  63. if (type == CefPaintElementType.View)
  64. {
  65. _owner.HandleViewPaint(browser, type, dirtyRects, buffer, width, height);
  66. }
  67. else if (type == CefPaintElementType.Popup)
  68. {
  69. _owner.HandlePopupPaint(width, height, dirtyRects, buffer);
  70. }
  71. }
  72. protected override void OnCursorChange(CefBrowser browser, IntPtr cursorHandle, CefCursorType type, CefCursorInfo customCursorInfo)
  73. {
  74. _uiHelper.PerformInUiThread(() =>
  75. {
  76. Cursor cursor = CursorInteropHelper.Create(new SafeFileHandle(cursorHandle, false));
  77. _owner.Cursor = cursor;
  78. });
  79. }
  80. protected override void OnScrollOffsetChanged(CefBrowser browser, double x, double y)
  81. {
  82. }
  83. }
  84. }