You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

600 line
23 KiB

  1. unit uutlEventManager;
  2. { Package: Utils
  3. Prefix: utl - UTiLs
  4. Beschreibung: diese Unit verwaltet Events und verteilt diese an registrierte Programm-Teile }
  5. {$mode objfpc}{$H+}
  6. interface
  7. uses
  8. Classes, SysUtils, Controls,
  9. uutlEvent;
  10. type
  11. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  12. TutlEventType = byte;
  13. TutlEventTypes = set of TutlEventType;
  14. TutlMouseButtons = set of TMouseButton;
  15. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  16. TutlWinControlEventArgs = class(TutlEventArgs)
  17. private
  18. fControl: TControl;
  19. fEventType: TutlEventType;
  20. fTimestamp: Single;
  21. public
  22. property Control: TControl read fControl;
  23. property EventType: TutlEventType read fEventType;
  24. property Timestamp: Single read fTimestamp;
  25. constructor Create(
  26. const aControl: TControl;
  27. const aEventType: TutlEventType);
  28. end;
  29. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  30. TutlMouseEventArgs = class(TutlWinControlEventArgs)
  31. private
  32. fButtons: TutlMouseButtons;
  33. fClientPos: TPoint;
  34. fScreenPos: TPoint;
  35. public
  36. property Buttons: TutlMouseButtons read fButtons;
  37. property ClientPos: TPoint read fClientPos;
  38. property ScreenPos: TPoint read fScreenPos;
  39. constructor Create(
  40. const aControl: TControl;
  41. const aEventType: TutlEventType;
  42. const aButtons: TutlMouseButtons;
  43. const aClientPos: TPoint);
  44. end;
  45. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46. TutlMouseWheelEventArgs = class(TutlWinControlEventArgs)
  47. private
  48. fWheelDelta: Integer;
  49. fClientPos: TPoint;
  50. fScreenPos: TPoint;
  51. public
  52. property WheelDelta: Integer read fWheelDelta;
  53. property ClientPos: TPoint read fClientPos;
  54. property ScreenPos: TPoint read fScreenPos;
  55. constructor Create(
  56. const aControl: TControl;
  57. const aWheelDelta: Integer;
  58. const aClientPos: TPoint);
  59. end;
  60. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  61. TutlKeyEventArgs = class(TutlWinControlEventArgs)
  62. private
  63. fCharCode: WideChar;
  64. fKeyCode: Word;
  65. public
  66. property CharCode: WideChar read fCharCode;
  67. property KeyCode: Word read fKeyCode;
  68. constructor Create(
  69. const aControl: TControl;
  70. const aEventType: TutlEventType;
  71. const aCharCode: WideChar;
  72. const aKeyCode: Word);
  73. end;
  74. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  75. TutlWindowEventArgs = class(TutlWinControlEventArgs)
  76. private
  77. fScreenRect: TRect;
  78. fClientWidth: Cardinal;
  79. fClientHeight: Cardinal;
  80. public
  81. property ScreenRect: TRect read fScreenRect;
  82. property ClientWidth: Cardinal read fClientWidth;
  83. property ClientHeight: Cardinal read fClientHeight;
  84. constructor Create(
  85. const aControl: TControl;
  86. const aEventType: TutlEventType;
  87. const aScreenRect: TRect;
  88. const aClientWidth: Cardinal;
  89. const aClientHeight: Cardinal);
  90. end;
  91. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  92. TutlWinControlEventManager = class(TutlEventListenerSet)
  93. public const
  94. EVENT_MOUSE_DOWN = 0;
  95. EVENT_MOUSE_UP = 1;
  96. EVENT_MOUSE_WHEEL_UP = 2;
  97. EVENT_MOUSE_WHEEL_DOWN = 3;
  98. EVENT_MOUSE_MOVE = 4;
  99. EVENT_MOUSE_ENTER = 5;
  100. EVENT_MOUSE_LEAVE = 6;
  101. EVENT_MOUSE_CLICK = 7;
  102. EVENT_MOUSE_DBL_CLICK = 8;
  103. EVENT_KEY_DOWN = 10;
  104. EVENT_KEY_REPEAT = 11;
  105. EVENT_KEY_UP = 12;
  106. EVENT_WINDOW_RESIZE = 15;
  107. EVENT_WINDOW_ACTIVATE = 16;
  108. EVENT_WINDOW_DEACTIVATE = 17;
  109. EVENTS_MOUSE: TutlEventTypes = [
  110. EVENT_MOUSE_DOWN,
  111. EVENT_MOUSE_UP,
  112. EVENT_MOUSE_WHEEL_UP,
  113. EVENT_MOUSE_WHEEL_DOWN,
  114. EVENT_MOUSE_MOVE,
  115. EVENT_MOUSE_ENTER,
  116. EVENT_MOUSE_LEAVE,
  117. EVENT_MOUSE_CLICK,
  118. EVENT_MOUSE_DBL_CLICK
  119. ];
  120. EVENTS_KEYBOARD: TutlEventTypes = [
  121. EVENT_KEY_DOWN,
  122. EVENT_KEY_REPEAT,
  123. EVENT_KEY_UP
  124. ];
  125. EVENTS_WINDOW: TutlEventTypes = [
  126. EVENT_WINDOW_RESIZE,
  127. EVENT_WINDOW_ACTIVATE,
  128. EVENT_WINDOW_DEACTIVATE
  129. ];
  130. public type
  131. TutlEventType = uutlEventManager.TutlEventType;
  132. TutlEventTypes = uutlEventManager.TutlEventTypes;
  133. TutlMouseButtons = uutlEventManager.TutlMouseButtons;
  134. TutlWinControlEventArgs = uutlEventManager.TutlWinControlEventArgs;
  135. TutlMouseEventArgs = uutlEventManager.TutlMouseEventArgs;
  136. TutlMouseWheelEventArgs = uutlEventManager.TutlMouseWheelEventArgs;
  137. TutlKeyEventArgs = uutlEventManager.TutlKeyEventArgs;
  138. TutlWindowEventArgs = uutlEventManager.TutlWindowEventArgs;
  139. private type
  140. TKeyboardState = record
  141. Modifiers: TShiftState;
  142. KeyState: array[Byte] of Boolean;
  143. end;
  144. TMouseState = record
  145. ScreenPos: TPoint;
  146. ClientPos: TPoint;
  147. Buttons: TutlMouseButtons;
  148. end;
  149. TWindowState = record
  150. Active: Boolean;
  151. ScreenRect: TRect;
  152. ClientWidth: Integer;
  153. ClientHeight: Integer;
  154. end;
  155. private
  156. fKeyboard: TKeyboardState;
  157. fMouse: TMouseState;
  158. fWindow: TWindowState;
  159. procedure HandlerMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  160. procedure HandlerMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  161. procedure HandlerMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);
  162. procedure HandlerMouseEnter (Sender: TObject);
  163. procedure HandlerMouseLeave (Sender: TObject);
  164. procedure HandlerClick (Sender: TObject);
  165. procedure HandlerDblClick (Sender: TObject);
  166. procedure HandlerMouseWheel (Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  167. procedure HandlerKeyDown (Sender: TObject; var Key: Word; Shift: TShiftState);
  168. procedure HandlerKeyUp (Sender: TObject; var Key: Word; Shift: TShiftState);
  169. procedure HandlerResize (Sender: TObject);
  170. procedure HandlerActivate (Sender: TObject);
  171. procedure HandlerDeactivate (Sender: TObject);
  172. protected
  173. procedure RecordEvent(constref aEventArgs: IutlEventArgs); virtual;
  174. function CreateMouseEventArgs(
  175. aControl: TControl;
  176. aType: TutlEventType;
  177. aButtons: TutlMouseButtons;
  178. aClientPos: TPoint): IutlEventArgs; virtual;
  179. function CreateMouseWheelEventArgs(
  180. aControl: TControl;
  181. aDelta: Integer;
  182. aClientPos: TPoint): IutlEventArgs; virtual;
  183. function CreateKeyEventArgs(
  184. aControl: TControl;
  185. aType: TutlEventType;
  186. aKey: Word): IutlEventArgs; virtual;
  187. function CreateWindowEventArgs(
  188. aControl: TControl;
  189. aType: TutlEventType): IutlEventArgs; virtual;
  190. public
  191. property Keyboard: TKeyboardState read fKeyboard;
  192. property Mouse: TMouseState read fMouse;
  193. property Window: TWindowState read fWindow;
  194. procedure DispatchEvent(constref aSender: TObject; constref aEventArgs: IutlEventArgs);
  195. procedure AttachEvents (const aControl: TWinControl; const aTypes: TutlEventTypes);
  196. end;
  197. implementation
  198. uses
  199. LCLIntf, Forms,
  200. uutlKeyCodes, uutlCommon;
  201. type
  202. TWinControlVisibilityClass = class(TWinControl)
  203. published
  204. property OnMouseDown;
  205. property OnMouseMove;
  206. property OnMouseUp;
  207. property OnMouseWheel;
  208. property OnMouseEnter;
  209. property OnMouseLeave;
  210. property OnClick;
  211. property OnDblClick;
  212. end;
  213. TCustomFormVisibilityClass = class(TCustomForm)
  214. published
  215. property OnActivate;
  216. property OnDeactivate;
  217. end;
  218. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  219. //TutlWinControlEventArgs////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  220. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  221. constructor TutlWinControlEventArgs.Create(const aControl: TControl; const aEventType: TutlEventType);
  222. begin
  223. inherited Create;
  224. fControl := aControl;
  225. fEventType := aEventType;
  226. fTimestamp := GetMicroTime / 1000000;
  227. end;
  228. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  229. //TutlMouseEventArgs/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  230. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  231. constructor TutlMouseEventArgs.Create(
  232. const aControl: TControl;
  233. const aEventType: TutlEventType;
  234. const aButtons: TutlMouseButtons;
  235. const aClientPos: TPoint);
  236. begin
  237. inherited Create(aControl, aEventType);
  238. fButtons := aButtons;
  239. fClientPos := aClientPos;
  240. fScreenPos := Control.ClientToScreen(fClientPos);
  241. end;
  242. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  243. //TutlMouseWheelEventArgs////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  244. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  245. constructor TutlMouseWheelEventArgs.Create(
  246. const aControl: TControl;
  247. const aWheelDelta: Integer;
  248. const aClientPos: TPoint);
  249. begin
  250. if (aWheelDelta < 0)
  251. then inherited Create(aControl, TutlWinControlEventManager.EVENT_MOUSE_WHEEL_DOWN)
  252. else inherited Create(aControl, TutlWinControlEventManager.EVENT_MOUSE_WHEEL_UP);
  253. fWheelDelta := aWheelDelta;
  254. fClientPos := aClientPos;
  255. fScreenPos := Control.ClientToScreen(fClientPos);
  256. end;
  257. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  258. //TutlKeyEventArgs///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  259. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  260. constructor TutlKeyEventArgs.Create(
  261. const aControl: TControl;
  262. const aEventType: TutlEventType;
  263. const aCharCode: WideChar;
  264. const aKeyCode: Word);
  265. begin
  266. inherited Create(aControl, aEventType);
  267. fCharCode := aCharCode;
  268. fKeyCode := aKeyCode;
  269. end;
  270. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  271. //TutlWindowEventArgs////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  272. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  273. constructor TutlWindowEventArgs.Create(
  274. const aControl: TControl;
  275. const aEventType: TutlEventType;
  276. const aScreenRect: TRect;
  277. const aClientWidth: Cardinal;
  278. const aClientHeight: Cardinal);
  279. begin
  280. inherited Create(aControl, aEventType);
  281. fScreenRect := aScreenRect;
  282. fClientWidth := aClientWidth;
  283. fClientHeight := aClientHeight;
  284. end;
  285. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  286. //TutlWinControlEventManager/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  287. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  288. procedure TutlWinControlEventManager.HandlerMouseDown(Sender: TObject; Button: TMouseButton;
  289. Shift: TShiftState; X, Y: Integer);
  290. begin
  291. DispatchEvent(self, CreateMouseEventArgs(Sender as TControl, EVENT_MOUSE_DOWN, [Button], Point(X, Y)));
  292. end;
  293. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  294. procedure TutlWinControlEventManager.HandlerMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  295. begin
  296. DispatchEvent(self, CreateMouseEventArgs(Sender as TControl, EVENT_MOUSE_UP, [Button], Point(X, Y)));
  297. end;
  298. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  299. procedure TutlWinControlEventManager.HandlerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  300. begin
  301. DispatchEvent(self, CreateMouseEventArgs(Sender as TControl, EVENT_MOUSE_MOVE, [], Point(X, Y)));
  302. end;
  303. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  304. procedure TutlWinControlEventManager.HandlerMouseEnter(Sender: TObject);
  305. begin
  306. DispatchEvent(self, CreateMouseEventArgs(Sender as TControl, EVENT_MOUSE_ENTER, [], TControl(Sender).ScreenToClient(Controls.Mouse.CursorPos)));
  307. end;
  308. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  309. procedure TutlWinControlEventManager.HandlerMouseLeave(Sender: TObject);
  310. begin
  311. DispatchEvent(self, CreateMouseEventArgs(Sender as TControl, EVENT_MOUSE_LEAVE, [], TControl(Sender).ScreenToClient(Controls.Mouse.CursorPos)));
  312. end;
  313. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  314. procedure TutlWinControlEventManager.HandlerClick(Sender: TObject);
  315. begin
  316. DispatchEvent(self, CreateMouseEventArgs(Sender as TControl, EVENT_MOUSE_CLICK, [], TControl(Sender).ScreenToClient(Controls.Mouse.CursorPos)));
  317. end;
  318. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  319. procedure TutlWinControlEventManager.HandlerDblClick(Sender: TObject);
  320. begin
  321. DispatchEvent(self, CreateMouseEventArgs(Sender as TControl, EVENT_MOUSE_DBL_CLICK, [], TControl(Sender).ScreenToClient(Controls.Mouse.CursorPos)));
  322. end;
  323. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  324. procedure TutlWinControlEventManager.HandlerMouseWheel(Sender: TObject; Shift: TShiftState;
  325. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  326. begin
  327. DispatchEvent(self, CreateMouseWheelEventArgs(Sender as TControl, WheelDelta, MousePos));
  328. Handled := false;
  329. end;
  330. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  331. procedure TutlWinControlEventManager.HandlerKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  332. begin
  333. DispatchEvent(self, CreateKeyEventArgs(Sender as TControl, EVENT_KEY_DOWN, Key));
  334. end;
  335. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  336. procedure TutlWinControlEventManager.HandlerKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  337. begin
  338. DispatchEvent(self, CreateKeyEventArgs(Sender as TControl, EVENT_KEY_UP, Key));
  339. end;
  340. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  341. procedure TutlWinControlEventManager.HandlerResize(Sender: TObject);
  342. begin
  343. DispatchEvent(self, CreateWindowEventArgs(Sender as TControl, EVENT_WINDOW_RESIZE));
  344. end;
  345. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  346. procedure TutlWinControlEventManager.HandlerActivate(Sender: TObject);
  347. begin
  348. DispatchEvent(self, CreateWindowEventArgs(Sender as TControl, EVENT_WINDOW_ACTIVATE));
  349. end;
  350. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  351. procedure TutlWinControlEventManager.HandlerDeactivate(Sender: TObject);
  352. begin
  353. DispatchEvent(self, CreateWindowEventArgs(Sender as TControl, EVENT_WINDOW_DEACTIVATE));
  354. end;
  355. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  356. procedure TutlWinControlEventManager.RecordEvent(constref aEventArgs: IutlEventArgs);
  357. var
  358. mea: TutlMouseEventArgs;
  359. kea: TutlKeyEventArgs;
  360. wea: TutlWindowEventArgs;
  361. function GetPressedButtons: TutlMouseButtons;
  362. begin
  363. result := [];
  364. if (GetKeyState(VK_LBUTTON) < 0) then
  365. result := result + [mbLeft];
  366. if (GetKeyState(VK_RBUTTON) < 0) then
  367. result := result + [mbRight];
  368. if (GetKeyState(VK_MBUTTON) < 0) then
  369. result := result + [mbMiddle];
  370. if (GetKeyState(VK_XBUTTON1) < 0) then
  371. result := result + [mbExtra1];
  372. if (GetKeyState(VK_XBUTTON2) < 0) then
  373. result := result + [mbExtra2];
  374. end;
  375. begin
  376. if Supports(aEventArgs, TutlMouseEventArgs, mea) then begin
  377. fMouse.ClientPos := mea.ClientPos;
  378. fMouse.ScreenPos := mea.ScreenPos;
  379. case mea.EventType of
  380. EVENT_MOUSE_DOWN:
  381. fMouse.Buttons := fMouse.Buttons + mea.Buttons;
  382. EVENT_MOUSE_UP:
  383. fMouse.Buttons := fMouse.Buttons - mea.Buttons;
  384. EVENT_MOUSE_LEAVE:
  385. fMouse.Buttons := [];
  386. EVENT_MOUSE_ENTER:
  387. fMouse.Buttons := GetPressedButtons;
  388. end;
  389. end else if Supports(aEventArgs, TutlKeyEventArgs, kea) then begin
  390. case kea.EventType of
  391. EVENT_KEY_DOWN,
  392. EVENT_KEY_REPEAT: begin
  393. fKeyboard.KeyState[kea.KeyCode and $FF] := true;
  394. case kea.KeyCode of
  395. VK_SHIFT: Include(fKeyboard.Modifiers, ssShift);
  396. VK_MENU: Include(fKeyboard.Modifiers, ssAlt);
  397. VK_CONTROL: Include(fKeyboard.Modifiers, ssCtrl);
  398. end;
  399. end;
  400. EVENT_KEY_UP: begin
  401. fKeyboard.KeyState[kea.KeyCode and $FF] := false;
  402. case kea.KeyCode of
  403. VK_SHIFT: Exclude(fKeyboard.Modifiers, ssShift);
  404. VK_MENU: Exclude(fKeyboard.Modifiers, ssAlt);
  405. VK_CONTROL: Exclude(fKeyboard.Modifiers, ssCtrl);
  406. end;
  407. end;
  408. end;
  409. if ([ssCtrl, ssAlt] - fKeyboard.Modifiers = [])
  410. then include(fKeyboard.Modifiers, ssAltGr)
  411. else exclude(fKeyboard.Modifiers, ssAltGr);
  412. end else if Supports(aEventArgs, TutlWindowEventArgs, wea) then begin
  413. case wea.EventType of
  414. EVENT_WINDOW_ACTIVATE:
  415. fWindow.Active := true;
  416. EVENT_WINDOW_DEACTIVATE:
  417. fWindow.Active := false;
  418. EVENT_WINDOW_RESIZE: begin
  419. fWindow.ScreenRect := wea.ScreenRect;
  420. fWindow.ClientWidth := wea.ClientWidth;
  421. fWindow.ClientHeight := wea.ClientHeight;
  422. end;
  423. end;
  424. end;
  425. end;
  426. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  427. function TutlWinControlEventManager.CreateMouseEventArgs(
  428. aControl: TControl;
  429. aType: TutlEventType;
  430. aButtons: TutlMouseButtons;
  431. aClientPos: TPoint): IutlEventArgs;
  432. begin
  433. result := TutlMouseEventArgs.Create(
  434. aControl,
  435. aType,
  436. aButtons,
  437. aClientPos);
  438. end;
  439. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  440. function TutlWinControlEventManager.CreateMouseWheelEventArgs(
  441. aControl: TControl;
  442. aDelta: Integer;
  443. aClientPos: TPoint): IutlEventArgs;
  444. begin
  445. result := TutlMouseWheelEventArgs.Create(
  446. aControl,
  447. aDelta,
  448. aClientPos);
  449. end;
  450. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  451. function TutlWinControlEventManager.CreateKeyEventArgs(
  452. aControl: TControl;
  453. aType: TutlEventType;
  454. aKey: Word): IutlEventArgs;
  455. begin
  456. if (aType = EVENT_KEY_DOWN) and fKeyboard.KeyState[aKey and $FF] then
  457. aType := EVENT_KEY_REPEAT;
  458. result := TutlKeyEventArgs.Create(
  459. aControl,
  460. aType,
  461. VKCodeToCharCode(aKey, fKeyboard.Modifiers),
  462. aKey);
  463. end;
  464. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  465. function TutlWinControlEventManager.CreateWindowEventArgs(
  466. aControl: TControl;
  467. aType: TutlEventType): IutlEventArgs;
  468. var
  469. p0, p1: TPoint;
  470. begin
  471. with aControl do begin
  472. p0 := ClientToScreen(Point(0, 0));
  473. p1 := ClientToScreen(Point(Width, Height));
  474. end;
  475. result := TutlWindowEventArgs.Create(
  476. aControl,
  477. aType,
  478. Rect(p0.x, p0.y, p1.x, p1.y),
  479. (aControl as TWinControl).ClientWidth,
  480. (aControl as TWinControl).ClientHeight);
  481. end;
  482. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  483. procedure TutlWinControlEventManager.DispatchEvent(constref aSender: TObject; constref aEventArgs: IutlEventArgs);
  484. begin
  485. RecordEvent(aEventArgs);
  486. inherited DispatchEvent(aSender, aEventArgs);
  487. end;
  488. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  489. procedure TutlWinControlEventManager.AttachEvents(const aControl: TWinControl; const aTypes: TutlEventTypes);
  490. var
  491. ctl: TWinControlVisibilityClass;
  492. frm: TCustomFormVisibilityClass;
  493. begin
  494. ctl := TWinControlVisibilityClass(aControl);
  495. // mouse events
  496. if (EVENT_MOUSE_DOWN in aTypes) then ctl.OnMouseDown := @HandlerMouseDown;
  497. if (EVENT_MOUSE_UP in aTypes) then ctl.OnMouseUp := @HandlerMouseUp;
  498. if (EVENT_MOUSE_MOVE in aTypes) then ctl.OnMouseMove := @HandlerMouseMove;
  499. if (EVENT_MOUSE_ENTER in aTypes) then ctl.OnMouseEnter := @HandlerMouseEnter;
  500. if (EVENT_MOUSE_LEAVE in aTypes) then ctl.OnMouseLeave := @HandlerMouseLeave;
  501. if (EVENT_MOUSE_CLICK in aTypes) then ctl.OnClick := @HandlerClick;
  502. if (EVENT_MOUSE_DBL_CLICK in aTypes) then ctl.OnDblClick := @HandlerDblClick;
  503. if (EVENT_MOUSE_WHEEL_DOWN in aTypes) or
  504. (EVENT_MOUSE_WHEEL_UP in aTypes) then ctl.OnMouseWheel := @HandlerMouseWheel;
  505. // key events
  506. if (EVENT_KEY_DOWN in aTypes) then ctl.OnKeyDown := @HandlerKeyDown;
  507. if (EVENT_KEY_UP in aTypes) then ctl.OnKeyUp := @HandlerKeyUp;
  508. // window events
  509. if (EVENT_WINDOW_RESIZE in aTypes) then begin
  510. ctl.OnResize := @HandlerResize;
  511. fWindow.ClientWidth := ctl.ClientWidth;
  512. fWindow.ClientHeight := ctl.ClientHeight;
  513. end;
  514. if (aControl is TCustomForm) then begin
  515. frm := TCustomFormVisibilityClass(aControl);
  516. frm.KeyPreview := true;
  517. if (EVENT_WINDOW_ACTIVATE in aTypes) then frm.OnActivate := @HandlerActivate;
  518. if (EVENT_WINDOW_DEACTIVATE in aTypes) then frm.OnDeactivate := @HandlerDeactivate;
  519. end;
  520. end;
  521. end.