main.pas 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. unit main;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, cefvcl, ceflib, cefgui, GR32_Image, AppEvnts;
  6. type
  7. TMainform = class(TForm)
  8. PaintBox: TPaintBox32;
  9. chrmosr: TChromiumOSR;
  10. AppEvents: TApplicationEvents;
  11. procedure PaintBoxResize(Sender: TObject);
  12. procedure PaintBoxMouseDown(Sender: TObject; Button: TMouseButton;
  13. Shift: TShiftState; X, Y: Integer);
  14. procedure PaintBoxMouseUp(Sender: TObject; Button: TMouseButton;
  15. Shift: TShiftState; X, Y: Integer);
  16. procedure PaintBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
  17. Y: Integer);
  18. procedure AppEventsMessage(var Msg: tagMSG; var Handled: Boolean);
  19. procedure chrmosrPaint(Sender: TObject; const browser: ICefBrowser;
  20. kind: TCefPaintElementType; dirtyRectsCount: NativeUInt;
  21. const dirtyRects: PCefRectArray; const buffer: Pointer; width,
  22. height: Integer);
  23. procedure chrmosrGetRootScreenRect(Sender: TObject;
  24. const browser: ICefBrowser; rect: PCefRect; out Result: Boolean);
  25. procedure chrmosrCursorChange(Sender: TObject; const browser: ICefBrowser;
  26. cursor: HICON; cursorType: TCefCursorType;
  27. const customCursorInfo: PCefCursorInfo);
  28. procedure PaintBoxMouseWheel(Sender: TObject; Shift: TShiftState;
  29. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  30. end;
  31. var
  32. Mainform: TMainform;
  33. implementation
  34. {$R *.dfm}
  35. procedure TMainform.AppEventsMessage(var Msg: tagMSG; var Handled: Boolean);
  36. var
  37. event: TCefKeyEvent;
  38. begin
  39. chrmosr.Browser.Host.SendKeyEvent(@event);
  40. case Msg.message of
  41. WM_CHAR:
  42. begin
  43. FillChar(event, SizeOf(TCefKeyEvent), 0);
  44. event.kind := KEYEVENT_CHAR;
  45. event.windows_key_code := Msg.wParam;
  46. event.native_key_code := Msg.lParam;
  47. chrmosr.Browser.Host.SendKeyEvent(@event);
  48. end;
  49. end;
  50. end;
  51. procedure TMainform.chrmosrCursorChange(Sender: TObject;
  52. const browser: ICefBrowser; cursor: HICON; cursorType: TCefCursorType;
  53. const customCursorInfo: PCefCursorInfo);
  54. begin
  55. case cursorType of
  56. CT_POINTER: PaintBox.Cursor := crArrow;
  57. CT_CROSS: PaintBox.Cursor:= crCross;
  58. CT_HAND: PaintBox.Cursor := crHandPoint;
  59. CT_IBEAM: PaintBox.Cursor := crIBeam;
  60. CT_WAIT: PaintBox.Cursor := crHourGlass;
  61. CT_HELP: PaintBox.Cursor := crHelp;
  62. CT_EASTRESIZE: PaintBox.Cursor := crSizeWE;
  63. CT_NORTHRESIZE: PaintBox.Cursor := crSizeNS;
  64. CT_NORTHEASTRESIZE: PaintBox.Cursor:= crSizeNESW;
  65. CT_NORTHWESTRESIZE: PaintBox.Cursor:= crSizeNWSE;
  66. CT_SOUTHRESIZE: PaintBox.Cursor:= crSizeNS;
  67. CT_SOUTHEASTRESIZE: PaintBox.Cursor:= crSizeNWSE;
  68. CT_SOUTHWESTRESIZE: PaintBox.Cursor:= crSizeNESW;
  69. CT_WESTRESIZE: PaintBox.Cursor := crSizeWE;
  70. CT_NORTHSOUTHRESIZE: PaintBox.Cursor:= crSizeNS;
  71. CT_EASTWESTRESIZE: PaintBox.Cursor := crSizeWE;
  72. CT_NORTHEASTSOUTHWESTRESIZE: PaintBox.Cursor:= crSizeNESW;
  73. CT_NORTHWESTSOUTHEASTRESIZE: PaintBox.Cursor:= crSizeNWSE;
  74. CT_COLUMNRESIZE: PaintBox.Cursor:= crHSplit;
  75. CT_ROWRESIZE: PaintBox.Cursor:= crVSplit;
  76. CT_MOVE: PaintBox.Cursor := crSizeAll;
  77. CT_PROGRESS: PaintBox.Cursor := crAppStart;
  78. CT_NODROP: PaintBox.Cursor:= crNo;
  79. CT_NONE: PaintBox.Cursor:= crNone;
  80. CT_NOTALLOWED: PaintBox.Cursor:= crNo;
  81. else
  82. PaintBox.Cursor := crArrow;
  83. end;
  84. end;
  85. procedure TMainform.chrmosrGetRootScreenRect(Sender: TObject;
  86. const browser: ICefBrowser; rect: PCefRect; out Result: Boolean);
  87. begin
  88. rect.x := 0;
  89. rect.y := 0;
  90. rect.width := PaintBox.Width;
  91. rect.height := PaintBox.Height;
  92. Result := True;
  93. end;
  94. procedure TMainform.chrmosrPaint(Sender: TObject; const browser: ICefBrowser;
  95. kind: TCefPaintElementType; dirtyRectsCount: NativeUInt;
  96. const dirtyRects: PCefRectArray; const buffer: Pointer; width, height: Integer);
  97. var
  98. src, dst: PByte;
  99. offset, i, j, w: Integer;
  100. begin
  101. if (width <> PaintBox.Width) or (height <> PaintBox.Height) then Exit;
  102. with PaintBox.Buffer do
  103. begin
  104. PaintBox.Canvas.Lock;
  105. Lock;
  106. try
  107. // Move(buffer^, Bits^, vw * vh * 4);
  108. // PaintBox.Invalidate;
  109. for j := 0 to dirtyRectsCount - 1 do
  110. begin
  111. w := Width * 4;
  112. offset := ((dirtyRects[j].y * Width) + dirtyRects[j].x) * 4;
  113. src := @PByte(buffer)[offset];
  114. dst := @PByte(Bits)[offset];
  115. offset := dirtyRects[j].width * 4;
  116. for i := 0 to dirtyRects[j].height - 1 do
  117. begin
  118. Move(src^, dst^, offset);
  119. Inc(dst, w);
  120. Inc(src, w);
  121. end;
  122. PaintBox.Flush(Rect(dirtyRects[j].x, dirtyRects[j].y,
  123. dirtyRects[j].x + dirtyRects[j].width, dirtyRects[j].y + dirtyRects[j].height));
  124. end;
  125. finally
  126. Unlock;
  127. PaintBox.Canvas.Unlock;
  128. end;
  129. end;
  130. end;
  131. function getModifiers(Shift: TShiftState): TCefEventFlags;
  132. begin
  133. Result := [];
  134. if ssShift in Shift then Include(Result, EVENTFLAG_SHIFT_DOWN);
  135. if ssAlt in Shift then Include(Result, EVENTFLAG_ALT_DOWN);
  136. if ssCtrl in Shift then Include(Result, EVENTFLAG_CONTROL_DOWN);
  137. if ssLeft in Shift then Include(Result, EVENTFLAG_LEFT_MOUSE_BUTTON);
  138. if ssRight in Shift then Include(Result, EVENTFLAG_RIGHT_MOUSE_BUTTON);
  139. if ssMiddle in Shift then Include(Result, EVENTFLAG_MIDDLE_MOUSE_BUTTON);
  140. end;
  141. function GetButton(Button: TMouseButton): TCefMouseButtonType;
  142. begin
  143. case Button of
  144. TMouseButton.mbLeft: Result := MBT_LEFT;
  145. TMouseButton.mbRight: Result := MBT_RIGHT;
  146. TMouseButton.mbMiddle: Result := MBT_MIDDLE;
  147. end;
  148. end;
  149. procedure TMainform.PaintBoxMouseDown(Sender: TObject; Button: TMouseButton;
  150. Shift: TShiftState; X, Y: Integer);
  151. var
  152. event: TCefMouseEvent;
  153. begin
  154. event.x := X;
  155. event.y := Y;
  156. event.modifiers := getModifiers(Shift);
  157. chrmosr.Browser.Host.SendMouseClickEvent(@event, GetButton(Button), False, 1);
  158. end;
  159. procedure TMainform.PaintBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
  160. Y: Integer);
  161. var
  162. event: TCefMouseEvent;
  163. begin
  164. event.x := X;
  165. event.y := Y;
  166. event.modifiers := getModifiers(Shift);
  167. chrmosr.Browser.Host.SendMouseMoveEvent(@event, not PaintBox.MouseInControl);
  168. end;
  169. procedure TMainform.PaintBoxMouseUp(Sender: TObject; Button: TMouseButton;
  170. Shift: TShiftState; X, Y: Integer);
  171. var
  172. event: TCefMouseEvent;
  173. begin
  174. event.x := X;
  175. event.y := Y;
  176. event.modifiers := getModifiers(Shift);
  177. chrmosr.Browser.Host.SendMouseClickEvent(@event, GetButton(Button), True, 1);
  178. end;
  179. procedure TMainform.PaintBoxMouseWheel(Sender: TObject; Shift: TShiftState;
  180. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  181. var
  182. event: TCefMouseEvent;
  183. begin
  184. event.x := MousePos.X;
  185. event.y := MousePos.Y;
  186. event.modifiers := getModifiers(Shift);
  187. chrmosr.Browser.Host.SendMouseWheelEvent(@event, 0, WheelDelta);
  188. end;
  189. procedure TMainform.PaintBoxResize(Sender: TObject);
  190. begin
  191. PaintBox.Buffer.SetSize(PaintBox.Width, PaintBox.Height);
  192. chrmosr.browser.Host.WasResized;
  193. chrmosr.Browser.Host.SendFocusEvent(True);
  194. Application.ProcessMessages;
  195. end;
  196. end.