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.

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